• Hallo Zusammen, Aufgrund der aktuellen Situation setzten wir die Möglichkeit aus, sich mit Gmail zu registrieren. Wir bitten um Verständnis Das RCMP Team

Tech-Frage 4 fach LED-Blitzer mit ATTiny für RC-LKW

Chesleyn

Mitglied
Hallo Norbert,

Upps, ja hatte ich geschrieben, aber vergessen auf Antwort einstellen zu klicken. Es läuft so weit. Ich hab mich nochmal mit den ganzen Variablen beschäftigt
 

Chesleyn

Mitglied
Hallo Norbert,

wenn du heute Abend zu Hause bist
kannst da mal kucken ab Zeile 28

if (vergangene_zeit>= BlinkDauer)

zeigt er ein fehler an exit status 1 ' if ' was not declared in this scope

ich hatte oben nicht vergessen rein zu schreiben.

ich hatte selber geschaut, aber ich komm da nicht hinter
 

BAXL

Admin
Mitarbeiter
Ich gucke nachher mal nach.
Darum solltest Du das schon mal ausprobieren, weil ich auf der Arbeit gerade keine Arduino IDE zur Hand habe.
 

BAXL

Admin
Mitarbeiter
Hallo Norbert,

wenn du heute Abend zu Hause bist
kannst da mal kucken ab Zeile 28

if (vergangene_zeit>= BlinkDauer)

zeigt er ein fehler an exit status 1 ' if ' was not declared in this scope

ich hatte oben nicht vergessen rein zu schreiben.

ich hatte selber geschaut, aber ich komm da nicht hinter
Ich glaube ich sehe den Fehler schon so. In meinem Listing hatte ich das Wort if versehentlich mit einem großen i geschrieben, also ein I. Ändere das in ein kleines i, dann sollte es klappen.
 

Chesleyn

Mitglied
Hallo Norbert,

ich habe gerade den Fehler Korrigiert, er zeigt mir einen weiteren fehler in der Zeile
40 an.

exit status 1 extected ' ; ' before ' } '
 

BAXL

Admin
Mitarbeiter
Das bedeutet, das vor der } noch ein Semikolon ; gehört. Trau Dich einfach mal solche Sachen zu berichtigen wie Du das meinst. Kaputtmachen kannst Du nichts. Es ist auch wichtig, dass Du sowas mit der zeit auch selbstständig berichtigen kannst. Irgendwann sollst Du in der Lage sein, eigene Programme zu schreiben und Fehler zu finden und zu korrigieren.

Edit, da waren noch zwei so Fehler. Hier kommt das Sketch, was ohne Fehlermeldungen kompiliert wurde.

unsigned long startzeit;
unsigned long vergangene_zeit;
// Variable um die vergangene Zeit zwischen Startzeit und aktueller Zeit berechnen zu können
unsigned long BlinkDauer = 1000; // Hier wird die Blinkdauer für den normalen Blinker festgelegt
int LEDStatusBlinker = HIGH; // Hier wird der aktuelle Wert des Timers ausgelesen

void setup () {
pinMode ( 13, OUTPUT); // Pin für normales Blinken
pinMode ( 11, OUTPUT); // Pin für das Blitzen
digitalWrite(13, LOW); // als Startzustand die LEDs ausschalten
digitalWrite(11, LOW);

startzeit = millis();
}

void loop() {


vergangene_zeit = millis() - startzeit; // Berechnung der vergangenen Zeit seit der letzten Startzeitabfrage


// Vergleich ob die vergangene Zeit gleich oder größer als die Blinkzeit ist
// wenn die Zeit kleiner ist, werden die Befehle übersprungen
// Ist die Zeit gleich oder größer, werden die folgenden Befehle abgearbeitet
if (vergangene_zeit>= BlinkDauer)
{
digitalWrite(13, LEDStatusBlinker); // Hier wird die LED je nach Status ein oder ausgeschaltet

// in folgender if else Abfrage wird der Merker für den LED Status auf den anderen Wert gesetzt
// aus an wird aus, aus aus wird an gemacht

if (LEDStatusBlinker == HIGH){
LEDStatusBlinker = LOW;
} else if (LEDStatusBlinker == HIGH){
LEDStatusBlinker = HIGH;
}

// Für die neue Wartezeit wird der aktuelle Wert des Timers ausgelesen
startzeit = millis();
}


// In folgenden Zeilen wird die Blitzer-LED mit delay() immer ein und ausgeschaltet
digitalWrite (11, HIGH);
delay(50);
digitalWrite (11, LOW);
delay(50);

}
 

Chesleyn

Mitglied
Hey Norbert,

