Zeitverzögertes ausschalten

Hallo Zusammen..

Ich würde via Tastendruck gern eine Anlage kontrolliert ausschalten und ein "Versehen" des Bedieners ausschließen.

Das Gaze soll ungefähr so ablaufen:
Taste drücken & ca 5 Sek gedrückt halten.
Während des Tastendrucks soll im I2C-LCD Display der 5 Sek Timer / Ladebalken runter- bzw durchlaufen.
Wird die Taste losgelassen bevor die Zeit abgelaufen ist, soll dort die Meldung "abgebrochen" erscheinen kurz stehen bleiben und dann wieder in den normalen betrieb wechseln..
Wenn die Taste gedrückt bleibt und der Timer abgelaufen ist soll ein Pin auf LOW gesetzt werden, was die Anlage dann letztendlich ausschaltet...

Mein Ansatz dazu ist dieser hier:

void power_off()
 {
  int off_time_delay = 5000;
  lcd.clear();
  lcd.backlight();
  // show message on Screen "Press and hold to power off"
  // show loadbar on Screen while the bar is run to 100% in 5 Sec
  // after the time (and button is still pressed) Show message on Screen "Powering off" otherwise show "abgebrochen"
  // Wait another 2 Seconds and switch off Main_SSR
  unsigned long off_cur_millis=millis();
  
  if(digitalRead(ausschalten) == LOW && millis()-off_cur_millis <= off_time_delay)
   {
    lcd.setCursor(0,0);
    lcd.print("Zum ausschalten");
    lcd.setCursor(0,1);
    lcd.print("taste ");
    lcd.print(off_time_delay/1000);
    lcd.print("s halten");
    int prozent = map(millis(), off_cur_millis, off_time_delay+off_cur_millis, 0, 101);
    draw_progressbar(prozent);
    led_blink(ausschalten_led);
    if(prozent == 100)
     {
      digitalWrite(Main_SSR, LOW);
     }
    else
     {
      lcd.setCursor(4,2);
      lcd.print(" abgebrochen ");
     }
    //delay(2000);
   }
  //lcd.clear();
 }

Aufgerufen wird die Funktion im Loop via

if(digitalRead(ausschalten) == LOW)
 {
  power_off();
}

Ach ja: der Taster ist mit INPUT_PULLUP definiert..

LG..

Das ist nur eine Funktion. Wie sieht dein Loop aus?

kannst du deine 4 (?) Stati in einem Diagramm zeichne damit klar ist was du wirklich willst?

  • a: warten auf Tastendruck "Normalbetrieb"
  • b: taste wird gedrückt --> Zeit Messen und prüfen ob 5 Sekunden um sind (soll in diesen 5 Sekunden schon irgendwas passieren außer der Balkenanimation?)
  • c: Taste wurde vor 5 Sekunden losgelassen, eine Meldung ausgeben (spezifiziere was für dich "kurz" ist)
  • d: nach 5 Sekunden soll ein Pin auf LOW gesetzt werden (durch welchen Status wurde dieser HIGH gesetz???)

Beschreibe exakt was in jedem Status passieren soll.
Beschreibe exakt wodurch jeder Status beendet wird - sei es Zeitablauf oder eine bestimmte Aktion.
Beschreibe exakt was nach einem Status der nächste neue Status ist.

Ich denke du sollst dir das Konzept einer Status Maschine anschauen - Englisch "finite state machine" - da gibt es reichlich Lesestoff.

Sowas?

const byte tastePin = 2;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(tastePin, INPUT_PULLUP);
}

void loop()
{
  fuenfSekundenTaste();
}

void fuenfSekundenTaste()
{
  const unsigned long sperrzeit = 5000;
  static unsigned long startMillis = 0;
  bool tastenmerker = false;
  if (!digitalRead(tastePin)) // taste gedrückt
  {
    if (!tastenmerker)   // vorher nicht gedrückt?
    {
      startMillis = millis(); // Merke die Zeit
      tastenmerker = true;    // Merke gedrückt
    }
  }
  else
  {
    tastenmerker = false;   // Wenn nicht gedrückt, dann merk dir das auch nicht
  }

  if (tastenmerker) // Taste gedrückt??
  {
    if (millis() - startMillis < sperrzeit) // Zeit nicht abgelaufen, aber Taste gedrückt ?
    {
      // funktion LCD-Balken
    }
    else // Zeit abgelaufen und noch immer Taste gedrückt?
    {
      // aktion
    }
  }
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.