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...


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

Popular posts from this blog

DHT11 Time out error using v0.4.1library

Sketch upload fails with Java error (___REMOVE___/bin/avrdude)!

Arduino Uno + KTY81/210 temperature sensor