Forum: Mikrocontroller und Digitale Elektronik LEDs mit IR Steuern (Modellautobeleuchtung)


von Elias Wr (Gast)


Angehängte Dateien:

Lesenswert?

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!

von Der verdammte Cookie ist schon wieder abgelaufen (Gast)


Lesenswert?

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

von Moko (Gast)


Lesenswert?


von Martin V. (oldmax)



Lesenswert?

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
von Andre (Gast)


Lesenswert?

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.

von HildeK (Gast)


Lesenswert?

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.

von Forist (Gast)


Lesenswert?

Warum schreibst du deinen Programm-Code in eine txt-Datei und nicht in 
eine ino-Datei?

Elias Wr schrieb:
> Code.txt

von Andre K. (andre1980)


Lesenswert?

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
Noch kein Account? Hier anmelden.