Forum: Mikrocontroller und Digitale Elektronik Arduino 3 Kanal IR Steckdose


von Arik N. (arik)


Lesenswert?

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
int RECV_PIN = 11;
6
7
IRrecv irrecv(RECV_PIN);
8
9
decode_results results;
10
11
12
int H=0;
13
14
int Hifi=2;         //Taster für Hifi
15
16
int lHifi=8;        //Statusled Hifi
17
int lTv=9;          //Statusled Tv  
18
int lHandy=10;      //Statusled Handy
19
20
int rHifi=5;        //Relai für Hifi
21
int rTv=6;          //Relai für TV
22
int rHandy=7;       //Relai für Handy
23
24
void setup() {
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
void loop() {
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)
58
   {digitalWrite (lHifi, HIGH);}
59
   digitalWrite (rHifi, LOW);}
60
    
61
  if (results.value == 16724175) 
62
   {digitalWrite (lHifi, HIGH);
63
    digitalWrite (rHifi, LOW);}
64
    irrecv.resume();            
65
    
66
  if (results.value == 16753245) 
67
    {digitalWrite (lHifi, LOW);
68
    digitalWrite (rHifi, HIGH);}
69
    irrecv.resume();            
70
71
  
72
  
73
  if (results.value == 16718055) 
74
    {digitalWrite (lTv, HIGH);
75
    digitalWrite (rTv, LOW);}
76
    irrecv.resume();            
77
78
  if (results.value == 16736925) 
79
    {digitalWrite (lTv, LOW);
80
    digitalWrite (rTv, HIGH);}
81
    irrecv.resume();            
82
  
83
  
84
  
85
  if (results.value == 16743045) 
86
    {digitalWrite (lHandy, HIGH);
87
    digitalWrite (rHandy, LOW);}
88
    irrecv.resume();            
89
90
  if (results.value == 16769565) 
91
    {digitalWrite (lHandy, LOW);
92
    digitalWrite (rHandy, HIGH);}
93
    irrecv.resume();            
94
}
95
}

: Verschoben durch User
von W.A. (Gast)


Lesenswert?

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?

von Arik N. (arik)


Lesenswert?

> und bst du sicher, dass die magischen Konstanten überhaupt zu dem
> Datentyp passen?

neee... ich weiß leider auch keine andere Lösung...

von Arik N. (arik)


Lesenswert?

> 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.

von Joachim .. (joachim_01)


Lesenswert?

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.

von Arik (Gast)


Lesenswert?

Ja stimmt jetzt seh ich den Fehler auch !! Das sollte ich hinbekommen... 
Vielen Dank

von Dieter S. (Gast)


Lesenswert?

Du kannst die Tasterabfrage auch vor die IR-Abfrage legen.
Es braucht dazu keinen Interrupt.

Z.B. so:
1
void loop() {
2
3
  H = digitalRead(Hifi);
4
5
  if (H == HIGH) {       //wenn H= HIGH, dann Statusled an und Relai an(LOW)
6
    digitalWrite (lHifi, HIGH);
7
    digitalWrite (rHifi, LOW);
8
  }
9
10
  // Hier alle Taster abfragen
11
12
13
  if (irrecv.decode(&results)) {        //
14
    Serial.println(results.value, DEC);   // IR Befehle am Seriellen Monitor ausgeben
15
16
    if (results.value == 16724175) {
17
     digitalWrite (lHifi, HIGH);
18
      digitalWrite (rHifi, LOW);
19
    }
20
    
21
22
    if (results.value == 16753245) {
23
     digitalWrite (lHifi, LOW);
24
      digitalWrite (rHifi, HIGH);
25
    }
26
    irrecv.resume();
27
  }
28
    // usw....

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch Moderator
von Dieter S. (Gast)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Arik (Gast)


Lesenswert?

>Komisch, das dies bei mir schon länger funktioniert.
Könntest du mir vielleicht ein Beispiel zeigen oder einen Ausschnitt 
deines Codes??

von Dieter S. (Gast)


Lesenswert?

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.

von Arik N. (arik)


Lesenswert?

jetzt funktioniert es !!! Super !!! Vielen Dank !!!

von Arik N. (arik)


Lesenswert?

Achso... eine Frage noch ! Ist es möglich über den gleichen Schalter die 
Dose wieder auszuschalten?

von Route_66 H. (route_66)


Lesenswert?

Arik N. schrieb:
> Achso... eine Frage noch ! Ist es möglich über den gleichen Schalter die
> Dose wieder auszuschalten?

Ja!

von Arik (Gast)


Lesenswert?

Route 6. schrieb:
> Ja!

Und wie ???

von Route_66 H. (route_66)


Lesenswert?

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.

von Arik N. (arik)


Lesenswert?

>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.

von Route_66 H. (route_66)


Lesenswert?

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...

von Dieter S. (Gast)


Lesenswert?

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.

von Arik N. (arik)


Lesenswert?

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

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.