Ampelschaltung mit Taster funktioniert nicht

Ich bin noch neu im Thema Arduino und wollte eine Ampelschaltung programmieren, die sich einschaltet, sobald der Taster gedrückt wird. Jedes Mal wenn ich aber im Programm auf "uploaden" drücke, schaltet sich die Ampel sofort ein und reagiert nicht auf den Taster.
Ich wäre sehr dankbar, wenn jemand mir sagen könnte, was ich falsch gemacht habe?
Danke schonmal...:slight_smile:

int t;
int a;
int b;

void setup() {
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(11,OUTPUT);
pinMode(9,INPUT_PULLUP);

}

void loop() {
t=digitalRead(9);
Serial.println(t);

if(t==LOW);{
for(a=13;a>=11;a=a-1){
digitalWrite(a,HIGH);
delay(2000);
digitalWrite(a,LOW);}
for(b=11;b<=13;b=b+1){
digitalWrite(b,HIGH);
delay(2000);
digitalWrite(b,LOW);}
}
while(t==HIGH){}
}

Einen alternativen Code habe ich auch geschrieben, da war dann allerdings das Ergebnis dass am Ende gar nichts mehr funktioniert hat...:

int ROT = 5;
int GELB = 6;
int GRUEN = 7;
int TASTER = 9;

void setup()
{
pinMode(ROT, OUTPUT);
pinMode(GELB, OUTPUT);
pinMode(GRUEN, OUTPUT);
pinMode(TASTER, INPUT_PULLUP);
}

