LEDs mit IR Steuern (Modellautobeleuchtung)

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.

Hier der Code:

#include <IRremote.h>
int irPin = 13; //Pin am Arduino Nano für den IR Receiver
int front = 4; //Pin am Arduino Nano für Frontbeleuchtung weiß
int rear = 5; //Pin am Arduino Nano für Rückbeleuchtung rot
int right = 6; //Pin am Arduino Nano für Blinker rechts
int left = 7; //Pin am Arduino Nano für Blinker links

IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung
decode_results results;
void setup() {
  pinMode (front, OUTPUT);
  pinMode (rear, OUTPUT);
  pinMode (right, OUTPUT);
  pinMode (left, OUTPUT);
  pinMode(irPin, INPUT);  //Den IR Pin als Eingang deklarieren.
  irrecv.enableIRIn(); //Den IR Pin aktivieren
  Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen.
}
void warnblinker () {
  digitalWrite (left, HIGH);
  digitalWrite (right, HIGH);
  delay (300);
  digitalWrite (left, LOW);
  digitalWrite (right, LOW);
  delay (300);
}
void fahrbel () {
  digitalWrite (front, HIGH);
  analogWrite (rear, 100);
}
void lightout () {
  digitalWrite (front, LOW);
  digitalWrite (rear, LOW);
  digitalWrite (left, LOW);
  digitalWrite (right, LOW);
}
void carbreak () {
  digitalWrite (rear, HIGH);
}

