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
Selbst programmieren ist angesagt. Besorge dir den richtigen IR-Empfänger und die IRRemote-Library. Mit beiliegenden Beispielen kannst du anfangen zu üben.
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 :/
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.
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.
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.
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.
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.
Ü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!
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.