Locking Out a Push Button from being pressed for a selected delay[SOLVED]
i have program cycles relay either after select-able amount of waiting time (dumptime) or push button. trying "lock out" push button cycling relay having selected amount of delay time (lot)from 0 20 secs. i'd ideally:
- dumptime timer ends or push button activated
- relay cycles
- if there selected lot delay time, @ point wait lot , "lock out" (i using lok lock bit) logic accepting button press time.
- after lot delay time, unlock push button , wait either press of dumptime timer end.
so after clean end code below, still doesn't work right. if other value 0 read a2 (analog input 2) seems cycle through process twice after each button press. lot being 5000 or 5 seconds, cycles, waits 5 secs, , instead of resetting led , waiting new button press, cycles second time, waits 5 secs, resets led. keep getting stuck in cycle , resetting.
can define better way "lock out"? dumptime selection portion , rest works fine. i'm racking brain on "lock out" logic...
- dumptime timer ends or push button activated
- relay cycles
- if there selected lot delay time, @ point wait lot , "lock out" (i using lok lock bit) logic accepting button press time.
- after lot delay time, unlock push button , wait either press of dumptime timer end.
so after clean end code below, still doesn't work right. if other value 0 read a2 (analog input 2) seems cycle through process twice after each button press. lot being 5000 or 5 seconds, cycles, waits 5 secs, , instead of resetting led , waiting new button press, cycles second time, waits 5 secs, resets led. keep getting stuck in cycle , resetting.
can define better way "lock out"? dumptime selection portion , rest works fine. i'm racking brain on "lock out" logic...
code: [select]
#define dump 2 // pin connected big dump relay
#define button 3 // pin connected manual dump push button.
#define buttonlight 4 // pin connected push button light.
#define delay 50 // debounce time
int butstate; // current reading button pin
int lastbutstate = low; // previous reading button pin
long lastdebounce = 0; // last time output changed
unsigned long dumptime;
unsigned long lot;
unsigned long prevtime;
int lok = 0;
int readtselector(int pin)
// returns button number pressed, or 0 none pressed
// int pin analog pin number read
{
int c = analogread(pin); // analog value
if (c > 1000){
return 0; // buttons have not been pressed
}
else if (c<1000 && c>600){
return 1; // button 1 pressed
}
else if (c<520 && c>400){
return 2; // button 2 pressed
}
else if (c>100 && c<400){
return 3; // button 3 pressed
}
else if (c<100){
return 4; // button 4 pressed
}
else return 0; // in case
}
long dtselect()
{
switch(readtselector(1)){
case 0: return 210000; // no buttons pressed
break;
case 1: return 180000; // pressed button!
break;
case 2: return 150000;
break;
case 3: return 120000;
break;
case 4: return 90000;
break;
default: return 210000; // default
break;
}
}
int loselect()
{
switch( readtselector(2) ){
case 0: return 20000; // no buttons pressed
break;
case 1: return 15000; // pressed button!
break;
case 2: return 10000;
break;
case 3: return 5000;
break;
case 4: return 0;
break;
default: return 0; // default
break;
}
}
void setup()
{
pinmode(a1, input);
pinmode(a2, input);
pinmode (button, input);
pinmode (buttonlight, output);
pinmode (dump, output);
digitalwrite(dump, high);
delay(10000);
digitalwrite(dump, low);
digitalwrite(buttonlight, high);
}
void loop()
{
dumptime = dtselect();
lot = loselect();
int reading = digitalread(button);
unsigned long currtime = millis();
if ((currtime - prevtime) >= dumptime){// count 2 minutes
lok = 1;
digitalwrite(buttonlight, low);
digitalwrite(dump, high);
delay(10000);
digitalwrite(dump, low);
prevtime = currtime;
}
if (reading != lastbutstate){
lastdebounce = millis();
}
if (lok == 1){
delay(lot);
digitalwrite(buttonlight, high);
lok = 0;
}
if ((millis() - lastdebounce) > delay && lok == 0){
butstate = reading;
}
if (butstate == high){
digitalwrite(buttonlight, low);
digitalwrite(dump, high);
delay(10000);
digitalwrite(dump, low);
prevtime = currtime;
}
lastbutstate = reading;
}
quote
can define better way "lock out"?don't use delay() start unless want program stall period of delay()
you need using millis() timing in blinkwithoutdelay example , several things @ same time
save time event happens, each time through loop() check whether required period has elapsed since event. if not go round loop() again reading inputs etc. if period has elapsed take required action.
Arduino Forum > Using Arduino > Programming Questions > Locking Out a Push Button from being pressed for a selected delay[SOLVED]
arduino
Comments
Post a Comment