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
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
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.
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);
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
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);
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.
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
So mein Freund Ches , 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
}
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.
Ich absoluten Respekt vor euch
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..