Couuntdown timer mit Pause

Hallo leute ,

habe seit 1 Woche einen Arduino Uno, habe zwei drei Sachen ausprobiert, habe feststellen müssen das mein Plan nicht mit delay aufgeht. Folgendes vorhaben:

wird ein Taster gedrückt soll für eine bestimmte Zeit ein Pin HIGH bleiben, wird der Taster erneut gedrückt (inerhalb der Zeit) soll die zeit stehen bleiben und der Pin LOW gesetzt werden und bei erneutem drücken den ablauf der Zeit fortsetzen und das ganze belibig oft inerhalb der Zeit. Also Zeit ca. 20 sec. und wenn der Taster nicht erneut gedrückt wird läuft die halt ab, und inerhalb der 20 sec. kann ich belibig oft anhalten und weiter laufen lassen.

Wer hat ein Rat oder ein Beispiel für mich welches ich verarbeiten kann?

Danke im vorraus

Du wirst das mit millis lösen können. Im Web findest du einige Beiträge darüber.

Evtl. hilft dir das hier schon weiter.

http://forum.arduino.cc/index.php?topic=45292.0

Endlicher Automat, 3 Zustände.

Alles mit if, millis und switch case.

Viel mehr brauchste nicht. Und ist blockierungsfrei. Evtl. ein superkurzes delay zum manuell entprellen. Das kommt jedoch auf die Qualität deines Tasters an.

ElEspanol: Endlicher Automat, 3 Zustände.

const byte ledPin = 13;
const byte tasterPin = 2;
unsigned long aktMillis, altMillis;
const unsigned int zeit = 20000;
bool aktTaster, altTaster;
enum Zustaende {WARTEN, TOGGLE, FERTIG};
byte zustand = WARTEN;

void setup () {
  pinMode(ledPin, OUTPUT);
  pinMode(tasterPin, INPUT_PULLUP);
  aktTaster = !digitalRead(tasterPin);
  altTaster = aktTaster;
}

void loop()
{
  aktTaster = !digitalRead(tasterPin);
  aktMillis = millis();
  switch (zustand) {
    case WARTEN:
      if (aktTaster && !altTaster) {
        digitalWrite(ledPin, HIGH);
        altMillis = aktMillis;
        zustand = TOGGLE;
      }
      break;
    case TOGGLE:
      if (aktMillis - altMillis >= zeit) {
        digitalWrite(ledPin, LOW);
        zustand = FERTIG;
      } else if (aktTaster && !altTaster) {
        digitalWrite(ledPin, !digitalRead(ledPin));
      }
      break;
    case FERTIG:
      break;
  }
  altTaster = aktTaster;
  delay(30);  // Taster entprellen
}

Schöner Sketch, aber wo bleibt da der Lerneffekt für Johnny555?

ElEspanol:
Schöner Sketch, aber wo bleibt da der Lerneffekt für Johnny555?

Ich habe am meisten durch die fertigen Sketche von jurs gelernt und ich gehe bei so einer Fragestellung davon aus, daß es sich um ein Teilproblem handelt, das in ein größeres Projekt intergriert werden soll. Spätestens an der Stelle ist dann der Lerneffekt gegeben, das hoffe ich zumindest. Außerdem frage ich mich natürlich, ob ich einem erwachsenen Menschen vorschreiben will, wie er lernt. Er kann sich meinen Sketch ansehen, muß es aber nicht. Aber er hat ja explizit nach einem Beispiel gefragt.

Bei Schul- oder Universitätsprojekten halte ich mich aber extrem zurück, da ich die Note nicht gefährden möchte.

Danke für den Sketch agmue, gibts irgendwo eine Seite im Netz wo alle Befehle mit Erklerungen am besten in deutsch aufgelistet sind ? Was bedeutet bei der Zeitangabe unsignet denn die Zeit läuft ab auch wenn das leuchten der Led mit dem Taster unterbrochen wird? Und kann das ganze von vorne gestartet werden ohne den Arduino Sannungsfrei zu machen ? Ich fummel noch ein wennig hier.

MfG

Johny555: Danke für den Sketch agmue,

Bitte gerne :)

Johny555: gibts irgendwo eine Seite im Netz wo alle Befehle mit Erklerungen am besten in deutsch aufgelistet sind?

Ich schaue bei der Referenz.

Johny555: Was bedeutet bei der Zeitangabe unsignet

Ohne Vorzeichen, also von 0 aufwärts.

Johny555: Und kann das ganze von vorne gestartet werden ohne den Arduino Sannungsfrei zu machen ?

Reset-Taste am Arduino drücken. Oder Du erweiterst den Sketch um eine solche Bedingung, wo dann zustand = WARTEN; gesetzt wird.

Johny555: Ich fummel noch ein wennig hier.

Viel Spaß dabei :)

Johny555: denn die Zeit läuft ab auch wenn das leuchten der Led mit dem Taster unterbrochen wird MfG

