Zum Inhalt springen

Ein-und Ausschaltverzögerung mit Modulo-Trick

Projekte und Tutorials für Arduino Foren StartHardware-Forum Ein-und Ausschaltverzögerung mit Modulo-Trick

Ansicht von 2 Beiträgen - 1 bis 2 (von insgesamt 2)
  • Autor
    Beiträge
  • #8269 Antworten
    Tapsi
    Gast

    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!
      }
    }
    
    #8284 Antworten
    Stefan Hermann
    Administrator

    Hi 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 :-)

Ansicht von 2 Beiträgen - 1 bis 2 (von insgesamt 2)
Antwort auf: Antwort #8284 in Ein-und Ausschaltverzögerung mit Modulo-Trick
Deine Information: