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]
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:
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