Stephan_56
New member
- Registriert
- 15.02.2014
- Beiträge
- 34
...die 100.000ste
Hallo Forum,
nachdem ich mich nun endlich einmal dazu durchgerungen habe, mir auch einen Arduino (UNO V3) zuzulegen (war im Kit recht günstig), habe ich die Übungslektionen hinter mich gebracht.
Die Aufgabe, die ich mir gestellt hatte war: Ampelstuerung mit 2 Richtungen, Fußgängersteuerung mit Interrupt und eine Not/Nachtschaltung. Natürlich hat mir Google bei der Suche nach Ideen geholfen...
Programmiertechnisch am ekeligsten fand ich ja diese delay(x) für die Phasensteuerung. Deswegen möchte ich die noch auf millis() umstellen.
Erste Versuche sind kläglich gescheitert.
Statt der delay(x) habe ich ein zeit=millis()+3000; eingegeben. zeit wurde als long deklariert, weil 32768 nur für 32 Sekunden reicht. long hingegen reicht für über 550 Stunden
Dazu eine Variable für die jeweilige Phase. Ausgewertet habe ich dann mit if ( millis() > zeit && phase=n) {...} .
Das Programm durchlief zwar die Befehle in den Schleifen, schaltet aber die LEDs nicht. Im {}-Block der if-Bedingung werden die LEDs neu gesetzt und der Zähler für die Phase neu gesetzt.
Zweck des Ganzen ist, den Arduino nicht in den delays zu blocken, sondern ihn über die Variable Zeit, basierend auf den millis() ständig am Laufen zu halten. Ich hatte mal gelesen, das sei so besser. Die Form der Interrupt-Behandlung (nur kurze Routine) habe ich bei Winni "gemopst".
Nach der Grundstellung der Ampel werden die als if... gewandelten delay angesteuert. Löppt aber nicht, jedenfalls die LEDs nicht.
Beispielhaft hier mal zwei Blöcke:
Das Programm kann also nur dann in die if-Bedingungen springen, wenn die Zeit abgelaufen ist UND die richtige Phase diese Schleife freigibt.
Ich habe mir auch schon seriell die jeweiligen Schleifenwerte ausgeben lassen und dabei festgestellt, daß zwar in die Schleifen verzweigt wird, aber komischerweise die LEDs nicht entsprechend geschaltet werden. Ist ja eigentlich gar nicht möglich, oder?
Edit:
Die Phasenzeiten habe ich bewußt so kurz gehalten, damit ich bei realen Umlaufzeiten nicht einpenne
Nun bräuchte ich euch zum debuggen
Hallo Forum,
nachdem ich mich nun endlich einmal dazu durchgerungen habe, mir auch einen Arduino (UNO V3) zuzulegen (war im Kit recht günstig), habe ich die Übungslektionen hinter mich gebracht.
Die Aufgabe, die ich mir gestellt hatte war: Ampelstuerung mit 2 Richtungen, Fußgängersteuerung mit Interrupt und eine Not/Nachtschaltung. Natürlich hat mir Google bei der Suche nach Ideen geholfen...
Programmiertechnisch am ekeligsten fand ich ja diese delay(x) für die Phasensteuerung. Deswegen möchte ich die noch auf millis() umstellen.
Erste Versuche sind kläglich gescheitert.
Statt der delay(x) habe ich ein zeit=millis()+3000; eingegeben. zeit wurde als long deklariert, weil 32768 nur für 32 Sekunden reicht. long hingegen reicht für über 550 Stunden
Dazu eine Variable für die jeweilige Phase. Ausgewertet habe ich dann mit if ( millis() > zeit && phase=n) {...} .
Das Programm durchlief zwar die Befehle in den Schleifen, schaltet aber die LEDs nicht. Im {}-Block der if-Bedingung werden die LEDs neu gesetzt und der Zähler für die Phase neu gesetzt.
Zweck des Ganzen ist, den Arduino nicht in den delays zu blocken, sondern ihn über die Variable Zeit, basierend auf den millis() ständig am Laufen zu halten. Ich hatte mal gelesen, das sei so besser. Die Form der Interrupt-Behandlung (nur kurze Routine) habe ich bei Winni "gemopst".
Nach der Grundstellung der Ampel werden die als if... gewandelten delay angesteuert. Löppt aber nicht, jedenfalls die LEDs nicht.
Beispielhaft hier mal zwei Blöcke:
Code:
// Phase 1 ROT/GELB folgt auf alles ROT bei Ampel 1
// 5000 millis hier nicht reingehen, da phase=1 auch nicht in alle anderen Teile
if (millis() > zeit && phase == 1)
{
digitalWrite(ledpinRot1, HIGH); //Rot
digitalWrite(ledpinGelb1,HIGH); //Gelb
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinRot2, HIGH); //Rot
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen2, LOW);
zeit = millis() + 3000;
phase = 2;
}
// Phase 2 zeigt Ampel1 3 sek rot/gelb
if (millis() > zeit && phase == 2)
{
phase = 3;
zeit = millis() + 5000;
}
// Phase 3 zeigt Ampel 1 GRÜN für 5 sek
if millis() > zeit and phase == 3
{
// delay(3000);
digitalWrite(ledpinRot1, LOW);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGruen1, HIGH); // Grün
digitalWrite(ledpinRot2, HIGH); // Rot
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen2, LOW);
zeit = millis() + 5000;
phase = 4;
//delay(DELAY5);
}
Das Programm kann also nur dann in die if-Bedingungen springen, wenn die Zeit abgelaufen ist UND die richtige Phase diese Schleife freigibt.
Ich habe mir auch schon seriell die jeweiligen Schleifenwerte ausgeben lassen und dabei festgestellt, daß zwar in die Schleifen verzweigt wird, aber komischerweise die LEDs nicht entsprechend geschaltet werden. Ist ja eigentlich gar nicht möglich, oder?
Edit:
Die Phasenzeiten habe ich bewußt so kurz gehalten, damit ich bei realen Umlaufzeiten nicht einpenne
Nun bräuchte ich euch zum debuggen