Dafür auch eine Antwort ???

Während einer Zeit von 20 Sekunden kann mittels Taster die LED beliebig häufig ein und ausgeschaltet werden. Wolltest Du was anderes?

Eigentlich ja, ich wollte sehr gerne das ich die Zeit von 20 sec. belibig oft anhalten kann, ich versuche es mal zu erklären: Ich habe ein Cabrio, das Verdeck ist elektrisch, es braucht ca. 20 sec. bis es komplett offen ist dafür muss ich eine Taste festhalten, in der Zeit will ich mich aber anschnallen. Also könte doch der Arduino für mich die Taste halten, aber den Vorgang will ich auch anhalten( man weißnja nie) aber das Dach soll ja in den Kofferraum. Relais wird natürlich verwendet, Verkabelung ist nicht das Problemm.

Danke

MfG

Das kannst du dvtl. einfacher haben.

Was passiert denn, wenn du den Verdeckknopf länger drückst?

im Display steht ok un das wars eigentlich, danach kann ich halten so lange wie ich will, es ist aber ein Wiptaster. Und im Auto will ich alles lassen so vie es ist fals möglich, ist jetzt aber zu kalt um zu forschen. Das ganze möchte ich auch für Dach zu machen fals es klappt. Warum was hast du im Angebot ? :)

ganz einfach. Taster drücken, 20 sec. fangen an zu laufen. Wenn während dessen noch mal gedrückt wird, aus.

Fertig.

Weil wenn du z.b. nach 18 Sekunden anhälst, und dann wieder startest, beginnt die Zeit neu mit 20 Sekunden, dann bleibt halt der "Knopf" noch 18 Sekunden gedrückt, auch wenn das Dach schon offen ist. Aber wie du sagst, ist das ja egal.

Und es kommt in keinen undefinierten Zustand.

Variante mit 20 Sekunden Cabriodachgesamtöffnungszeit:

const byte ledPin = 13;
const byte tasterPin = 2;
unsigned long aktMillis, altMillis, deltaMillis;
const unsigned int zeit = 20000;
bool aktTaster, altTaster;
enum Zustaende {WARTEN, AN, AUS, FERTIG};
byte zustand = WARTEN;

void setup () {
  pinMode(ledPin, OUTPUT);
  pinMode(tasterPin, INPUT_PULLUP);
  aktTaster = !digitalRead(tasterPin);
  altTaster = aktTaster;
}

void loop()
{
  aktTaster = !digitalRead(tasterPin);
  aktMillis = millis();
  switch (zustand) {
    case WARTEN:
      if (aktTaster && !altTaster) {
        digitalWrite(ledPin, HIGH);
        altMillis = aktMillis;
        zustand = AN;
      }
      break;
    case AN:
      if (aktMillis - altMillis >= zeit) {
        digitalWrite(ledPin, LOW);
        zustand = FERTIG;
      } else if (aktTaster && !altTaster) {
        digitalWrite(ledPin, LOW);
        deltaMillis = aktMillis - altMillis;
        zustand = AUS;
      }
      break;
    case AUS:
      if (aktTaster && !altTaster) {
        digitalWrite(ledPin, HIGH);
        altMillis = aktMillis - deltaMillis;
        zustand = AN;
      }
      break;
    case FERTIG:
      break;
  }
  altTaster = aktTaster;
  delay(30);  // Taster entprellen
}

Wenn du den "AUF"-Taster durch ein relais ersetzt, hast du schon überlegt, was passiert, wenn du während des Öffnungsvorgangs versehentlich den "ZU"-Taster drückst?

Wäre evtl. sinnvoll, den mit einem zweiten NC Relaiskontakt zu verriegeln.

Viel spannender ist ja: Wenn man sich den Hals im Schiebedach (ab)klemmt, kommt man dann noch an den STOPP Knopf?

combie: Viel spannender ist ja: Wenn man sich den Hals im Schiebedach (ab)klemmt, kommt man dann noch an den STOPP Knopf?

Danke für die Fürsorge, aber erstens gehts um kein Schiebedach und zweitens ums Auf.

Und das mit dem Zu knopf kann man ja über ein Öfner kontakt mit einem weiteren Relais lösen.

Und das ganze ist erstmal Theorie.

Danke

Ich habe seit Jahren sowas ähnliches für die 4 Scheiben im Cabrio. Zentralschalter für rauf und runter, hinten und vorne zeitversetzt. Man muss 3 Sekunden den taster drücken, damit sie anfangen zu laufen. Das ganze noch mit Komfortschaltung für die einzelnen Scheiben. Funktioniert einwandfrei. Wenn was klemmt, wird automatisch abgeschaltet (aber nicht zurückgefahren, man soll ja auch ein Messer nicht aus der Wunde ziehen :slight_smile: ).
Leider hat das Auto als Klassiker kein elektrisches Verdeck.

ich muss noch viel lesen