Wie kann ich einen arduino taster in einen "haltezustand" bringen?


24.01.2025, 13:45

Das ist mein code:

int Rot1=13;

int Gelb1=12;

int Gruen1=11;

int Rot2=10;

int Gelb2=9;

int Gruen2=8;

int Taster=7;

int F_Rot=6;

int F_Gruen=5;

int Lautsprecher=4;

int Orange=3;

int tasterstatus=0;

void setup(){

 pinMode(Rot1, OUTPUT);

 pinMode(Gelb1, OUTPUT);

 pinMode(Gruen1, OUTPUT);

 pinMode(Rot2, OUTPUT);

 pinMode(Gelb2, OUTPUT);

 pinMode(Gruen2, OUTPUT);

 pinMode(Taster, INPUT_PULLUP);

 pinMode(F_Rot, OUTPUT);

 pinMode(F_Gruen, OUTPUT);

 pinMode(Lautsprecher, OUTPUT);

 pinMode(Orange, OUTPUT);

}

void loop(){

 tasterstatus = digitalRead(Taster);

 if (tasterstatus == 1){

  digitalWrite(F_Rot,HIGH);

  digitalWrite(Rot1,HIGH);

  digitalWrite(Rot2,HIGH);

  countdown();

  digitalWrite(F_Rot,LOW);

  digitalWrite(F_Gruen,HIGH);

  blinken();

  delay(8000);

  digitalWrite(F_Gruen,LOW);

  digitalWrite(F_Rot,HIGH);

 }

  

 digitalWrite(F_Rot,HIGH);

 digitalWrite(Rot1,HIGH);

 digitalWrite(Rot2,HIGH);

 delay(10000);

 digitalWrite(Gelb1,HIGH);

 digitalWrite(Gelb2,HIGH);

 delay(1500);

 digitalWrite(Rot1,LOW);

 digitalWrite(Gelb1,LOW);

 digitalWrite(Rot2,LOW);

 digitalWrite(Gelb2,LOW);

 digitalWrite(Gruen1,HIGH);

 digitalWrite(Gruen2,HIGH);

 delay(10000);

 digitalWrite(Gruen1,LOW);

 digitalWrite(Gruen2,LOW);

 digitalWrite(Gelb1,HIGH);

 digitalWrite(Gelb2,HIGH);

 delay(1500);

 digitalWrite(Gelb1,LOW);

 digitalWrite(Gelb2,LOW);

 }

4 Antworten

Das delay() macht dir alles kaputt.

Zwei Dinge solltest du dir ansehen:

1) Blinken ohne delay

2) Interrupts bei Tastendruck

Dann kommst du schnell ans Ziel.

Für beides findest du im Netz viele Anleitungen.

Woher ich das weiß:eigene Erfahrung

Anonymer4tze 
Beitragsersteller
 24.01.2025, 14:47

Danke für den tipp. Wird wenn ich ein Interrupt einbaue die Autoampel unterbrochen oder wird der code erst zuende ausgeführt und dann die Fußgängerampel geschaltet ?

Dein Problem ist das Delay. Da stoppt das Programm. Du müsstest entweder ohne Delay arbeiten (alternative Timer, "Blink without Delay") oder ggf mit Interrupt-Routinen deinen Programmablauf aus dem Delay holen und die Routine ausführen...


Anonymer4tze 
Beitragsersteller
 24.01.2025, 14:02

Meinst du das Delay in if(tasterstatus==1){.... ?

RareDevil  24.01.2025, 14:10
@Anonymer4tze

Alle Delays außerhalb der if, die verhindern, dass der Taster eingelesen wird...

Entweder schaust du, ob du eine asynchrone Methode findest oder du machst statt Delays ein aktives Warten mit Tasterabfrage und schaust auch, dass die tasterabfrage sonstwo zwischendrinnen häufig genug auftaucht.