Arduino 3 Kanal IR Steckdose

OP #4423384
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
}
#4423574
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.
Gast #4423725
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....
Moderator Persönliche Seite #4423732
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.
Gast #4423760
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.
Moderator Persönliche Seite #4423768
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.
Gast #4423819
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.
OP #4424284
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren