Ich bin anfänger und wollte eine ampel programieren

ich habe bis jetzt das programiert:

const int LED = 11; //LED wird am pin 11 verbunden
const int LED2 = 5;
const int LED1 = 8;
const int BUTTON=12;
int val = 0;
int state=0;
int old_val=0;

void setup()
{
pinMode(LED,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED1,OUTPUT);
pinMode(BUTTON,INPUT);
}

void loop()
{ val=digitalRead(BUTTON);

if((val==HIGH)&&(old_val==LOW)){
state=1-state;
delay(20);
}

old_val=val;

if(state==1){
digitalWrite(LED2,LOW); //mach die led aus
delay(200);
digitalWrite(LED1,HIGH);
delay(700);
digitalWrite(LED1,LOW);
digitalWrite(LED,HIGH);
delay(5500);
digitalWrite(LED1,HIGH);
delay(990);
digitalWrite(LED1,LOW);
digitalWrite(LED,LOW);
delay(100);
digitalWrite(LED2,HIGH);
delay(5700);
digitalWrite(LED2,LOW); //mach die led aus
delay(200);

}else{
digitalWrite(LED2,HIGH);
digitalWrite(LED,LOW);
digitalWrite(LED1,LOW);
}}

Spitze - gibt es auch ein Problem dabei ? :wink:

also ich möchte den button drücken(wie bei einer drückerampel) und die ampel soll rot werden beim ersten mal macht sie es aber dann überspringt das programm den drückaufrag und loopt one das ich was mache

Das es einmal nur geht, ist klar.

Das Problem ist, dass du mit delays arbeitest. Wenn delay kommt, bleibt dein Programm in der Zeit stehen. Entweder mit Interupts arbeiten, oder BlinkWithoutDelay Tutorial lesen.

Des weiteren würde ich bei einem Tastendruck den state als true setzen.
Am Ende der If-Schleife state = false setzen. Dann kannst du zumindest den Taster weiter nutzen mit dem Sketch.

gut ich habe mir ,,blinkwithoutdelay" durchgelesen aber da ich bis jetzt 3 Tage Progammierungserfahrung habe kann ich damit nicht viel anfangen und verstehe es nicht

durchgelesen aber kann damit nicht viel anfangen und verstehe es nicht

Dann bau es nach und erweitere es vorsichtig, wenns funktioniert:

Zusätzlich zur Blink-Led eine Led die leuchtet, solange der Taster gedrückt ist,
während die andere ungerührt weiterblinkt.
Die Taster-Led sollte immer sofort reagieren, und du solltest begeistert sein ... :wink:

Nächste Übungs-Stufe: Die Taster-Led geht an wenn du den Taster (kurz) drückst, und geht wieder aus
a) nach 5 sec
b) wenn die Blink-Led von "an" nach "aus" wechselt

Das ist zwar noch keine Ampel, zeigt dir aber,
wie man zeitliche Abläufe mit spontanen Ereignissen verknüpfen kann.

Danach hast du schätzungsweise 5 Tage Programmiererfahrung :wink:
Dann kannst du versuchen, ohne delay eine LED - Folge (grün - gelb - rot) mit verschieden langen Dauern zu bauen.

Hallo,

ich habe auch mühsam angefangen. :slight_smile:

Mit delay wird das Programm an der Stelle immer hart angehalten. Sprich es wird für die Zeit komplett blockiert. Das will man eigentlich nie. Bsp. SPS. Hier darf die Programmabfolge nie gestoppt werden. Das Programm muß in 20ms glaube ich komplett durch sein. Eingänge lesen, alles verarbeiten, Ausgänge entsprechend setzen und wieder alles von vorn. Das habe ich seitdem immer im Hinterkopf wenn ich meinen µC programmiere. Ständiger Programmdurchlauf.

Beim Arduino hat sich ein schlauer Mensch eine Funktion millis() einfallen lassen. Das ist ein "unendlicher" Zähler der sich erst nach 50 Tagen wieder auf 0 setzt. Die verstrichenen ms seit Programmstart kann man mit der Funktion abfragen. Wenn Du jetzt mit einer weiteren Variablen die vergangene Zeit vergleichst kannst Du Dir deine Verzögerung selbst bauen ohne dabei Dein gesamten Ablauf zu blockieren.

Nimm das Bsp. von http://arduino.cc/en/Tutorial/BlinkWithoutDelay und füge am loop Anfang oder loop Ende ein, dass eine 2. LED auf Tastendruck leuchten soll. Nur solange Taster gedrückt ist. Dann änderst Du den Wert der Variablen "interval". Du wirst sehen das Deine 2. LED weiterhin sofort auf Tastendruck reagiert aber die 1. LED nur im vorgegebenen Intervall blinkt. Dein Tastendruck wird also nicht blockiert durch künstliche delay Wartezeiten.

Hoffe das ist irgendwie verständlich.

Edit: da war jemand erheblich schneller beim tippen 8)

vielen dank das hat mir weitergeholfen XD