Projekte und Tutorials für Arduino › Foren › StartHardware-Forum › Ein-und Ausschaltverzögerung mit Modulo-Trick
- Dieses Thema hat 1 Antwort und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 1 Jahr von .
-
AutorBeiträge
-
TapsiGast
Liebe Arduino-Gemeinde
Ich habe ein Problem mit einem eigentlich ganz einfachen Sketch, vielleicht kann mir ja jemand weiterhelfen?
Ich möchte mit dem Modulo-Trick (https://starthardware.org/timer-mit-arduino-alternative-zu-delays/)
eine Ein- und Ausschaltverzögerung basteln.
Die Routine sollte nur einmal durchlaufen, dh. nur einmal verzögert einschalten und nach einer gewissen Zeit wieder ausschalten. Für diese Funktion habe ich eine bool-Variable ins Spiel gebracht. (Routine läuft nur bei LOW und wird nach einem Durchlauf auf HIGH gesetzt. Sobald ich aber den Variablenzustand im loop ändern möchte (im Sketch mit Pfeil markiert), läuft der Sketch nicht mehr! Vielleicht gibt es auch eine andere elegante + schlanke Lösung?
Was mache ich nur falsch? An welcher Position muss ich die Var. auf HIGH ändern? Vielen Dank für eure Hilfe
Mein Sketch:/* Auslösung Alarmhorn mit dem Modulo-Trick nach: https://starthardware.org/timer-mit-arduino-alternative-zu-delays/ Das akustische Alarmhorn wird verzögert eingeschaltet (Zeitaus) und durch die Variable: (Zeitein) begrenzt. Dieser Vorgang darf nur 1x ausgeführt werden und wird durch Var:(einmal) beschränkt. */ int Buzzer = 2; // Alarmhorn bool einmal = LOW ; int Zeitein = 5000; // Ein-Zeit = (Zeit + Zeitaus) int Zeitaus = 4000; // Einschaltverzögerung (muss < Zeitein sein!) void setup() { pinMode(Buzzer, OUTPUT); } void loop() { if ((millis() % Zeitein > Zeitaus) && einmal == LOW) { digitalWrite(Buzzer, HIGH); //=====> einmal = HIGH ; //=====> funktionirt nicht! } else { //=====> einmal = HIGH ; //=====> funktionirt nicht! digitalWrite(Buzzer, LOW); //=====> einmal = HIGH ; //=====> funktionirt nicht! } }
Stefan HermannVerwalterHi Tapsi,
danke für deine Mail. Irgendwie ist der Post im Spam-Folder gelandet. Diese Forumssoftware ist sehr eigen, wenn man Links einsetzt.
Zu deiner Frage: Der Ansatz ist nicht schlecht, aber der Modulo-Trick ist hier schwer einzusetzen, weil der eher für Wiederholungen gedacht ist. Ich schlage vor, einfach eine Einschaltzeit zu setzen und eine Einschaltdauer festzulegen. Die Einschaltzeit kannst du ja auch später neu festlegen, z. B. wenn du einen Button drückst: if (digitalRead(button)==LOW) Zeitein = millis(); // Hierbei sollte Zeitein aber nicht als int, sondern als long deklariert werden.
Ansonsten versuche das mal:
int Buzzer = 2; // Alarmhorn int Zeitein = 4000; // Ein-Zeit = (Zeit + Zeitaus) int Dauer = 1000; // Einschaltverzögerung (muss < Zeitein sein!) void setup() { pinMode(Buzzer, OUTPUT); } void loop() { if ((millis()>Zeitein)&&(millis() < Zeitein+Dauer)) { digitalWrite(Buzzer, HIGH); } else { digitalWrite(Buzzer, LOW); } }
Hier noch die Variante mit Taster:
int Buzzer = 2; // Alarmhorn int Button = 13; int ButtonZeitverzoegerung = 1000; long Zeitein = 4000; // Ein-Zeit = (Zeit + Zeitaus) int Dauer = 1000; // Einschaltverzögerung (muss < Zeitein sein!) void setup() { pinMode(Buzzer, OUTPUT); pinMode(Button, INPUT_PULLUP); } void loop() { if (digitalRead(Button)==LOW) Zeitein = millis()+ButtonZeitverzoegerung; if ((millis()>Zeitein)&&(millis() < Zeitein+Dauer)) { digitalWrite(Buzzer, HIGH); } else { digitalWrite(Buzzer, LOW); } }
Liebe Grüße :-)
-
AutorBeiträge