Hallo zusammen, ich hab schon viel gesucht, leider aber nichts passendes gefunden. Mein Problem ist: Ich habe insgesamt 8 LEDs(2x weiß; 2x Rot; 4x Gelb), für die Beleuchtung eines Modellautos soll es folgende Funktionen geben: 1. Fahrbeleuchtung: Weiß (100%) + Rot (ca. 50%) 2. Bremsen: Rot (100%) 3. Warnblinker: 4x Gelb blinken (300ms 100% dann 300ms aus) 4. Blinker (rechts/links): 2x Gelb Blinken (300ms 100% dann 300ms aus) 5. Licht aus Das ganze soll mit einer IR-Fernbedienung gesteuert werden. Der Code befindet sich im Anhang. Das Problem ist, der Warnblinker blinkt nur einmal auf und geht wieder aus, da er sich nicht in einer Schleife befindet, lege ich diesen in eine Schleife, kann ich nachdem ich die Taste gedrückt habe nichts anderes mehr auswählen. Hat irgendjemand eine Idee wie ich das Problem lösen kann. Danke schonmal!
Du kannst das Blinken in eine For-Schleife legen die beim Warnblinker 4 mal ausgeführt wird und beim Blinkwr 2 mal. Was aber bleibt ist das du während der Schleifenlaufzeit nichts anderes machen kannst, was aber nicht an der Schleife liegt sondern an der Art des Wartens. Für den Rest: https://www.mikrocontroller.net/articles/Multitasking
Hi Nun, da ich von C keine Ahnung habe, kann ich dir mit deinem Programm nicht helfen, aber die Vorgehensweise beschreiben. Im Prinzip brauchst du für dein Programm eine Schleife, in der du Daten erfasst, verarbeitest und ausgibst. Das EVA-Prinzip halt. Eingabe-Verarbeitung - Ausgabe. Damit eine Bearbeitung nicht die Schleife durch eine andere unterbricht, brauchst du ein, ich nenn es mal viertes, Programmelement, den Interrupt. Und du mußt dein Programm ereignisgesteuert aufbauen. Also, du willst Licht anschalten, setze dafür ein Flag in Form eines Bits bei der Befehlseingabe. Du willst eine LED blinken lassen, setze ebenfalls ein Flag, für Blinklampe "Ein" usw. In deiner Schleife liest du also Taster, Schalter, Sensoren usw. ein und ordnest diesen Signalen Bits zu. Dann kommt deine Verarbeitung. Hier schaust du nach, welche Bits gesetzt sind und führst die Aufgabe aus. Nach Bearbeitung löscht du das Bit (Flag) und gehst zurück zur Hauptschleife. Für den Blinker brauchst du aber ein Zeitereignis und das liefert dir der Interrupt eines Timers. In der Interrupt Service Routine kurz ISR setzt du dir nun auch Flags für zeitliche Ereignisse. Das braucht nicht viel Zeit und du merkst den Interrupt gar nicht. So kannst du dir Flags für ms, s und alles was dazwischen liegt und gebraucht wird, bilden, bzw. setzen. So braucht deine ISR nichts weiter zu tun, als die Bits zu setzen. In dener Hauptschleife fragst du nun diese "Zeitereignisse" ab und reagierst darauf. So kann ein Bit, welches alle 300 - 500 ms gesetzt wird, ein Blinkbit erzeugen, indem es einfach bei jeder Verarbeitung des Zeitereignisses invertiert wird. Auch dabei wird das Zeitbit nach der Bearbeitung gelöscht. Wenn du nun eine LED einschaltest und vor der Ausgabe mit dem Blinkbit verundest, dann wird der eingeschaltete Ausgang blinken, ohne dafür eine eigene Schleife zu benötigen. Dein Programm bleibt in allen Funktionen aktiv. Ich hab mal versucht, das mit einer Skizze zu verdeutlichen. Die Module werden als Subroutinen aus der Hauptschleife bei gesetzten Flags aufgerufen. Das sollte deine Probleme erst einmal lösen. Gruß oldmax
:
Bearbeitet durch User
Du darfst nicht mit delay() arbeiten, was das Programm pausiert, sondern musst Aktionen nach abgelaufener Zeit ausführen. Schau mal unter „Blink without Delay“ Ich habe vor kurzen etwas Ähnliches für ein Lego Polizeiauto umgesetzt. Schwierigkeit wird es bereiten, das Bremslicht nur bei Tastendruck leuchten zu lassen. Aber auch das ist lösbar.
Elias Wr schrieb: > Hat irgendjemand eine Idee wie ich das Problem lösen kann. Beschäftige dich mal mit dem Timer und dem Timerinterrupt. Du brauchst einen Timer, der in der doppelten Blinkfrequenz zuschlägt (also alle 300ms) und einen Interrupt auslöst. In der Interruptroutine toggelst du die LED in Abhängigkeit eines Flags, das dann gesetzt wird, wenn du Blinken einschaltest und zurückgesetzt wird, wenn du Blinken ausschaltest. Dann gibt es auch kein "delay (300)" mehr und der Prozessor kann in der Delayzeit wieder Tasten abfragen.
Warum schreibst du deinen Programm-Code in eine txt-Datei und nicht in eine ino-Datei? Elias Wr schrieb: > Code.txt
Ich hab mal zur eigenen Übung ein bissl umgeschrieben. Ich kann nur nicht kompilieren, da IRremote aktuell nicht installiert ist. Vielleicht hilft es.
1 | #include <IRremote.h> |
2 | |
3 | int irPin = 13; //Pin am Arduino Nano für den IR Receiver |
4 | int front = 4; //Pin am Arduino Nano für Frontbeleuchtung weiß |
5 | int rear = 5; //Pin am Arduino Nano für Rückbeleuchtung rot |
6 | int right = 6; //Pin am Arduino Nano für Blinker rechts |
7 | int left = 7; //Pin am Arduino Nano für Blinker links |
8 | |
9 | byte Warnblinker = 0: //Variable zum Zustand speichern für den Warnblinker / 0=Aus, 1=An |
10 | byte Licht = 0; //Variable zum Zustand speichern für des Lichts / 0=Aus, 1=An |
11 | byte Bremse = 0; //Variable zum Zustand speichern für die Bremse / 0=Aus, 1=An |
12 | int Blinkerintervall = 300; //Variable Zeit des Blinkers |
13 | |
14 | IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung |
15 | decode_results results; |
16 | |
17 | void setup() { |
18 | pinMode (front, OUTPUT); //LED-Pin als Ausgang deklarieren |
19 | pinMode (rear, OUTPUT); //LED-Pin als Ausgang deklarieren |
20 | pinMode (right, OUTPUT); //LED-Pin als Ausgang deklarieren |
21 | pinMode (left, OUTPUT); //LED-Pin als Ausgang deklarieren |
22 | pinMode (irPin, INPUT); //Den IR Pin als Eingang deklarieren. |
23 | irrecv.enableIRIn(); //Den IR Pin aktivieren |
24 | //Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen.
|
25 | }
|
26 | |
27 | void warnblinker() { |
28 | if((Warnblinker == 1) //Wenn Variable für den Warnblinker An |
29 | && (millis()%(Blinkerintervall*2) > Blinkerintervall)){ //Und "Rest" von millis() geteiltdurch Blinkerintervall mal 2, Größer Blinkerintervall |
30 | digitalWrite(right, HIGH); //Blinker Rechts leuchtet |
31 | digitalWrite(left, HIGH); //Blinker Links leuchtet |
32 | }
|
33 | else { //Ansonnsten |
34 | digitalWrite(right, LOW); //Blinker Rechts leuchtet nicht |
35 | digitalWrite(left, LOW); //Blinker Links leuchtet nicht |
36 | }
|
37 | }
|
38 | |
39 | void fahrbel() { |
40 | if(Licht == 1) { //Wenn Variable fürs Licht An |
41 | digitalWrite (front, HIGH); //Vorderlicht leuchtet |
42 | analogWrite (rear, 100); //Rücklicht leuchtet zu ~40% |
43 | }
|
44 | else { //Ansonnsten |
45 | digitalWrite (front, LOW); //Vorderlicht leuchtet nicht |
46 | digitalWrite (rear, LOW); //Rücklicht leuchtet nicht |
47 | }
|
48 | }
|
49 | |
50 | void carbreak() { |
51 | if(Bremse == 1) { //Wenn Variable für die Bremse An |
52 | digitalWrite (rear, HIGH); //Rücklicht leuchtet zu 100% |
53 | }
|
54 | else if (Licht == 1){ //Ansonnsten wenn Variable fürs Licht An |
55 | analogWrite (rear, 100); //Rücklicht leuchtet zu ~40% |
56 | }
|
57 | else { //Ansonnsten |
58 | digitalWrite (rear, LOW); //Rücklicht leuchtet nicht |
59 | }
|
60 | }
|
61 | |
62 | void loop() { |
63 | warnblinker(); //Funktion warnblinker() ausführen |
64 | if (irrecv.decode(&results)) { //Tastendruck auswerten und in results speichern |
65 | if (results.value == 3249208323 ){ //Taste für Warnblinker An/Aus |
66 | Warnblinker != Warnblinker; //Variable für den Warnblinker wechselt An/Aus |
67 | }
|
68 | if (results.value == 3249193533 ){ //Taste für Licht An/Aus |
69 | Licht != Licht; //Variable für das Licht wechselt An/Aus |
70 | fahrbel(); //Funktion fahrbel() ausführen |
71 | }
|
72 | if (results.value == 3249174918 ){ //Taste für Bremslicht An/Aus |
73 | Bremse != Bremse; //Variable für die Bremse wechselt An/Aus |
74 | carbreak(); //Funktion carbreak() ausführen |
75 | }
|
76 | if (results.value == 3249166758 ){ //Taste für alles Aus |
77 | Warnblinker = 0; //Variable für Warnblinker auf Aus |
78 | Licht = 0; //Variable für Licht auf Aus |
79 | Bremse = 0; //Variable für Warnblinker auf Aus |
80 | digitalWrite (front, LOW); //Vorderlicht leuchtet nicht |
81 | digitalWrite (rear, LOW); //Rücklicht leuchtet nicht |
82 | digitalWrite (left, LOW); //Blinker links leuchtet nicht |
83 | digitalWrite (right, LOW); //Blinker rechts leuchtet nicht |
84 | }
|
85 | }
|
86 | irrecv.resume(); |
87 | }
|
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.