Ampelschaltung <- Mit Schalter/taster <> HILFE

Hey Leute

habe 3LEDS und einen Schalter auf meinem Breadboard angeschlossen und den Code so geschrieben das falls der Taster nicht gedrückt wird nur das Rote LED leuchtet , wenn dieser jedoch gedrückt wird kommt
die übliche ampelschaltung rot rotgelb grün rot . Das ist es ersteinmal Theoretisch
der Schalter ist mit einem Pulldown Widerstand 100k Ohm versehen. Jetzt kommen Probleme auf entweder geschieht nicht wenn ich den Taster drücke , oder manchmal geht die Ampelschaltung einfach so los
ohne Pause <- Loop , hierbei kann man sich ja denken , dass es sich um Störrungen handelt , trotzdem bitte ich einmal einen Profi über meinen Code zu schauen ....

const int ledGelb = 10  ;             // Definierung der Variable <-> Int(integer) für ganze Zahlen
 const int ledGruen = 8 ;
 const int ledRot = 13 ;
 int       SchalterZustand;
 const int InputPin = 11;

void setup() {               // einmalige Definierung
  Serial.begin(9600);
  pinMode(InputPin,INPUT);    // schalter INPUT
  pinMode (ledGruen, OUTPUT); // LED Pins als OUTPUT definiert
  pinMode (ledGelb, OUTPUT);
  pinMode (ledRot, OUTPUT);
  
}

void loop(){                                 // sich wiederholende Schleife
  
  SchalterZustand = digitalRead(InputPin);   // Den Schalter überprfüfen
  Serial.println(SchalterZustand,DEC);       // Serielle Kommunikation mit Computer
  
  
  if (digitalRead(InputPin)==HIGH)                  // Bedingeunge falls Schalter gedrückt wahr ist
  {
    digitalWrite(ledRot, HIGH); // Rote LED ist an
   delay(5000);                // 5 Sekunden lang
   digitalWrite(ledGelb, HIGH); // Gelbe LED ist an
   delay(1000);                // 1 Sekunde lang
   digitalWrite(ledRot, LOW);  // Rote LED geht aus
   digitalWrite(ledGelb, LOW); // Gelbe LED geht aus
   digitalWrite(ledGruen, HIGH); // Grüne LED geht an
   delay(5000);                // 5 Sekunden lang
   digitalWrite(ledGruen, LOW); //Grüne LED geht aus
   delay (1000);               // wartet für 1 Sekunde
   digitalWrite(ledRot,HIGH);   //schaltet Rote LED an
   delay(3000);                //Signalbounce Umgehung
   
  } else {                        // ansonsten  Schalter nicht geshcaltet
        digitalWrite(ledRot,HIGH);     // Rot leuchtet , die anderen nicht
        digitalWrite(ledGruen,LOW);
        digitalWrite(ledGelb,LOW)  ;
  }
        
}
  
/code]

Hi,

das mit dem pull-down ist schonmal gut.
Dass der Schalter "von selbst" gedrückt wird liegt vermutlich daran, dass 100K schon ein ziemlich großer pull-down ist.
Probiers mal mit 4,7K

Du kannst aber stattdessen auch den internen pull-up des Arduino benutzen:

pinMode(inputPin, INPUT); // pin als input
digitalWrite(inputPin, HIGH); // internen pullup aktivieren

Das macht dein Breadboard übersichtlicher und spart dir Kabel und Widerstände.
Dann einfach so verbinden:
PIN - > Schalter -> GND

also beim serial monitor kommen nur 0llen raus und widerstände habe ich jetzt schon 100k 10k 1,1k und 220 Ohm ausprobiert ???

dafuq

hat es vielleicht etwas mit dem debouncing zu tuen , kann ich mir zwar nicht vorstellen ....

ProfessorQuack:
hat es vielleicht etwas mit dem debouncing zu tuen , kann ich mir zwar nicht vorstellen ....

Füge ein delay(10); im ELSE ein und das verhindert das Kontaktprellen.
Grüße Uwe

