Led Zufallssteuerung mit Fernbedienung starten bzw. stoppen

Hallo zusammen,

wer weiß hier weiter.
Ich habe folgenden sketch den ich gerne mit der Fernbedienung starten bzw. beenden möchte.
Der Loop soll solange laufen bis man auf der Fernbedienung beendet.
Dann sollen alle LED aus sein.

int i;
int ledarray[] = {2, 3, 4, 5, 6, 8, 9, 10, 12};
void setup()
{
 for (i = 0; i < 9; i++)
 {
   pinMode (ledarray[i], OUTPUT);
 }
}
void loop() {
 i = random(9);
 digitalWrite (ledarray[i], HIGH);
  delay(2000);
 digitalWrite (ledarray[i], LOW);
}

hier mein Ergebnis:

#include <IRremote.h>

int IRpin = 11; // Pin fr den IR Empfaenger

IRrecv irrecv(IRpin);
decode_results results;

boolean LEDon = true; // Initialisieren der Variable LEDon = wahr
int i;
int ledarray[] = {2, 3, 4, 5, 6, 8, 9, 10, 11};
void setup()
{
 for (i = 0; i < 9; i++)
 {
   pinMode (ledarray[i], OUTPUT);
    Serial.begin(9600);
 irrecv.enableIRIn(); // IR Empfaenger starten

 }
}
void loop() {
 i = random(9);
 if (irrecv.decode(&results)) 
 {
 
 irrecv.resume(); // Das Signal empfangen
 }
 
 switch(results.value) 
 {

 case 16753245:// An Aus
  digitalWrite (ledarray[i], HIGH);
  delay(2000);
 digitalWrite (ledarray[i], LOW);

 default: // Standard
 digitalWrite(ledarray[i], LOW);
 
 }
}

Das Problem ist das die LED nur wechselt wenn ich die Fernbedienung 2 mal drücke.

Ich bitte um Hilfe.

Recht herzlichen Dank
Joachim

Du solltest das, was in der "Led-Loop" steht als Funktion im Fernsteuer-Sketch aufrufen.

Dann sollte es funktionieren.
Und mit einem weiteren FB-Code den Lauf wieder stoppen.

Hier ist Dir eine } verrutscht.

for (i = 0; i < 9; i++)
 {
   pinMode (ledarray[i], OUTPUT);
 }  
  Serial.begin(9600);
  irrecv.enableIRIn(); // IR Empfaenger starten

Gruß Tommy

Du kannst den IR Empfänger nicht an ein Ausgangs-LED-Pin 11 anschließen.

Grüße Uwe

Welche Pin sollte dann verwendet werden? :o

Habe den Ausgangspin auf 12 geändert.

Hallo zusammen,

das starten per Fernbedienung funktioniert nun.

Aber das Beenden nicht.

Habe nen 2. ten Fernbedienungscode ergänzt

funktioniert aber nicht, läuft bis zum reset weiter.

#include <IRremote.h>

int IRpin = 11; // Pin fr den IR Empfaenger

IRrecv irrecv(IRpin);
decode_results results;

boolean LEDon = true; // Initialisieren der Variable LEDon = wahr
int i;
int ledarray[] = {2, 3, 4, 5, 6, 8, 9, 10, 12};
void setup()
{
 for (i = 0; i < 9; i++)
 {
   pinMode (ledarray[i], OUTPUT);
 }
    Serial.begin(9600);
 irrecv.enableIRIn(); // IR Empfaenger starten

 
}
void loop() {
 i = random(9);
 if (irrecv.decode(&results)) 

 
 switch(results.value) 
 {

 case 16753245:// An 
  digitalWrite (ledarray[i], HIGH);
  delay(2000);
 digitalWrite (ledarray[i], LOW);


 case 16720605:// Aus
 digitalWrite(ledarray[i], LOW);
 
 }
}

Danke schon mal im vorraus.

Grüße Joachim

Das delay verhindert, dass in der Zeit auf Deine Fernbedienung reagiert werden kann und am Ende vom loop fehlt ein

irrecv.resume();

damit er das nächste Kommando verarbeiten kann.

Gruß Tommy

Danke, habs eingefügt aber keine Reaktion auf irgend ein Tastenbefehl.
Der Monitor registriert kein Code

 case 16720605:// Aus
 digitalWrite(ledarray[i], LOW);
irrecv.resume();

Das ist ja auch nicht am Ende von loop, sondern im Switch. Da kann es nicht helfen.

Gruß Tommy

Sorry habe wohl Tomaten auf den Augen,
du meinst doch hier oder?

habs nun am Ende eingefügt und nun startet nix und reagiert auch nix.

siehe:

void loop() {
 i = random(9);
 if (irrecv.decode(&results)) 
Serial.println(results.value, DEC);

 
 switch(results.value) 
 {

 case 16753245:// An 
  digitalWrite (ledarray[i], HIGH);
  delay(2000);
 digitalWrite (ledarray[i], LOW);


 case 16712445:// Aus
 digitalWrite(ledarray[i], LOW);

 }
  irrecv.resume(); 
}

