Forum: Mikrocontroller und Digitale Elektronik Arduino: IR-Fernb.-Taster festhalten zum ausschalten, kurz drücken zum einschalten


von Willi (Gast)


Lesenswert?

Hi Leute,

ich will mir eine Schaltbox für meine Unterhaltungselektronik bauen, 
pern IR-Fernbedienung schaltbare Steckdose und einen Aux-Umschalter für 
das Audio-System.
Komme aber gerade bei meinem Code dafür nicht weiter, hab mir Einiges 
drchgelesen, u.A. was zu BlinkWithoutDelay, wie es bei Tastern gelöst 
ist und so ziemlich alles, was ich in der Richtung finden konnte.

Wie mache ich das, dass wenn ich eine Taste auf der FB zum Ein- und 
Ausschalten desselben Relais nutzen will, aber zum Ausschalten soll die 
Taste eine Weile gedrückt gehalten werden? Woran ich hänge ist, dass das 
IR-Signal ja nicht konstant ist, also kein Dauer-An und auch der 
empfangene Code kann sich mal ändern, das Letztere kann man ja so lösen, 
dass man einen Wert von bis, abfragt, oder? Ich denke in Richtung einer 
Art von Entprellung, aber weiter komme ich nicht, also wie ich das 
umsetzen kann.

Na jedenfalls bin ich jetz mal wieder total kirre, hoffe ihr könnt den 
Knoten lösen und mir da auf die Sprünge helfen. Gut erklärte 
Code-Schnipsel wären perfekt.

Danke im Voraus und liebe Grüße,

Willi

von Dieter S. (Gast)


Lesenswert?

Selbst programmieren ist angesagt.
Besorge dir den richtigen IR-Empfänger und die IRRemote-Library. Mit 
beiliegenden Beispielen kannst du anfangen zu üben.

von Willi (Gast)


Lesenswert?

Das habe ich ja schon, das ist ja grundsätzlich einfach, hab diesen Code 
noch nicht getestet, nur Teile davon, wie man sieht, habe ich noch 
nichtmal die richtigen FB-Codes
1
#include <IRremote.h>
2
3
// Power switches
4
#define PSW1 2
5
#define PSW2 3
6
#define PSW3 4
7
#define PSW4 5
8
#define PSW5 6
9
10
// Audio switches
11
#define ASW1 7
12
#define ASW2 8
13
#define ASW3 9
14
#define ASW4 10
15
16
// IR-receiver pin setup
17
int RECV_PIN = 11;
18
IRrecv irrecv(RECV_PIN);
19
long int decodedCode;   
20
21
decode_results rcv;
22
23
//check switch-state
24
int on = 0;
25
on = !on;
26
27
void controlRelays(){
28
   
29
   // single Power on/off switches
30
31
   // Power switches
32
   if(decodedCode == 1168) digitalWrite(PSW1, on ? HIGH : LOW);    
33
   if(decodedCode == 3216) digitalWrite(PSW2, on ? HIGH : LOW);    
34
   if(decodedCode == 1441) digitalWrite(PSW3, on ? HIGH : LOW);    
35
   if(decodedCode == 2192) digitalWrite(PSW4, on ? HIGH : LOW);    
36
   if(decodedCode == 6254) digitalWrite(PSW5, on ? HIGH : LOW);
37
   }
38
    
39
   // Audio switch
40
41
   // mp3/bt/radio module
42
   if(decodedCode == 363335){
43
      digitalWrite(ASW1, LOW);
44
      digitalWrite(ASW2, LOW);
45
      digitalWrite(ASW3, LOW);
46
      digitalWrite(ASW4, LOW);
47
   }
48
49
   // Aux1: TV
50
   if(decodedCode == 363335){
51
      digitalWrite(ASW1, HIGH);
52
      digitalWrite(ASW2, HIGH);
53
      digitalWrite(ASW3, LOW);
54
      digitalWrite(ASW4, LOW);
55
   }
56
57
   // Aux2: PC
58
   if(decodedCode == 363335){
59
      digitalWrite(ASW1, HIGH);
60
      digitalWrite(ASW2, LOW);
61
      digitalWrite(ASW3, HIGH);
62
      digitalWrite(ASW4, LOW);
63
   }