Habe mal dein Code ein bisschen bearbeitet und Kommentare rein geschrieben. Wichtigste Änderung es wäre jetzt eine Pull-Up Schlatung mit den Internen Widerstände also ein gedrückter Schalter hat ein LOW(false) und ein nicht gedrückter Schalter ein HIGH(true):
Und wenn ein Variable nur 1 Bit hat also 0 oder 1 dann besser boolean-Type nutzen der brauch weniger platz als ein Int-type.
Und da Ein und Ausgänge Feste variabeln sind muss man kein Platz mit Ints oder Bytes verschwenden. Direkt von Anfang an eine bessern Stil angewöhnen dann kommt man später auch klar. Nurmalerweise schreibe ich die Defines alles GROSS und die variabln klein.

#define ledGelb 10           // by VD    // Definierung der Variable <-> Int(integer) für ganze Zahlen
#define ledGruen  8  // VD       
#define ledRot  13   // VD
#define InputPin  11 //VD

boolean SchalterZustand=true;  //VD
boolean letzterSZustand=true;  //VD

void setup() {               // einmalige Definierung
  Serial.begin(9600);
  pinMode(InputPin,INPUT);    // schalter INPUT
  digitalWrite(InputPin,HIGH);  // aktivieren der internen Pullups Taster gedrückt LOW sonst immer HIGH VD
  pinMode (ledGruen, OUTPUT); // LED Pins als OUTPUT definiert
  pinMode (ledGelb, OUTPUT);
  pinMode (ledRot, OUTPUT);

}

void loop(){                                 // sich wiederholende Schleife

  SchalterZustand = digitalRead(InputPin);   // Den Schalter überprfüfen
  Serial.println(SchalterZustand,DEC);       // Serielle Kommunikation mit Computer

  //Schalter nicht gedrückt und das letzt mal war er gedrückt 
  // Merken im letztn Zustandt so kommst du aus dem Bouncing problem raus und deine If Start nur "einmal" in wenn der Zustand von Highn nach Low wechselt
  if (SchalterZustand==true&&letzterSZustand==false){
    letzterSZustand==true;
  }

  // Bedingung wenn Schalter gerückt und das "mal" davor nicht gedrückt war dann ab in die Schleife
  if (SchalterZustand==false&&letzterSZustand==true)   // Bedingeunge falls Schalter gedrückt wahr ist und das mal
  {
    digitalWrite(ledRot, HIGH); // Rote LED ist an
    delay(5000);                // 5 Sekunden lang
    digitalWrite(ledGelb, HIGH); // Gelbe LED ist an
    delay(1000);                // 1 Sekunde lang
    digitalWrite(ledRot, LOW);  // Rote LED geht aus
    digitalWrite(ledGelb, LOW); // Gelbe LED geht aus
    digitalWrite(ledGruen, HIGH); // Grüne LED geht an
    delay(5000);                // 5 Sekunden lang
    digitalWrite(ledGruen, LOW); //Grüne LED geht aus
    delay (1000);               // wartet für 1 Sekunde
    digitalWrite(ledRot,HIGH);   //schaltet Rote LED an
    delay(3000);                //Signalbounce Umgehung
    letzterSZustand=false;        // Der war ja gedrückt und du hast was damit gemacht
  } 
  else {                        // ansonsten  Schalter nicht geshcaltet
    digitalWrite(ledRot,HIGH);     // Rot leuchtet , die anderen nicht
    digitalWrite(ledGruen,LOW);
    digitalWrite(ledGelb,LOW)  ;
  }

}

also Uwes Methode funktioniert nicht , die leds leuchten unkontrolliert ..... aber nach der richtigen Reihenfolge
auch beu volvodanis Methode , nach Betätigung des Schalters passiert nichts , die LED ist konstant nur rot

ich drücke nicht einmal den Schalter und es loopt die Ampel

Bei dem Sketch von Volodani mußt Du den Taster zwischen Eingang und Masse schalten.
Grüße Uwe

Masse ????

GND

Hi,

Theoretisch müsste es jetzt eigentlich klappen, zumindest vom Code her.

Poste doch mal bitte deinen Aufbau.

Wird das Arduino vielleicht von etwas anderem gestört?
Womit wird es mit strom versorgt? (und wo im Arduino eingespeist, in den connector?)