ok, hast Recht, Aus Fehlern solle man lernen. Ich weis jetzt nur nicht
warum ich da jeweils keine ) ) setzen muss.
Ich weiß nun nicht weiter weil er in der letzten Zeile
" extected ' } ' at end of input anzeigt. Die Anzahl stimmt
von den {} Klammer
 

BAXL

Admin
Mitarbeiter
So, ich konnte das Programm jetzt mit einem Arduino UNO testen, es war im Prinzip richtig, nur in dem Programmtei, in dem LEDStatusBlinker gesetzt wird war noch ein kleiner Programmfehler. Hier das richtige und vor allem funktionierende! Programm. :)

Ich denke jetzt verstehst Du auch was ich damit meinte, dass man eine scheinbare Parallelverarbeitung machen kann, es aber unter Umständen etwas tricky ist.

unsigned long startzeit;
unsigned long vergangene_zeit;
// Variable um die vergangene Zeit zwischen Startzeit und aktueller Zeit berechnen zu können
unsigned long BlinkDauer = 1000; // Hier wird die Blinkdauer für den normalen Blinker festgelegt
int LEDStatusBlinker = HIGH; // Hier wird der aktuelle Wert des Timers ausgelesen

void setup () {
pinMode ( 13, OUTPUT); // Pin für normales Blinken
pinMode ( 11, OUTPUT); // Pin für das Blitzen
digitalWrite(13, LOW); // als Startzustand die LEDs ausschalten
digitalWrite(11, LOW);

startzeit = millis();
}

void loop() {


vergangene_zeit = millis() - startzeit; // Berechnung der vergangenen Zeit seit der letzten Startzeitabfrage


// Vergleich ob die vergangene Zeit gleich oder größer als die Blinkzeit ist
// wenn die Zeit kleiner ist, werden die Befehle übersprungen
// Ist die Zeit gleich oder größer, werden die folgenden Befehle abgearbeitet
if (vergangene_zeit>= BlinkDauer)
{
digitalWrite(13, LEDStatusBlinker); // Hier wird die LED je nach Status ein oder ausgeschaltet

// in folgender if else Abfrage wird der Merker für den LED Status auf den anderen Wert gesetzt
// aus an wird aus, aus aus wird an gemacht

if (LEDStatusBlinker == HIGH){
LEDStatusBlinker = LOW;
} else if (LEDStatusBlinker == LOW){
LEDStatusBlinker = HIGH;
}

// Für die neue Wartezeit wird der aktuelle Wert des Timers ausgelesen
startzeit = millis();
}


// In folgenden Zeilen wird die Blitzer-LED mit delay() immer ein und ausgeschaltet
digitalWrite (11, HIGH);
delay(50);
digitalWrite (11, LOW);
delay(50);


}
 

BAXL

Admin
Mitarbeiter
Der nächste schritt ist nun, dass beim Blinken auch ein zweiter Pin im Wechsel angesteuert wird. Dafür brauchen wir dann Pin 12.

Als Zwischenschritt für das Programm, um es übersichtlicher zu machen, habe ich die Umschaltung der LED, zwischen AN und AUS, in eine eigene Prozedur gepackt und an das Ende gestellt.

Hier der Zwischenschritt:
unsigned long startzeit;
unsigned long vergangene_zeit;
// Variable um die vergangene Zeit zwischen Startzeit und aktueller Zeit berechnen zu können
unsigned long BlinkDauer = 1000; // Hier wird die Blinkdauer für den normalen Blinker festgelegt
int LEDStatusBlinker = HIGH; // Hier wird der aktuelle Wert des Timers ausgelesen
byte Blinkmodus = 1; // In dieser Variablen soll der aktuelle Blinkmodus gespeichert werden

void setup () {
pinMode ( 13, OUTPUT); // Pin für normales Blinken links
pinMode ( 13, OUTPUT); // Pin für normales Blinken rechts
pinMode ( 11, OUTPUT); // Pin für das Blitzen
digitalWrite(13, LOW); // als Startzustand die LEDs ausschalten
digitalWrite(12, LOW); // als Startzustand die LEDs ausschalten
digitalWrite(11, LOW);

startzeit = millis();
}

void loop() {

vergangene_zeit = millis() - startzeit; // Berechnung der vergangenen Zeit seit der letzten Startzeitabfrage

// Vergleich ob die vergangene Zeit gleich oder größer als die Blinkzeit ist
// wenn die Zeit kleiner ist, werden die Befehle übersprungen
// Ist die Zeit gleich oder größer, werden die folgenden Befehle abgearbeitet

if (vergangene_zeit>= BlinkDauer)
{blinkeLinks();
startzeit = millis();
// Für die neue Wartezeit wird der aktuelle Wert des Timers ausgelesen
}

// In folgenden Zeilen wird die Blitzer-LED mit delay() immer ein und ausgeschaltet
digitalWrite (11, HIGH);
delay(50);
digitalWrite (11, LOW);
delay(50);

}