64
65
   // Aux3: Laptop
66
   if(decodedCode == 363335){
67
      digitalWrite(ASW1, HIGH);
68
      digitalWrite(ASW2, LOW);
69
      digitalWrite(ASW3, LOW);
70
      digitalWrite(ASW4, HIGH;
71
   }
72
73
   // Mode switches
74
75
   // listen music
76
   if(decodedCode == 363335){
77
      digitalWrite(PSW1, HIGH);
78
      digitalWrite(ASW1, LOW);
79
      digitalWrite(ASW2, LOW);
80
      digitalWrite(ASW3, LOW);
81
      digitalWrite(ASW4, LOW);
82
   }
83
84
   // watch tv
85
   if(decodedCode == 363335){
86
      digitalWrite(PSW2, HIGH);
87
      digitalWrite(ASW1, LOW);
88
      digitalWrite(ASW2, LOW);
89
      digitalWrite(ASW3, LOW);
90
      digitalWrite(ASW4, LOW);
91
   }
92
93
   // watch movie
94
   if(decodedCode == 363335){
95
      digitalWrite(PSW1, HIGH);
96
      digitalWrite(PSW2, HIGH);
97
      digitalWrite(ASW1, HIGH);
98
      digitalWrite(ASW2, HIGH);
99
      digitalWrite(ASW3, LOW);
100
      digitalWrite(ASW4, LOW);
101
   }
102
103
   // all OFF
104
   if(decodedCode == 363335){
105
      digitalWrite(PSW1, LOW);
106
      digitalWrite(PSW2, LOW);
107
      digitalWrite(PSW3, LOW);
108
      digitalWrite(PSW4, LOW);
109
      digitalWrite(PSW5, LOW);
110
111
      digitalWrite(ASW1, LOW);
112
      digitalWrite(ASW2, LOW);
113
      digitalWrite(ASW3, LOW);
114
      digitalWrite(ASW4, LOW);
115
   }
116
117
   delay(300);
118
}
119
120
void setup(){
121
    pinMode(PSW1, OUTPUT);
122
    digitalWrite(PSW1, LOW);
123
    pinMode(PSW2, OUTPUT);
124
    digitalWrite(PSW2, LOW);
125
     pinMode(PSW3, OUTPUT);
126
    digitalWrite(PSW3, LOW);
127
    pinMode(PSW4, OUTPUT);
128
    digitalWrite(PSW4, LOW); 
129
    pinMode(PSW5, OUTPUT);
130
    digitalWrite(PSW5, LOW;
131
132
    pinMode(ASW1, OUTPUT);
133
    digitalWrite(ASW1, LOW); 
134
    pinMode(ASW2, OUTPUT);
135
    digitalWrite(ASW2, LOW);
136
    pinMode(ASW3, OUTPUT);
137
    digitalWrite(ASW3, LOW); 
138
    pinMode(ASW4, OUTPUT);
139
    digitalWrite(ASW4, LOW);
140
141
    Serial.begin(9600);
142
    Serial.println("IR relay controller");
143
    irrecv.enableIRIn(); 
144
}
145
146
void loop(){
147
    if (irrecv.decode(&rcv)) {
148
       Serial.print("Signal received, Value= ");
149
       decodedCode = rcv.value;
150
       Serial.println(decodedCode, DEC);
151
       controlRelays();
152
       irrecv.resume(); 
153
    }
154
}

Ich kriege nur diese Funktion nicht hin :/

von Dieter S. (Gast)


Lesenswert?

Es wäre besser, wenn du klein anfängst und mit den vorhandenen 
Beispielen übst.
Die richtigen Code kannst du dann aus deiner Fernbedienung auslesen.

Ich verstehe aber nicht, warum du deinen Sketch nicht testest, so wirst 
du es nie lernen.

von Willi (Gast)


Lesenswert?

Ich habe schon damit ausreichend rumexperimentiert, alle meine 
Fernbedienungen mal getestet und dabei verschiedenste Funktionen 
ausprobiert und diese nun auf dem Handy so zusammen gefügt, wie ich mir 
vorstellen, dass es funktionieren soll. Nur eine Funktion fehlt, nämlich 
dass ich eine Verzögerung beim Ausschalten einbaue, damit ein 
versehentliches Ausschalten verhinder wird, stehe da aber wie 
geschrieben auf dem Schlauch. Der Sketch ansich ist fehlerfrei, die App 
prüft das automatisch, die Funktionen funktionieren alle, es können nur 
noch Schönheitsfehler sein.

von Dieter S. (Gast)


Lesenswert?

Und warum schreibst du dann, du hast den Sketch noch nicht getestet ?

Zu deiner fehlenden Funktion:
Die IR-Fernbedienungen die ich kenne, geben bei längerem Drücken erst 
den Fernsteuercode aus und anschließend einen zweiten Code, an dem zu 
erkennen ist, dass die Taste länger gedrückt wird. Diesen Code kannst du 
anschließend zur Auswertung nutzen.
Also wenn erst der Steuercode und anschließend für die Zeit x der 
weitere Code kommt, dann ausschalten.

von Willi (Gast)


Lesenswert?

Hab ich ja auch nicht, diesen habe ich noch nicht auf den Arduino 
geladen. Das hat nur eine FB von mir gemacht, die Philips von meiner 
Anlage, aber auch nur bei ein paar Tasten, zu der habe ich auch eine 
Code-Liste von der Lirc Webseite, hab schon früher mit WinLirc 
rumexperimentiert.
Mit geht es wirklich nur um eine elegante, bzw. eine ordentliche Lösung 
dafür, bisher bin ich bei einer verschachtelten If-Abfrage, wenn der 
Code xxx, dann warte, wenn Code (immernoch) xxx, dann mach das, sonst 
das, wenn ende, wenn ende, bzw. wenn Code von xxx bis xxy.

von Jakob (Gast)


Lesenswert?

Aha, da geht es schon mit der Unkenntnis der Funktion von
IR-Fernsteuerungen los.

Fast alle IR-Fernsteuerungen senden bei längerem drücken:
A) Den Code immer wieder, bis man loslässt, oder
B) den Code nur ein-bis-einige Male.