void loop() {
  if (irrecv.decode(&results)) {
    if (results.value == 3249208323 ) {
      warnblinker();
    }
    if (results.value == 3249193533 ) {
      fahrbel ();
    }
    if (results.value == 3249174918) {
      carbreak ();
    }
    if (results.value ==  3249166758 ) {
      lightout ();
    }
    irrecv.resume();
  }

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!

code.txt (1.49 KB)

EWR:
Mein Problem ist …

… dass Du mehrere Dinge quasi gleichzeitig machen möchtest: Es soll blinken während gleichzeitig auf eine Taste oder eingehende IR-Befehle reagiert werden soll.

Mach’ Dich mit dem „Programmier-Strickmuster“ eines endlichen Automaten vertraut. Guck z.B. hier.

Gruß

Gregor

Setze deinen Sketch bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken, oder [ code] davor und [ / code] dahinter ohne Leerzeichen.
Oder
im IDE-Fenster rechte Maustaste und für “Forum kopieren klicken”, danach hier einfügen.

Das kannst du in deinem Startbeitrag noch nachträglich machen.

Damit wird dieser für alle besser lesbar.

Und welche Schleife für den Blinker meinst du ?
Du brauchst keine zusätzliche Schleife, da du mit loop schon eine Schleife hast.

Sieh dir das Beispiel BlinkWithoutDelay in der IDE an. Damit kannst du auch deinen Blinker ohne Blockade aufbauen.

Hallo
eine kleine Hilfe zum Start in das Forum.

int irPin = 13; //Pin am Arduino Nano für den IR Receiver
int front = 4; //Pin am Arduino Nano für Frontbeleuchtung weiß
int rear = 5; //Pin am Arduino Nano für Rückbeleuchtung rot
int right = 6; //Pin am Arduino Nano für Blinker rechts
int left = 7; //Pin am Arduino Nano für Blinker links

IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung
decode_results results;
void setup() {
  	pinMode (front,OUTPUT);
  	pinMode (rear, OUTPUT);
  	pinMode (right, OUTPUT);
  pinMode (left, OUTPUT);
  	pinMode(irPin, INPUT);  //Den IR Pin als Eingang deklarieren.
 	 irrecv.enableIRIn(); //Den IR Pin aktivieren
  	Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen.
}
void warnblinker (){
 	digitalWrite (left, HIGH);
  	digitalWrite (right, HIGH);
  	delay (300);
   	digitalWrite (left, LOW);
digitalWrite (right, LOW);
  	delay (300);
   }
void fahrbel (){
  	digitalWrite (front, HIGH);
  	analogWrite (rear, 100);
}
void lightout (){
  	digitalWrite (front, LOW);
  	digitalWrite (rear, LOW);
  	digitalWrite (left, LOW);
  	digitalWrite (right, LOW);
  }
void carbreak (){
  	digitalWrite (rear, HIGH);
}
  
void loop(){
 	if (irrecv.decode(&results)) {
if (results.value == 3249208323 ){
 			 warnblinker();
  		}
if (results.value == 3249193533 ){
 			 fahrbel ();
}
if (results.value == 3249174918){
carbreak ();
}
if (results.value ==  3249166758 ){
   			lightout ();
}
 irrecv.resume();
}

EWR:
Hat irgendjemand eine Idee wie ich das Problem lösen kann.

Gibt es einen Grund, warum du den IR-Empfänger auf den Pin D13 gelegt hast ?
Das solltest du ändern, da der Pin D13 für di Onboard-Led verwendet wird und damit den Pin negativ beeinflussen kann. Das kann auch bei deinem Projekt zu einem Problem führen.

Hallo
ich habe mal schnell den Sketch überflogen und eine statische Variable für den IR-Code eingefügt. Probier mal aus, ich habe zur Zeit keine Möglichkeit zum Testen.

#include <IRremote.h>
int irPin = 13; //Pin am Arduino Nano für den IR Receiver
int front = 4; //Pin am Arduino Nano für Frontbeleuchtung weiß
int rear = 5; //Pin am Arduino Nano für Rückbeleuchtung rot
int right = 6; //Pin am Arduino Nano für Blinker rechts
int left = 7; //Pin am Arduino Nano für Blinker links

IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung
decode_results results;
void setup() {
  pinMode (front, OUTPUT);
  pinMode (rear, OUTPUT);
  pinMode (right, OUTPUT);
  pinMode (left, OUTPUT);
  pinMode(irPin, INPUT);  //Den IR Pin als Eingang deklarieren.
  irrecv.enableIRIn(); //Den IR Pin aktivieren
  Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen.
}
void warnblinker () {
  digitalWrite (left, HIGH);
  digitalWrite (right, HIGH);
  delay (300);
  digitalWrite (left, LOW);
  digitalWrite (right, LOW);
  delay (300);
}
void fahrbel () {
  digitalWrite (front, HIGH);
  analogWrite (rear, 100);
}
void lightout () {
  digitalWrite (front, LOW);
  digitalWrite (rear, LOW);
  digitalWrite (left, LOW);
  digitalWrite (right, LOW);
}
void carbreak () {
  digitalWrite (rear, HIGH);
}
void loop() {
  static unsigned long resultsvalue = 0; // eine statische Variable für den IR-Code
  if (irrecv.decode(&results)) {resultsvalue = results.value,  irrecv.resume();}
  if (resultsvalue == 3249208323) warnblinker();
  if (resultsvalue == 3249193533) fahrbel ();
  if (resultsvalue == 3249174918) carbreak ();
  if (resultsvalue == 3249166758) lightout ();
}

Ich habe den Sketch angepasst und den Funktionsaufruf für irrecv.resume(); umgeparkt :slight_smile:

EWR:
Hat irgendjemand eine Idee wie ich das Problem lösen kann.

Vergiß delay(), verwende millis()!

Eventuell so (ungetestet):

#include <IRremote.h>
const byte irPin = 13; //Pin am Arduino Nano für den IR Receiver
const byte front = 4; //Pin am Arduino Nano für Frontbeleuchtung weiß
const byte rear = 5; //Pin am Arduino Nano für Rückbeleuchtung rot
const byte right = 6; //Pin am Arduino Nano für Blinker rechts
const byte left = 7; //Pin am Arduino Nano für Blinker links
byte wb_zaehler = 255;
uint32_t jetzt;

IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung
decode_results results;
void setup() {
  pinMode (front, OUTPUT);
  pinMode (rear, OUTPUT);
  pinMode (right, OUTPUT);
  pinMode (left, OUTPUT);
  pinMode(irPin, INPUT);  //Den IR Pin als Eingang deklarieren.
  irrecv.enableIRIn(); //Den IR Pin aktivieren
}

void warnblinker () {
  static uint32_t vorhin = jetzt;
  if ((jetzt - vorhin >= 300) && (wb_zaehler < 8)) {
    vorhin = jetzt;
    wb_zaehler++;
    digitalWrite (left, !digitalRead(left));
    digitalWrite (right, !digitalRead(right));
  }
}

void fahrbel () {
  digitalWrite (front, HIGH);
  analogWrite (rear, 100);
}

void lightout () {
  digitalWrite (front, LOW);
  digitalWrite (rear, LOW);
  digitalWrite (left, LOW);
  digitalWrite (right, LOW);
}

void carbreak () {
  digitalWrite (rear, HIGH);
}

void loop() {
  jetzt = millis();
  warnblinker();
  if (irrecv.decode(&results)) {
    if (results.value == 3249208323 ) {
      if (wb_zaehler >= 8) wb_zaehler = 0;
    }
    if (results.value == 3249193533 ) {
      fahrbel ();
    }
    if (results.value == 3249174918) {
      carbreak ();
    }
    if (results.value ==  3249166758 ) {
      lightout ();
    }
    irrecv.resume();
  }
}

Oder Du verwendest die MobaTools, dann musst Du dich nicht direkt mit den millis() rumschlagen :wink:

#include <IRremote.h>
#include <MobaTools.h>

const uint32_t  KEY_1  = 3249208323;  // Warnblinker ein/aus
const uint32_t  KEY_2  = 3249193533;  // Fahrbeleichtung
const uint32_t  KEY_3  = 3249174918;  // Bremse
const uint32_t  KEY_4  = 3249166758;  // alles aus

int irPin = 13; //Pin am Arduino Nano für den IR Receiver
int front = 4; //Pin am Arduino Nano für Frontbeleuchtung weiß
int rear = 5; //Pin am Arduino Nano für Rückbeleuchtung rot
int right = 6; //Pin am Arduino Nano für Blinker rechts
int left = 7; //Pin am Arduino Nano für Blinker links

IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung
decode_results results;

MoToTimer warnBlinkTimer;
bool warnBlinkerAktiv;

void setup() {
  pinMode (front, OUTPUT);
  pinMode (rear, OUTPUT);
  pinMode (right, OUTPUT);
  pinMode (left, OUTPUT);
  pinMode(irPin, INPUT);  //Den IR Pin als Eingang deklarieren.
  irrecv.enableIRIn(); //Den IR Pin aktivieren
  Serial.begin(115200); //Serielle kommunikation mit 115200 Baud beginnen.
}
void warnblinker () {
  if ( warnBlinkerAktiv ) {
    /// Warnblinker eingeschaltet
    if ( !warnBlinkTimer.running()) {
      digitalWrite (left, !digitalRead(left) );
      digitalWrite (right, !digitalRead(right));
      warnBlinkTimer.setTime(300);
    }
  } else {
    //Warnblinker ausgeschaltet
    digitalWrite (left, LOW);
    digitalWrite (right, LOW);
  }

}
void fahrbel () {
  digitalWrite (front, HIGH);
  analogWrite (rear, 100);
}
void lightout () {
  digitalWrite (front, LOW);
  digitalWrite (rear, LOW);
  digitalWrite (left, LOW);
  digitalWrite (right, LOW);
}
void carbreak () {
  digitalWrite (rear, HIGH);
}

void loop() {
  if (irrecv.decode(&results)) {
    if (results.value == KEY_1 ) {
      // Warnblinker ein/ausschalten
      warnBlinkerAktiv = !warnBlinkerAktiv;
    }
    if (results.value == KEY_2 ) {
      fahrbel ();
    }
    if (results.value == KEY_3) {
      carbreak ();
    }
    if (results.value ==  KEY_4 ) {
      lightout ();
      warnBlinkerAktiv = false;
    }
    irrecv.resume();
  }
  warnblinker();
}

Wobei bei mir Pin 13 nicht funktioniert, ich musste Pin 11 nehmen.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.