Knopfdruckaktion auf der Modellbahn

Hallo,
bin neu hier. Habe auch bisher kaum Programmierkenntnisse und hoffe auf Unterstützung.

Aufgabenstellung:
Ein Taster soll einen Ausgang meines Arduino Nano schalten, und nach 60 Sekunden wieder ausschalten.

Einfache Lösung:

int pinEingang = 3;
int pinAusgang = 13;

void setup() {
pinMode(pinEingang, INPUT_PULLUP);
pinMode(pinAusgang, OUTPUT);
}

void loop() {
int zustand = digitalRead(pinEingang);
if (zustand == HIGH) {
   digitalWrite(pinAusgang, LOW);      //Normalzustand - Ausgang AUS
   } else {
   digitalWrite(pinAusgang, HIGH);
   delay(60000);
   digitalWrite(pinAusgang, LOW);
}
}

Nun soll die Aufgabenstellung erweitert werden. Wenn innerhalb der 60 Sekunden der Taster erneut gedrückt wird, dann soll der Ausgang ebenfalls ausgeschaltet werden.

Dazu muss die Funktion "delay" ersetzt werden, da der Arduino sonst hier für 60 Minuten "einfriert" und es muss mittels einer weiteren If-Schleife der Tasterzustand abgefragt werden, während der Ausgang eingeschaltet ist.

Wer kann mir hier helfen?

danke und vG
Uwe

Entweder Deine Beschreibung ist falsch oder Deine Schlussfolgerung.

Nun soll die Aufgabenstellung erweitert werden. Wenn innerhalb der 60 Sekunden der Taster erneut gedrückt wird, dann soll der Ausgang ebenfalls ausgeschaltet werden.

Da brauchst Du Deinen Sketch nicht zu ändern, der 2. Tastendruck wird, wie beschrieben, ignoriert.

Gruß Tommy

O.K., ich formuliere die Aufgabe anders:

Mittels eines Taster soll ein Ausgang des Arduino für 60 Sekunden (Timer) eingeschaltet werden. Der Ausgang soll abgeschaltet werden, wenn

  • entweder die 60 Sekunden abgelaufen sind, oder
  • wenn vorher der Taster ein zweites Mal betätigt wird (Abbruch des Timers)

vG Uwe

Damit läßt sich was anfangen.

Du brauchst folgende Zutaten für Dein Programm:

  • Tastenentprellen
  • Flankenerkennung
  • nicht blockierende Zeitmessung

Das könnte so aussehen:

const byte pinEingang = 3;
const byte pinAusgang = 13;
const uint32_t prellIntervall = 30, ausgangIntervall = 5000;
uint32_t aktMillis, prellMillis, ausgangMillis;
bool aktTaster, altTaster, ausgangStatus;

void setup() {
  pinMode(pinEingang, INPUT_PULLUP);
  pinMode(pinAusgang, OUTPUT);
}

void loop() {
  aktMillis = millis();
  // Tastenaktualisierung mit Entprellen
  altTaster = aktTaster;
  if (aktMillis - prellMillis >= prellIntervall)
  {
    prellMillis = aktMillis;
    aktTaster = digitalRead(pinEingang);
  }
  // Tasteraktion
  if (altTaster && !aktTaster)  // Flankenerkennung Taster gedrückt, LOW aktiv
  {
    if (ausgangStatus)
    {
      ausgangStatus = LOW;
      digitalWrite(pinAusgang, LOW);      // Ausgang AUS durch Tastendruck
    } else {
      ausgangMillis = aktMillis;
      ausgangStatus = HIGH;
      digitalWrite(pinAusgang, HIGH);      // Ausgang EIN durch Tastendruck
    }
  }
  // Ausgang schalten
  if (ausgangStatus && (aktMillis - ausgangMillis >= ausgangIntervall))
  {
    digitalWrite(pinAusgang, LOW);       // Ausgang AUS durch Zeit
    ausgangStatus = LOW;
  }
}

Perfekt, vielen Dank!

Gr. Uwe

Da für die Verzögerung fürs Tastenentprellen 5-10mS reichen, kann da bei dieser Vorgabe ohne Probleme ein delay() verwendet werden.

delay() sind nicht immer schlecht. Wenn die Anforderungen des Sketches es erlauben ist ein delay() auch eine Lösung.

Grüße Uwe