Manche Fernsteurungen (RC5) ändern bei jedem Tastendruck
EIN spezielles Bit, das mit dem restlichen Code nix zu tun hat,
um dem Empfänger mitzuteilen, dass z.B. zweimal die [3] gedrückt
wurde, was '33' heißen soll. Dieses Bit ändert einfach bei JEDEM
neuen Druck JEDER Taste die Polarität. - Schöne Sache, aber hilft
dir nix.

Also:
Die Funktion ON kurz / OFF lang kann vernünftigerweise nur
im Empfänger geschehen.

Du zählst bei den empfangenen Relais-Steuer-Tasten-Codes einfach,
wie oft der gleiche Code empfangen wurde, bis für eine vorgegebene
Zeit kein Code mehr kommt, oder ein anderer Code kommt.

N < Grenzwert: ON, N >= Grenzwert: OFF

NULL Problem, WENN die Fernsteuerung den Tastencode immer
(oder ausreichend oft) wiederholt, solange eine Taste
gedrückt ist.

Abgesehen von der Scheu vor der echten Welt (die Simulator-
App hat aber gesagt...) sehe ich da kein Verwirklichungsproblem.

von Jakob (Gast)


Lesenswert?

Übrigens:
Bei den meisten vernünftigen IR-Fernsteuerungen kommt die
Code-Wiederholung nach einer kurzen Pause, die deutlich
länger, als die Bit-Abstände innerhalb eines Codes ist.

Pause >  10 ms: Code komplett gesendet, aber
                Wiederholung kann noch folgen...

Pause > 100 ms: Taste losgelassen. - Code bearbeiten!

von PittyJ (Gast)


Lesenswert?

Ich habe so etwas ähnliches auch mal gemacht. Läuft jetzt 24/7 um den 
MP3-Player zu steuern.

Ich habe einfach einen TSOP genommen. Die IR-Bibliothek. Und dann mit 
der Fernbedienung draufgehalten. Dann sieht man, was das Ding wirklich 
sendet.
Drückt man länger, liefert bei mir die Bibliothek solange 0xffff, bis 
ich loslasse. Das müßte man dann mitzählen.

