Hallo,
ich möchte eine Steckdosenleiste so umbauen, dass ich sie sowohl über
eine IR Fernbedienung als auch über einen Taster jeden Anschluss separat
ansteuern kann. Habe drei Anschlüsse geplant ( Hifi, Tv und QI
Ladestation fürs Handy. Jeder Anschluss wird durch ein Relai geschalten.
Mit der IR Steuerung klappt das schon super ... das Problem ist nur der
Taster... irgendwie reagiert der nicht ! wenn man nur das Tasterprogramm
ohne den ganzen anderen IRramsch probiert dann funktioniert das
komischerweise. Kann es sein das sich da irgendetwas stört ?? Ich hab
keinen Plan mehr... Vielen Dank schon mal :)
1
//3 Kanal Schaltdose für Elektronik
2
3
#include<IRremote.h>
4
5
intRECV_PIN=11;
6
7
IRrecvirrecv(RECV_PIN);
8
9
decode_resultsresults;
10
11
12
intH=0;
13
14
intHifi=2;//Taster für Hifi
15
16
intlHifi=8;//Statusled Hifi
17
intlTv=9;//Statusled Tv
18
intlHandy=10;//Statusled Handy
19
20
intrHifi=5;//Relai für Hifi
21
intrTv=6;//Relai für TV
22
intrHandy=7;//Relai für Handy
23
24
voidsetup(){
25
26
Serial.begin(9600);
27
28
pinMode(lHifi,OUTPUT);
29
pinMode(lTv,OUTPUT);
30
pinMode(lHandy,OUTPUT);
31
32
pinMode(rHifi,OUTPUT);
33
pinMode(rTv,OUTPUT);
34
pinMode(rHandy,OUTPUT);
35
36
digitalWrite(lHifi,LOW);
37
digitalWrite(lTv,LOW);
38
digitalWrite(lHandy,LOW);
39
40
digitalWrite(rHifi,HIGH);//Relai = aus
41
digitalWrite(rTv,HIGH);// -||-
42
digitalWrite(rHandy,HIGH);// -||-
43
44
pinMode(Hifi,INPUT);
45
46
irrecv.enableIRIn();
47
48
}
49
50
voidloop(){
51
52
if(irrecv.decode(&results)){//
53
Serial.println(results.value,DEC);// IR Befehle am Seriellen Monitor ausgeben
54
55
H=digitalRead(Hifi);
56
57
if(H==HIGH)//wenn H= HIGH, dann Statusled an und Relai an(LOW)
Arik N. schrieb:> Kann es sein das sich da irgendetwas stört ??
Das ist zu vermuten. Wie ist denn der Datentyp decode_results deklariert
und bst du sicher, dass die magischen Konstanten überhaupt zu dem
Datentyp passen?
> Wie ist denn der Datentyp decode_results deklariert
???
Dieser Befehl sorgt dafür, dass die Daten, die per Infrarot eingelesen
werden unter „results“ abgespeichert werden.
Typischer Ablauffehler durch Gedankenlosigkeit, tät' ich mal sagen.
Ohne jetzt den Code zu kennen vermute ich, daß die Funktion:
(irrecv.decode(&results));
nur verlassen wird wenn sie etwas empfangen hat. Dahinter
(zeittechnisch)liegt aber deine Tasterabfrage. Das beißt sich natürlich.
Die IR- und Tasterabfrage muß aber gwissermaßen gleichzeitig laufen. Das
ließe sich elegant lösen wenn man den Taster im Interrupt abfragt, für
jemanden der aber noch nicht einmal weiß wie man das Wort "Relais"
richtig schreibt dürfte das ziemlich sportlich werden ;-)
Alternativ: Du mußt
(irrecv.decode(&results));
so umbauen, daß darin auch der (oder die) Taster abgefragt werden und
der entsprechende 32bit-Wert zurückgeschickt wird. Programmiertechnisch
ist das aber ziemlicher Murks da dadurch die Wiederverwendbarkeit und
Leserlichkeit der Bibliotheken leidet.
Dieter S. schrieb:> Du kannst die Tasterabfrage auch vor die IR-Abfrage legen.
Genial. Wenn man nach dem Start schnell genug drückt, könnte es sogar
klappen. Wieviel Zeit habe ich? Ein paar µsec? Danach hängt das Ding
nämlich trotzdem im IR-Receiver.
> Es braucht dazu keinen Interrupt.
Denk nochmal nach.
Joachim .. schrieb:> Ohne jetzt den Code zu kennen vermute ich, daß die Funktion:>> (irrecv.decode(&results));>> nur verlassen wird wenn sie etwas empfangen hat.
Bist Du da sicher? Wenn ich nach irrecv.decode suche, lese ich in den
Beschreibungen was anderes. Das Ding kommt mit FALSE zurück, wenn nichts
empfangen wurde, sonst TRUE. Alles andere wäre auch Unsinn.
Frank M. schrieb:> Dieter S. schrieb:>> Du kannst die Tasterabfrage auch vor die IR-Abfrage legen.>> Genial. Wenn man nach dem Start schnell genug drückt, könnte es sogar> klappen. Wieviel Zeit habe ich? Ein paar µsec? Danach hängt das Ding> nämlich trotzdem im IR-Receiver.>>> Es braucht dazu keinen Interrupt.>> Denk nochmal nach.
Da frage ich mich, wer hier nachdenken muss.
Komisch, das dies bei mir schon länger funktioniert.
Da beides in der Loop läuft, wird es nacheinander abgefragt.
Nach deiner Aussage müsste es ja in der "irrecv.decode(&results)"
Funktion hängen bleiben und das tut es nicht.
Dieter S. schrieb:> Da beides in der Loop läuft, wird es nacheinander abgefragt.
Eben. Und dabei ist es in der Loop scheißegal, ob erst die Tasten und
dann das IR-Signal oder umgekehrt abgefragt werden.
Was soll es bringen, die Abfrage von
Ereignis 1
Ereignis 2
Ereignis 1
Ereignis 2
Ereignis 1
Ereignis 2
...
auf
Ereignis 2
Ereignis 1
Ereignis 2
Ereignis 1
Ereignis 2
Ereignis 1
...
abzuändern?
Zudem wurde hier
Beitrag "Re: Arduino 3 Kanal IR Steckdose"
vermutet, dass irrecv.decode() hängt, solange kein IR-Signal eintrifft.
Ich programmiere keine Arduinos, halte diese Vermutung aber für sehr
gewagt. So schlecht kann keine Lib sein.
Arik schrieb:>>Komisch, das dies bei mir schon länger funktioniert.> Könntest du mir vielleicht ein Beispiel zeigen oder einen Ausschnitt> deines Codes??
Mein Beispiel findest du schon hier im Thread. Siehe weiter oben.
Deine IR-Auswertung ist soweit ok.
Du musst nur mein Beispiel vor oder hinter die gesamte IR-Auswertung
setzen.
Ein Interrupt ist def. nicht nötig, auch wen andere Spezis das
behaupten.
Arik schrieb:> Route 6. schrieb:>> Ja!>> Und wie ???
Die Frage ist wohl jetzt nicht ernst gemeint?
Ganz einfach: wenn das Relais ausgeschaltet ist, dann wird bei einem
Tastendruck eingeschaltet. Wenn das Relais aber eingeschaltet ist, dann
wird bei einem Tastendruck ausgeschaltet.
>Ganz einfach: wenn das Relais ausgeschaltet ist, dann wird bei einem>Tastendruck eingeschaltet. Wenn das Relais aber eingeschaltet ist, dann>wird bei einem Tastendruck ausgeschaltet.
Das ist mir schon klar...
Ich möchte das aber nur über einen Taster steuern. Mit einem Taster an
und auch wieder aus schalten.
Arik N. schrieb:> Ich möchte das aber nur über einen Taster steuern. Mit einem Taster an> und auch wieder aus schalten.
Genau das habe ich beschrieben...
Dazu speicherst du den aktuellen Zustand in einer Variablen ab und
wechselst diesen Zustand bei jedem betätigen des Tasters.
Abhängig vom Inhalt der Variablen schaltest du deinen Ausgang.
Dieter S. schrieb:> Dazu speicherst du den aktuellen Zustand in einer Variablen ab und> wechselst diesen Zustand bei jedem betätigen des Tasters.> Abhängig vom Inhalt der Variablen schaltest du deinen Ausgang.
Super Idee !! Danke