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.
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();
}
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.
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?
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.
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
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.
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.
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
#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;
}
}