void blinkeLinks()
{
digitalWrite(13, LEDStatusBlinker); // Hier wird die LED je nach Status ein oder ausgeschaltet
// in folgender if else Abfrage wird der Merker für den LED Status auf den anderen Wert gesetzt
// aus an wird aus, aus aus wird an gemacht
if (LEDStatusBlinker == HIGH){LEDStatusBlinker = LOW;}
else if (LEDStatusBlinker == LOW){LEDStatusBlinker = HIGH;}

}

Wir müssen jetzt aber eine neue Variable einführen, weil Du beim Blinken drei Modi haben willst.

Blinken links, Blinken rechts, alle Blinken, diese Varaible nenne ich Blinkmodus.
Blinkmodus = 1 soll links blinken sein
Blinkmodus 2 soll rechts Blinken sein
Blinkmodus 3 soll alle blinken sein

Und weil das auch noch jeweils 5x sein soll, brauchen wir noch eine zweite Variable, die BlinkAnzahl heißen soll

Die beiden neuen Variablen sind vom Typ Byte. D.h. , dass dafür im Speicher auch nur ein Byte an Platz reserviert wird. Beim Typ Byte kann die Zahl aber nur von 0 bis 255 gehen. Weil wir bei der BlinkAnzahl maximal auf 5 gehen und bei Blinkmodus maximal auf 3, reichte Byte dicke aus.
 
Zuletzt bearbeitet:

Chesleyn

Mitglied
Hey Norbert,

da hatte ich wohl zufrüh gefreut bei dem Habs gefunden.
Bei dem ersten Spoiler Easyblink hatte ich am Ende eine Zweit }
gemacht. Kompilierte auch, habs dann Hochgelden.
Blitze einmal auf dann war Feierarbend
 

BAXL

Admin
Mitarbeiter
So mein Freund Ches :D, es ist vollbracht. Der angehängte Sketch funktioniert. Ich habe ihn getestet. Es läuft so wie von Dir gewünscht. Die Blitzer blitzen immer, bei den Blinkern blinkt es 5x links, dann 5x rechts, dann 5x Alle (also Pannenblinker). Danach startet es von vorne.

unsigned long startzeit;
unsigned long vergangene_zeit;
// Variable um die vergangene Zeit zwischen Startzeit und aktueller Zeit berechnen zu können
unsigned long BlinkDauer = 1000; // Hier wird die Blinkdauer für den normalen Blinker festgelegt
int LEDStatusBlinker = HIGH; // Hier wird der aktuelle Wert des Timers ausgelesen
byte Blinkmodus = 0; // In dieser Variablen soll der aktuelle Blinkmodus gespeichert werden
byte BlinkAnzahl = 0;
void setup () {

pinMode ( 13, OUTPUT); // Pin für normales Blinken links
pinMode ( 12, OUTPUT); // Pin für normales Blinken rechts
pinMode ( 11, OUTPUT); // Pin für das Blitzen
digitalWrite(13, HIGH); // als Startzustand die LEDs ausschalten
digitalWrite(12, HIGH); // als Startzustand die LEDs ausschalten
digitalWrite(11, HIGH);
Blinkmodus=1;
startzeit = millis();
}

void loop() {

vergangene_zeit = millis() - startzeit; // Berechnung der vergangenen Zeit seit der letzten Startzeitabfrage

// Vergleich ob die vergangene Zeit gleich oder größer als die Blinkzeit ist
// wenn die Zeit kleiner ist, werden die Befehle übersprungen
// Ist die Zeit gleich oder größer, werden die folgenden Befehle abgearbeitet

if ((vergangene_zeit>= BlinkDauer)&& Blinkmodus == 1)
{
BlinkAnzahl++;
blinkeLinks();
startzeit = millis();
// Für die neue Wartezeit wird der aktuelle Wert des Timers ausgelesen
}

if ((vergangene_zeit>= BlinkDauer)&& Blinkmodus == 2)
{
BlinkAnzahl++;
blinkeRechts();
startzeit = millis();
// Für die neue Wartezeit wird der aktuelle Wert des Timers ausgelesen
}

if ((vergangene_zeit>= BlinkDauer)&& Blinkmodus == 3)
{
BlinkAnzahl++;
blinkeAlle();
startzeit = millis();
// Für die neue Wartezeit wird der aktuelle Wert des Timers ausgelesen
}

if (BlinkAnzahl == 10){
Blinkmodus=Blinkmodus+1;
if (Blinkmodus == 4){Blinkmodus=1;}
BlinkAnzahl=0;
}



//Serial.println(Blinkmodus);

// In folgenden Zeilen wird die Blitzer-LED mit delay() immer ein und ausgeschaltet
digitalWrite (11, HIGH);
delay(50);
digitalWrite (11, LOW);
delay(50);

}

void blinkeLinks()
{
// in folgender if else Abfrage wird der Merker für den LED Status auf den anderen Wert gesetzt
// aus an wird aus, aus aus wird an gemacht
if (LEDStatusBlinker == LOW){LEDStatusBlinker = HIGH;}
else if (LEDStatusBlinker == HIGH){LEDStatusBlinker = LOW;}
digitalWrite(13, LEDStatusBlinker); // Hier wird die LED je nach Status ein oder ausgeschaltet
}

void blinkeRechts()
{
// in folgender if else Abfrage wird der Merker für den LED Status auf den anderen Wert gesetzt
// aus an wird aus, aus aus wird an gemacht
if (LEDStatusBlinker == LOW){LEDStatusBlinker = HIGH;}
else if (LEDStatusBlinker == HIGH){LEDStatusBlinker = LOW;}
digitalWrite(12, LEDStatusBlinker); // Hier wird die LED je nach Status ein oder ausgeschaltet
}

void blinkeAlle()
{
// in folgender if else Abfrage wird der Merker für den LED Status auf den anderen Wert gesetzt
// aus an wird aus, aus aus wird an gemacht
if (LEDStatusBlinker == LOW){LEDStatusBlinker = HIGH;}
else if (LEDStatusBlinker == HIGH){LEDStatusBlinker = LOW;}
digitalWrite(12, LEDStatusBlinker); // Hier wird die LED je nach Status ein oder ausgeschaltet
digitalWrite(13, LEDStatusBlinker); // Hier wird die LED je nach Status ein oder ausgeschaltet
}
 
Zuletzt bearbeitet:

Chesleyn

Mitglied
Hey Norbert,

Danke danke, aber das muss ich erstmal RAffen.

Ich versuche da PArallelen zu dem Normelen Blinkdinks zu finden
so das ich auch Weiß warum Wo Was Hin muss.
Man das sind ja nee Menge an Zeilen, ich merke jetzt es Recht das,
das alles garnicht so Leicht ist.:confused::confused::confused::confused:
Ich absoluten Respekt vor euch
 

BAXL

Admin
Mitarbeiter
Du musst das Programm in Teile zerlegen, dann wird es verständlicher. Ich kann ja mal versuchen zu erklären was da passiert.

Du hast erst einmal die Hauptschleife, in der am Anfang nur die Blitzer LED mit den Delaybefehlen an und aus gemacht wurde.

Nun kommt die Prozessoruhr ins Spiel. Die Prozessoruhr startet immer dann, wenn der Arduino neu gestartet wird. Das ist eigentlich nichts anderes, als wenn da einer sitzt und ganz schnell anfängt laut zu zählen. Das passiert in jeder Millisekunde ein mal. Wenn der bis 1000 gezählt hat ist die gleiche Zeit verstrichen, wie bei delay(1000); Stell Dir jetzt vor der Typ sitzt in einem Raum und wenn Du ihn hören willst, machst Du kurz die Tür auf und hörst dann wo er gerade beim Zählen ist. dafür gibt es dann den Befehl millis().

Du machst also die Tür kurz auf und hörst bei welcher Zahl er gerade ist. Meinetwegen bei 3500. Die Zahl schreibst Du auf einen Zettel, das ist dann die Merkervariable für die Startzeit. Jetzt kümmerst Du Dich erstmal wieder um das Blitzen, was so lange nicht dauert. Dann machst Du wieder kurz die Tür auf und hörst was der Typ gerade sagt.
Meinetwegen ist er bei 4000 angekommen. Du rechnest kurz auf dem Zettel die Startzeit (3500) minus der Zeit, die der Typ gerade gesagt hat, also die 4000. Dann kommt heraus 4000-3500=500. Es sind erst 500ms vergangen. Dann machst Du weiter mit dem Blitzen. Beim nächsten Öffnen der Tür ist der Typ bei 4500 angekommen. Kurz gerechnet und aha, es sind 1000ms d.h. 1s um. Nach 1s wolltest Du aber die Blink LED an dem Schalter einschalten, was Du dann auch machst. Jetzt schreibst Du Dir eine neue Startzeit auf. Wieder kurz die Tür auf und hören was der Typ sag, schnell die Zahl auf den Zettel schreiben, dann blitzt Du wieder weiter rum.

Wenn wieder 1s rum ist, machst Du den Schalter aus, neue Zeit aufschreiben usw..

Bis hier hin soweit alles klar?
 
Zuletzt bearbeitet:
Top Bottom