Es gibt so schöne und viele Beispiele mit der IR-Steuerung, warum nimmst du die nicht als Vorlage ?
Damit machst du dir das doch einfacher.

Danke, habe was gesucht, jedoch funktioniert hier die Zufallssteuerung dann nicht.

Vielleicht hast du mir nen tipp, wäre ich sehr dankbar.

jora:
Danke, habe was gesucht, jedoch funktioniert hier die Zufallssteuerung dann nicht.

Vielleicht hast du mir nen tipp, wäre ich sehr dankbar.

Du solltest einfach mal mit einem einfachen IR-Beispiel anfangen und nur eine Led ein bzw. ausschalten.
Wenn das funktioniert, kannst du weiteres vornehmen.

Hi

Viel mehr als eine (random) LED ein und ausschalten willst Du ja akut nicht machen.

Sollen beim Ausschalten ALLE LED aus gehen?
Dann solltest Du Das auch so schreiben - im Moment wird nur 'eine zufällige LED' je nach Tastendruck AN oder eben AUS geschaltet.

Kommen denn die verschiedenen Codes überhaupt im Programm an?
Siehst Du die verschiedenen Tasten-Nummern?

MfG

Hallo,

Also ich habe einen Code zum testen und auslesen der Hex Tags. Ich habe ihn leicht erweitert. Es ist zwar wieder nur ein Beispiel Code aber bei diesen kann ich sagen das er für Samsung, LG und (bin mir fast sicher) Sony Fernbedienungen funktioniert.

#include "IRremote.h"

const byte IRreceiver = 12;
byte led = 13;

IRrecv irrecv(IRreceiver);
decode_results results;

void setup() {
  Serial.begin(9600);
  Serial.println("IR Rx Start");
  pinMode(led, OUTPUT); // interne LED

  irrecv.enableIRIn();
}
void loop() {

  if (irrecv.decode(&results)) // Wenn ein Signal empfangen wurde:
  {
    Serial.println(results.value, HEX); // Hex Tags sind überischtlicher aber du kannst HEX auf DEC ändern.
    IRsignal(); // Ruft die Funktion IRsignal auf
    irrecv.resume();  // Empängt das nächste Signal
    delay(100);  // Ich weiß nicht mehr warum ich da ein delay() drinnen hab, ist ewig her.
  }
}
void IRsignal() // Wenn ein IR Code empfangen wurde:
{
  switch (results.value)
  {
    case 0xB4B44CB3: // Wenn die Taste mit dem Hex Tag gedrückt wird
      Serial.println("Die Taste X wurde gedrückt");
      digitalWrite(led, HIGH);
      break;
    case 0xB4B4CC33:
      Serial.println("Die Taste Y wurde gedrückt");
      digitalWrite(led, LOW);
      break;
    default:
      Serial.print("Es wurde eine Taste gedrückt, Code: ");
      Serial.println(results.value);
      break;
  }
}

Versuche einmal diesen Code. Funktioniert er nicht, poste es bitte mit Marke der Fernbedienung und Fehlerbeschreibung.
Funktioniert er, dann hast Du schon mal einen funktionierenden Code und kannst diesen an Deine Bedürfnisse anpassen. :wink:

lg dony
Nachtrag: Wie postmaster-ino schon sagte, wird nur eine random LED ein/aus geschaltet, ersetzte mal:

digitalWrite (ledarray[i], HIGH);

durch

digitalWrite (13, HIGH); // Es geht nur darum eine LED Ein/Aus zu schalten

Hallo und Danke erstmal,

so habe nun den Test mit einer LED AN AUS durchgeführt.
Habe auch dein Script verwendet und getestet.
Abgeändert und erfolgreich ausgeführt.

Dann habe ich es wie folgt abgeändert, Ergebnis ->

Anschalten geht ein zufällige LED geht an, nach 2 Secunden aus.
Erst nach erneutem drücken geht wieder eine an und wieder aus.

Es sollte aber automatisch eine zufällige an und wieder ausgehen solange bis ich stop drücke.

Das funzt leider bei mir nicht.

#include "IRremote.h"

const byte IRreceiver = 11;
int ledarray[] = {2, 3, 4, 5, 6, 8, 9, 10, 12};
int i;
IRrecv irrecv(IRreceiver);
decode_results results;

void setup() {
  for (i = 0; i < 9; i++)
  {
    pinMode(ledarray[i], OUTPUT); 
  }
  Serial.begin(9600);
    Serial.println("IR Rx Start");
  irrecv.enableIRIn();
}
void loop() {
  i = random(9);
  if (irrecv.decode(&results)) // Wenn ein Signal empfangen wurde:
  {
    Serial.println(results.value, DEC); // Hex Tags sind überischtlicher aber du kannst HEX auf DEC ändern.
    IRsignal(); // Ruft die Funktion IRsignal auf
    irrecv.resume();  // Empängt das nächste Signal
    delay(100);  // Ich weiß nicht mehr warum ich da ein delay() drinnen hab, ist ewig her.
  }
}
void IRsignal() // Wenn ein IR Code empfangen wurde:
{
  switch (results.value)
  {
    case 16753245: // Wenn die Taste mit dem Hex Tag gedrückt wird
      Serial.println("Die Taste X wurde gedrückt");
      digitalWrite(ledarray[i], HIGH);
      delay(2000);
      digitalWrite(ledarray[i], LOW);
      break;
    case 16712445:
      Serial.println("Die Taste Y wurde gedrückt");
      digitalWrite(ledarray[i], LOW);
      break;
    default:
      Serial.print("Es wurde eine Taste gedrückt, Code: ");
      Serial.println(results.value);
      break;
  }
}

jora:
Es sollte aber automatisch eine zufällige an und wieder ausgehen solange bis ich stop drücke.

Achso, das ist dann programmiertechnisch etwas anderes. So wie Du es beschreibst, macht das Programm genau das was es soll.

Im Prinzip brauchst Du nur das Ein/Aus Sketch von mir, anstelle der LED(13) wird Dein random Programm gestartet. Also so:

  switch (results.value)
  {
    case 0xB4B44CB3: // Wenn die Taste mit dem Hex Tag gedrückt wird
      Serial.println("Das Random Programm wird gestartet");
      randomLEDsOn();
      break;
    case 0xB4B4CC33:
      Serial.println("Das Random Programm wird gestoppt");
      randomLEDsOff();
      break;
    default:
      Serial.print("Code nicht erkannt! Code: ");
      Serial.println(results.value);
      break;
  }

Natürlich ist es nicht ganz so einfach. Würdest Du das ganze in eine Funktion 'randomLEDsOn()' auslagern oder auch direkt den Code einfügen, würdest Du dich aussperren und könntest nicht mehr ausschalten.

Also was brauchst Du?
Eine Status Variable damit das Arduino 'weiß' ob das random Programm läuft oder nicht.
Eine Variable die, die ausgewählte LED speichert.
Und am besten noch eine Status Variable ob die auserwählte LED ein oder ausgeschalten ist.
Natürlich brauchst Du auch eine Variable die, die Zeit (millis()) speichert.

Die Funktion randomLEDsOn() würde sich auf eine Zeile beschränken.

void randomLEDsOn() {
  randProgStat = true;
}

daher kann man sich das sparen und im switch/case nur die Status Variable ändern.
Alles weitere gehört dann unterhalb des switch/case.

Falls dich die millis() iritieren, versuche es anfangs mit delay() und wenn das läuft schau Dir BlinkWithoutDelay() (IDE->Beispiele->Digital) an und versuche es umzusetzen.

Soweit verstanden? Dann versuche es mal und poste das Ergebnis bzw. wenn Du nicht mehr weiter weißt, poste das natürlich auch. :wink:

lg dony

Noch eine Kleinigkeit zum Thema random().

Ein Computer, µC, etc. kann nichts Zufällig machen. Daher werden bei random() nach jeden Reset die gleichen Zahlen in der selben Reihenfolge ausgegeben.
Normalerweiße nimmt man eine RTC (Real-Time-Clock) als Referenz. Da die meißten Arduinos keine RTC (onBoard) haben und man nicht gleich ein RTC Modul anstecken will, nur um einen richtigen Zufallswert zu erhalten kann man sich mit einem freien Analog Eingängen helfen.

Ist nichts am Analog Eingang angeschlossen, erhält man wirklich einen Zufallswert. Meistens liegt der Wert zwischen 200-500. Dieser kann als Referenz für random() hergenommen werden.

lg dony

Guten Morgen und Danke Dony,

habe nun meinen Code umgebaut,
neues Schema, Hab nun eine LED 4 die Blinkt und ich mit der Fernbedienung an und ausschalten kann.
Was ich nicht blicke ist die Zufallsfunktion für 9 LED's.
Diese sollen einzeln zufällig an und wieder ausgehen.

Das an und aus kann ich über millis beeinflussen.

Aber wie funktioniert das random?
Hier hab ich den Faden verloren :confused:

#include <IRremote.h>
int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);
decode_results results;

// LED Blinkt langsam
int led4 = 4;
unsigned long previousMillis = 0;
const long interval = 1000;
#define code1 16753245

unsigned long currentMillis;
uint8_t ledState = LOW;
uint8_t BlinkStatus;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(led4, OUTPUT);      // LED Blinkt
}
void loop() {
  currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
  }

  if (itsONled[4] == 1) {
    digitalWrite(led4, ledState);
  }
  if (irrecv.decode(&results)) {
    unsigned long value = results.value;
    Serial.println(value, DEC);
    switch (value) {
      
      case code1:
        Muster1();
        break;
    }
    irrecv.resume();
  }
}
void Muster1 () {
  if (itsONled[4] == 1) {
    itsONled[4] = 0;
    digitalWrite(led4, LOW);
  }
  else {
    itsONled[4] = 1;
  }
}