Ampelschaltung mit Millis

Hey, ich würde gerne meine Ampel mit zwei Buttons versehen wo davon einer alles abschaltet und der andere dann alles wieder anschaltet.
Da das mit Delay aber nicht funktioniert wollte ich fragen ob mir das jemand auf Millis umändern kann oder mir erklären kann wie ich es selbst mache?
Der Code:

  #define RED 5
  #define YELLOW 6
  #define GREEN 9
  #define buttonApin 12 
  #define buttonBpin 13

void setup() {
  pinMode(RED, OUTPUT);
  pinMode(YELLOW, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(buttonApin, INPUT_PULLUP);  
  pinMode(buttonBpin, INPUT_PULLUP);
  
}

void loop() {
  if (digitalRead(buttonApin) == LOW)
  {
    digitalWrite(GREEN, HIGH);
  }
  if (digitalRead(buttonBpin) == LOW)
  {
    digitalWrite(GREEN, LOW)
  }
  digitalWrite(GREEN, HIGH);
  delay(10000);
  digitalWrite(GREEN, LOW);
  delay(500);
  digitalWrite(GREEN, HIGH);
  delay(500);
  digitalWrite(GREEN, LOW);
  delay(500);
  digitalWrite(GREEN, HIGH);
  delay(500);
  digitalWrite(GREEN, LOW);
  delay(500);
  digitalWrite(GREEN, HIGH);
  delay(500);
  digitalWrite(GREEN, LOW);
  delay(500);
  digitalWrite(GREEN, HIGH);
  delay(500);
  digitalWrite(GREEN, LOW);
  digitalWrite(YELLOW, HIGH);
  delay(5000);
  digitalWrite(YELLOW, LOW);
  digitalWrite(RED, HIGH);
  delay(10000);
  digitalWrite(YELLOW, HIGH);
  delay(4000);
  digitalWrite(YELLOW, LOW);
  digitalWrite(RED, LOW);


}

Hallo,
und warum soll die Grüne LED so oft blinken ?

Also eigentlich ist die Denke bei Verwendung von millis() etwas anders. Das kann man nicht so einfach mit delay vergleichen.
bei der Verwendung von millis() wird immer nachgesehen ob eine Zeit bereits vergangen ist. Wenn ja mach was.

Es gibt ein gutes Beispiel in der IDE dazu "BlinkWithoutDelay" und die Erklärung zum Nachtwächter hier im Forum. Für Ampeln gibt es sicher unzählige Beispiele. Such mal nach Schrittkette, Statemaschine, Endlicher Automat.

Ampelschaltung war schon oft im Forum, mall die Forum suche beschäftigen.

schau dir einfach das Beispiel "Blink Without Delay" an. So funktioniert es mit nicht blockierenden Aktivitätten die nacheinander abgearbeitet werden sollen.

Wenn du eine Verkehrsampel mit Österreichischem Ablauf /grün blinken machen willst, kannst du auch einfach meinen Toolkit für LEDs verwenden, da ist das schon - nicht blockierend / mit millis() - fertig.

https://werner.rothschopf.net/microcontroller/202202_tools_led_en.htm

Das Beispiel "0130 Traffic light single" zeigt, wie du die 5 Phase für Österreich aktivierst und enthält auch ein paar einfache Buttons.

Eventuell hilft Dir meine Anleitung: Endlicher Automat mit millis() .

1 Like

Das IDE-Beispiel blink without delay ist ein schlechtes Beispiel wenn man die Funktionsweise von nicht-blockierendem Timing verstehen will.

Aus folgenden Gründen:

  1. KEIN Hinweis: Es gibt KEINEN Hinweis auf den absolut fundamentalen Unterschied zwischen delay und nicht-blockierendem Timing.
    So lange man sich unter "millis() versucht etwas ähnliches vorzustellen wie delay() hat man EXTREME Schwierigkeiten es zu verstehen weil nicht-blockierendes Timing nun mal gaaanz anders arbeitet. Man kann es einfach nicht mit delay zur Deckung bringen!

  2. Die gegebenen Erklärungen sind dann vergleichsweise dürftig

  3. Die gewählte Grundkonstruktion im Code mit verteilten Variablen macht es zusätzlich schwer es zu verstehen

  4. Die gewählten Variablennamen sind nicht besonders gut selbsterklärend

Und all das macht es schwerer als nötig das Grundkonzept zu verstehen.

Das mindestete wäre das Nachwächter-Beispiel zu erwähnen.
Und noch besser verständlich wird es wenn man den Code-Ablauf mit einfach nachvollziehbaren Zahlen beschreibt.

vgs

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.