Blink without delay

Hallo zusammen,

Ich möchte eine Ampel nachbauen, die wie eine echte im Straßenverkehr läuft (mit blinken und allem)
Ich habe ein Node MCU Board auf dem ein Sketch (im Anhang) läuft der drei Relais schaltet, welche jeweils eine Glühbirne schalten. (habe das bisher mit Delay realisiert)
Jetzt sollten aber über die Blink App noch ein oder zwei Inputs in form von Schaltern kommen.
Das führt dazu das mit Delay nichts mehr läuft.
Diesen Code mit mit millis zu machen ist denke ich sehr aufwendig habt ihr ne Idee?
Vielen Dank! :wink:

Ampel.ino (1004 Bytes)

Hallo Joe,

Wenn das jetzt eine versteckte Aufforderung "kann mir das jemand programmieren ist" darauf steige ich nicht ein.

nein es ist nicht aufwendig mit millis()
Delay funktioniert so:

STOPPE alle Aktivität und warte bis Zeit vergangen ist.

Die Grundidee hinter millis() ist

mache alles mögliche aber auch überprüfe 1000 mal in der Sekunde
if (Zeit-Intervall-ist-vorbei) {
dann mach was
}

Das kannst du dir vorstellen wie Nudeln kochen und während die Nudeln vor sich hinkochen machst du noch einen Salat oder die Soße usw.

Du bringst Wasser zum Kochen. Wenn du die Nudeln ins heiße Wasser gibst schaust du auf die Uhr

13:00
Auf der Packung steht 12 Minuten Kochzeit

Ein Programm macht das dann so

Es schaut unheimlich oft auf die Uhr und berechnet wie viel Zeit seit einem Startmoment schon vergangen ist
13:00 - 13:00 = 0 Minuten ist kleiner als 12
13:01 - 13:00 = 1 Minuten ist kleiner als 12
13:02 - 13:00 = 2 Minuten ist kleiner als 12
13:03 - 13:00 = 3 Minuten ist kleiner als 12
13:04 - 13:00 = 4 Minuten ist kleiner als 12
13:05 - 13:00 = 5 Minuten ist kleiner als 12
13:06 - 13:00 = 6 Minuten ist kleiner als 12
13:07 - 13:00 = 7 Minuten ist kleiner als 12
13:08 - 13:00 = 8 Minuten ist kleiner als 12
13:09 - 13:00 = 9 Minuten ist kleiner als 12
13:10 - 13:00 =10 Minuten ist kleiner als 12
13:11 - 13:00 =11 Minuten ist kleiner als 12
13:12 - 13:00 =12 Minuten ist GLEICH 12 ==> mach was nämlich Topf vom Herd nehmen

Nur das das Programm das nicht einmal pro Minute macht sondern tausende male pro Sekunde.
Da fühlt sich der Microcontroller sau-wohl das er endlich mal ordentlich was zu tun hat.

Als Programm sieht das dann ungefähr so aus

currentMillis = mills();
if (previousMillis - currentMillis >= 12 ){
  previousMillis = currentMillis
  mach was getimtes
}

Hier ist ein vergleichsweise kompatktes Tutorial dazu
baldengineers: millis() Tutorial: Arduino Multitasking

Damit kriegst du 100% realistisches verhalten hin
inklusive gelb blinken kurz bevor es auf rot umschaltet.

viele Grüße Stefan

joe_11:
ein Sketch (im Anhang)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar und Du hast mehr Helfer.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

@TO: Evtl. hilft Dir auch das Tutorial von Rentner weiter.

Gruß Tommy

Damit kriegst du 100% realistisches verhalten hin

Realistisches Verhalten von SIEMENS-Ampeln nachbilden ist schon einigermaßen aufwendig: Eine Fußgänger-Anforderung muss x Sekunden, bevor im Ablauf die Fußgänger-Phase startet oder eben übersprungen wird, gedrückt sein, sonst kommt sie erst das übernächste Mal dran. :slight_smile:

Auch das geht natürlich mit dem BlinkWithoutDelay - Prinzip.

Ich habe hier mal ein Tutorial für meine Moba-Kollegen geschrieben, in dem auch eine Ampelkreuzung als Beipiel genutzt wird. Das ist zwar etwas vereinfacht gemacht, lässt sich aber rel. leicht aufbohren für eine komplexere Ampelsteuerung.

Hallo,

Leute, der TO muss erstmal das Anwenden von millis verstehen. Ansonsten werden eure nett gemeinten Beispiele oder fertiger Code nur verwendet aber nicht verstanden.

Deswegen:
Theseus erklärt millis()

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung

michael_x:
Realistisches Verhalten von SIEMENS-Ampeln nachbilden ist schon einigermaßen aufwendig: Eine Fußgänger-Anforderung

Bevor der Fussgänger auch nur irgendwie rankommt, braucht es gelb.
https://www.adac.de/verkehr/recht/verkehrsvorschriften-deutschland/ampel/
"Wie lange dauert die Gelbphase?"

Ansonsten stimme ich Doc_Arduino zu - Der TO hat vermutlich falsche Vorstellungen von der "Einfachheit der Lösung"