Also einfach mal anfangen. Die Ausgaben auf die serielle Konsole, und 
dann wird vieles klarer.

von Willi (Gast)


Lesenswert?

Danke Jakob, also hab ich schon richtig gedacht, Wert von bis, bzw. 
kleiner größer und das in Wenns verschachtelt. Ich habe wie erwähnt 
einige Fernbedienungen ebenso wie Empfänger getestet, aber sowas ist mir 
eben nicht aufgefallen, außer, wie ebenfalls erwähnt, bei der Philips 
Fernbedienung, bei der hat bei manchen Tasten, die an der Stereonlage 
eine Funktion haben und diese auch ausführen, keiner der verwendeten 
Empfänger irgendwas empfangen, bei der Power-Taste dagegen sendet diese 
nach kurzem Halten einem anderen Code, klar, hat ja auch eine Funktion, 
nämlich anstatt ins klassische Standby, in den "Eco Power"-Modus zu 
schalten. Das hat aber sonst keine meiner FB gemacht, manche senden 
scheinbar per zufall immer was anderes bei jedem Drücken, manchmal 
mehrfach dasselbe.
Habe TSOP 1736, -38 und zwei verschiedene Standart-Dinger aus 
irgendwelchen Geräten ausgeschlachtet, die man nie zuordnen kann, bei 
dem einen ist die Linse oval, bei dem anderem rund.

Ich hab auch nichts von Simulator-App geschrieben, ich habe die Hardware 
zusammengestellt und mich dann daran gemacht einen Sketch zu schreiben, 
sowas mache ich lieber auf dem Handy, weil es ganz einfach weniger Strom 
verbraucht als mein Laptop, geschweigedenn mein PC. Ich stand einfach 
auf dem Schlauch, war dabei den Sketch zu schreiben und mir ist garnicht 
erst eingefallen wie ich die nötigen Zeilen in den Sketch tippe, d.h. da 
war einfach noch nichts von der "echten Welt", Arduino und Lappi sind 
griffbereit, hätte ich auch nur den Hauch einer Idee, hätte ich es auch 
ausprobiert, ich bin durch und durch Praktiker, wenn am Ende nichts bei 
rumkommt, was ich mit all meinen Sinnen real wahrnemen kann, hab ich ein 
Problem damit es zu lernen, daher muss ich aus der Praxis lernen.

Leute, seid doch nicht immer gleich so "der will mein Wissen abstauben", 
man sieht das doch eindeutig, wenn das einer will und ich habe um Hilfe 
gebeten, als ob ich beim Klettern keinen Griff finde und jemanden bitte 
meine Hand dahin zu führen und nicht mir nen Fahrstuhl an den Berg zu 
bauen. Ganz so schlimm ist es mit meiner Noobigkeit nicht mehr, dafür 
könnt ihr mich gerne dissen, aber bedenkt bitte auch, dass es ein Hobby 
ist, ich habe garnicht die Zeit und Energie jedes Teilgebiet der 
Elektronik zu studieren, sonst hätte ich das auch gleich an eine Uni 
machen können, oder? Wenn jeder Experte wäre, wäre dieses Forum unnötig 
und ihr hättet keine Anfänger zu drauf rumhacken ;))))

Naja, musste ich mal loswerden. Werds heute nschmittag mal so probieren 
und dann evtl. nochmal nachfragen.

Danke und lieben Gruß,

Willi

von oldeurope O. (Gast)


Lesenswert?

Willi schrieb:
> Nur eine Funktion fehlt, nämlich
> dass ich eine Verzögerung beim Ausschalten einbaue


Ich meine, da kann ich Dir helfen.
Bin blutiger Anfänger, habe aber so ein Problem
gelöst auf der Basis von blinkwithoutdelay

Beitrag "Re: Arduino UNO retriggerbares Monoflop if while"

Mit diesem Sketch kannst Du verzögert schalten.
Für Dich ist die Einstellung intervalb für die
Verzögerung und intervala machst Du unmerklich kurz.

LG
old.

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.