void loop()
{
if (TASTER==LOW){
digitalWrite(ROT, HIGH);
digitalWrite(GELB, LOW);
delay(5000);
digitalWrite(ROT, LOW);
digitalWrite(GELB, HIGH);
delay(2000);
digitalWrite(GELB, LOW);
digitalWrite(GRUEN, HIGH);
delay(5000);
digitalWrite(GRUEN, LOW);
digitalWrite(GELB, HIGH);
delay(2000);
}
while (TASTER==HIGH){}
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Zeile 42 hat Fehler.
Ochne Sketch keine Hilfe

Ja klar.
Das du deinen Sketch nicht zeigst.

Ich rate mal daß das Programm sofort mit der Ampel startet sobald der Arduino resetiert oder eingeschaltet wird.
Dann durch die Verwendung von delay() wird der Taster einfach lange zeit nicht abgefragt.
Ansonsten gehe ich mit meinen Vorredern einer Meinung.
Ohen Sketch keine zielgerichtete Hilfe.

Grüße Uwe

Poste einmal Code, Schaltplan und gute Bilder von Aufbau.

Dann schauen wir weiter

Moin @arduuno25 ,

den Sketch bitte immer zwischen "Code-Tags" posten. Die findet man im Editormenü

image

Dann sieht der erste Deiner Sketche so aus:

int t;
int a;
int b;

void setup() {
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(9, INPUT_PULLUP);
  delay(100);
}

void loop() {
  t = digitalRead(9);
  Serial.println(t);

  if (t == LOW) ; {
    for (a = 13; a >= 11; a = a - 1) {
      digitalWrite(a, HIGH);
      delay(2000);
      digitalWrite(a, LOW);
    }
    for (b = 11; b <= 13; b = b + 1) {
      digitalWrite(b, HIGH);
      delay(2000);
      digitalWrite(b, LOW);
    }
  }
  while (t == HIGH) {
  }
}

:wink:

Hier Dein Sketch nochmal mit Kommentaren zu den erkannten (und behobenen) Fehlern.

/*
  Forum: https://forum.arduino.cc/t/ampelschaltung-mit-taster-funktioniert-nicht/1368673
  Wokwi: https://wokwi.com/projects/426873776267268097

  ec2021
  2025/03/30

*/

int t;
int a;
int b;

void setup() {
  // Hier fehlte die Initialisierung der seriellen Schnittstelle
  Serial.begin(115200);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(9, INPUT_PULLUP);
  delay(100);
}

void loop() {
  t = digitalRead(9);
  Serial.println(t);
  //if (t == LOW); {  // Dieses If endet bereits mit dem Semikolon zwischen der runden und der geschweiften Klammer
  // Damit wird alles zwischen den folgenden geschweiften Klammern ausgeführt, unabängig von t
  // So geht's besser:
  if (t == LOW) {
    for (a = 13; a >= 11; a = a - 1) {
      digitalWrite(a, HIGH);
      delay(2000);
      digitalWrite(a, LOW);
    }
    for (b = 11; b <= 13; b = b + 1) {
      digitalWrite(b, HIGH);
      delay(2000);
      digitalWrite(b, LOW);
    }
  }
  //while (t == HIGH) {}   // Hier kommt der Sketch (wenn t gleich HIGH ist) nicht wieder heraus,
  // da der Wert von t sich nicht mehr ändert!
  // Man muss t innerhalb der Klammern aktualisieren
  while (t == HIGH) {
    t = digitalRead(9);
  }
}


Zum Ausprobieren beim Online-Simulator Wokwi:
https://wokwi.com/projects/426873776267268097

Ein paar zusätzliche Tipps:

  • Man sollte feste Zahlen für z.B. GPIOs im Programm vermeiden, sondern dafür Konstanten verwenden. Das reduziert die Fehleranfälligkeit, erleichtert Änderungen und verbessert die Nachvollziehbarkeit bei passender Bezeichnung der Konstanten (z.B. pinGruen, pinGelb etc.)
  • Für a = a-1 gibt es bei C/C++ eine einfachere Darstellung: a--; Für a = a+1 kann man einfach a++; schreiben ...
  • Wenn man (z.B.) eine Reihe von Pins schalten will, bieten sich Arrays an:
constexpr byte lampen[] = {13,12,11};
int noOfLampen = sizeof(lampen)/sizeof(lampen[0]);

  • Damit lassen sich die Pins 13,12,11 einfach mit lampen[0] bis lampen[2] adressieren. und natürlich weitere GPIOs hinzufügen oder einzelne entfernen.
  • Die Abfrage von Tastern/Schaltern sollte berücksichtigen, dass diese Prellen können (also im Schaltzeitpunkt schnell zwischen HIGH/LOW hin- und herschalten) bevor sie den endgültigen Zustand erreicht haben. Der Controller ist meist schnell genug, diese einzelnen Vorgänge zu erkennen und reagiert dann u.U. unerwartet ... Daher günstigerweise per Software Entprellen (einfach mal danach googlen). Ein Delay hilft auch, siehe bei Dir mit 2 Sekunden, ist aber in den meisten Anwendungen hinderlich.

Ich höre hier mal auf ... :wink:

Weiterhin viel Spaß und Erfolg mit Deinem Arduino!
ec2021

Hallo,
zu Deinem zweiten Sketch , du solltest den pin auch noch einlesen

if (digitalRead(TASTER)== LOW) {

wenn Du die Zeile so änderst dann geht es . Am Ende kannst Du auch noch die while Schleife komplett weg lassen , die ist völlig überflüssig. Schau dir in dem Zusammenhang mal if.. genau an, du suchst eventuell nach einer else.. bzw. if else Möglichkeit.

Schöner wäre es noch du verzichtest auf die delay() und ersetzt das durch ein Konstrukt mit millis(). Das könnte jetzt der nächste Lernschritt für Dich sein. Damit kannst Du dann jederzeit auf den Taster reagieren ohne den Programablauf mit einem delay zu blokieren.

Da es sich um eine zeitlichen Abfolge von mehreren Schritten handelt würde sich auch eine Schrittkette, Ablaufsteuerung, Statemashine, anbieten das könnte ein weiterer Lernschritt sein.

Heinz

Garantiert nicht. Du hast die Klammern falsch gesetzt.

if (digitalRead(TASTER) == LOW) {

Gruß Tommy

Besser:

if (digitalRead(TASTER)== LOW) {

Danke für den Hinweis, hab´s gerade gesehen und geändert

Gruß Heinz