Hallo zusammen, ich habe eine Auswertesoftware für die Doppel-Funkschalter ITW-852 von Intertechno geschrieben. Das beigefügte Bild zeigt die Signale beim Drücken der 2 Wippen am Funkschalter. Mit einem einfachen 433 MHz Empfänger wie z.B. diesem hier http://www.ebay.de/itm/5X-433-Mhz-RF-Sender-Empfanger-Receiver-Modul-Arduino-Wireless-Transmitter-TE122-/201312653471 an Pin 2 (Interrupt 0) des Arduinos wertet er die übertragenen Daten aus. Das klappt soweit ganz gut. Geliefert werden üppige 33 Symbole, die den Wert 1 - 3 annehmen können (Anzahl der Impulse pro Symbol). Das Testprogramm gibt sie als String mit 33 Zeichen aus. Allerdings tue ich mich mit der Interpretation noch etwas schwer, da ich nur zwei solcher Taster habe. Klar ist, dass die letzten beiden Symbole (Stelle 32 und 33) sich mit der gedrückten Taste ändern: linke Taste: 31 rechte Taste: 22 Und dass die Stellen 28 und 29 für On (Wippe nach unten) oder Off (Wippe nach oben) stehen: On: 12 Off: 21 Die 27 Stellen davor sind vermutlich je Taster unterschiedlich und eindeutig. Bei meinen zwei Testmodellen sind es übrigens diese Werte: 1: 213213123123222122232212232123122 2: 213213123123122222321312232213122 Die ersten 12 Stellen sind gleich, was natürlich Zufall sein kann. Aber das ergibt mal folgende vorläufige Aufteilung: 213213123123 222122232212232 12 31 22 fest Gerätenummer ON/OFF ?? Taste 1/2 Ich würde mich freuen, wenn sich Mitstreiter fänden, die ihre ITW-Produkte mal auf den Auswerter loslassen würden und die Ergebnisse mitteilen. Denn ich denke, es gibt noch mehr Struktur im Code. Gruß Jens PS. Die Empfangsqualität scheint mir noch optimierbar, vielleicht sind manche Zeiten noch etwas knapp toleriert. PPS. Ja, es ist eine Arduino-Library. PPPS. Ja, den Interrupt so zu benutzen, ist nicht optimal, aber der Prozessor soll sonst nicht viel machen.
Hallo vielen Dank fuer die Library, sie hat mir sehr geholfen, die ITW-852 auszulesen! Meine beiden Schalter liefern die Einschalt-Codes: 222123212222313122222231232123122 222123212222313122222231232123131 und 213213123122223122313212232123122 213213123122223122313212232123131 (jeweils links dann rechts gedrückt) lg, T
Hallo Ursus(?), danke für Deine Rückmeldung. Das sind also die 4 bisher bekannten Codes: 213213123123222122232212232 12 31 22 213213123123122222321312232 12 31 22 213213123122223122313212232 12 31 22 222123212222313122222231232 12 31 22 Meine Fantasie reicht gerade nicht aus, um darin ein Schema zu erkennen... Ich werde mir die Lib in Kürze noch einmal anschauen: Im praktischen Betrieb hat bei mir die Erkennungsqualität nicht ausgereicht, deswegen habe ich die Taster derzeit nicht im Einsatz. Für einen anderen Zweck habe ich aber gute Ergenisse mit diesem Empfänger gemacht: https://de.aliexpress.com/item/433Mhz-RF-module-Upgraded-version-For-WL101-341-Superheterodyne-433-mhz-Wireless-Receiver-Modules-Diy-Kit/32724501134.html Mal sehen, ob es damit auch für den ITW besser wird. Wobei der Trend ja eher zum WLAN-Schalter geht... Gruß Jens
Hallo Jens Vielen Dank für diese Library. Haben Sie etwas ändert (gestatte, get Adress,...) ? Ich habe diese Code gefunden mit ein FB: Schalter 1/2 on 222132131232222212222231232132221 off 222132131232222212222231232222221 Schalter 2/2 on 222132131232222212222231232132212 off 222132131232222212222231232222212 Danke Gruss
Hallo Syl, ich habe das nicht mehr weiterverfolgt, sondern die Schaltermechanik genommen und dahinter ein Wifi-Modul gesetzt (Wemos D1 mit ESP8266). Das hilft Dir vermutlich nicht weiter, aber eine bessere Nachricht habe ich leider nicht. Danke für Deine Codes, ich packe sie in meine Sammlung. Grüße Jens
Danke Jens, Noch eine Frage, Falls drücken wir für < 2 Sekunden es dekodiert nichts ? (Ich benütze ein ITKL2). Ist es möglich auf die kurze Drücke zu dekodieren? Danke Gruss
Hallo Syl, wenn ich mit den Source-Code anschaue, dann kann die relativ lange Verzögerung eigentlich nur daher kommen, dass vorher kein gültiger Code erkannt wird. Hier im .cpp-File werden ja Zeitfenster für die Erkennung definiert: // longer low after start pulse #define T_START_LOW_MIN (2000/T_US) #define T_START_LOW_MAX (3500/T_US) // min/max high pulse #define T_HIGH_MIN (50/T_US) #define T_HIGH_MAX (500/T_US) // min/max short low #define T_LOW_SHORT_MIN (80/T_US) #define T_LOW_SHORT_MAX (650/T_US) // min/max long low #define T_LOW_LONG_MIN (800/T_US) #define T_LOW_LONG_MAX (2000/T_US) Vielleicht hilft es, die Fenster breiter zu machen, also mal als plumpes Beispiel: // longer low after start pulse #define T_START_LOW_MIN (1000/T_US) #define T_START_LOW_MAX (4000/T_US) // min/max high pulse #define T_HIGH_MIN (50/T_US) #define T_HIGH_MAX (800/T_US) // min/max short low #define T_LOW_SHORT_MIN (50/T_US) #define T_LOW_SHORT_MAX (700/T_US) // min/max long low #define T_LOW_LONG_MIN (750/T_US) #define T_LOW_LONG_MAX (2500/T_US) Einen Versuch ist es auf jeden Fall wert.... Grüße Jens
Vielen Dank Jens! Problem gefunden. Die Sender war zu nah des Empfängers! Ich wünsche dekodieren wenn es gibt 1 klick oder 2 klick auf die Sender. Aber manchmal für die gleiche kurze Drück es gibt 2 gleichen Code statt 1. Was machen ? Habe ich delay (1000) probiert aber das ist nicht schön und funktioniert nicht weil sind die Interrupt immer da! Was kann ich machen ? Danke für diene Idee (Entschuldigung für mein Deutsch, das ist nicht meine Muttersprache!!)
Syl W. schrieb: > > Aber manchmal für die gleiche kurze Drück es gibt 2 gleichen Code statt > 1. > Hallo Syl, das Problem habe ich auch, es ist nicht so einfach in der Library zu lösen, da diese keine Zeit kennt. Im Beispielprogramm ist das die Hauptschleife:
1 | void loop() { |
2 | if ( itw.available() ) { |
3 | Serial.println ( (char *)itw.getData() ); |
4 | itw.release(); |
5 | }
|
6 | }
|
Diese könnte so verändert werden:
1 | void loop() { |
2 | if ( itw.available() ) { |
3 | Serial.println ( (char *)itw.getData() ); |
4 | delay (500); |
5 | itw.release(); |
6 | }
|
7 | }
|
Denn erst mit dem release() wird der Empfänger wieder aktiv geschaltet. Aber natürlich ist Dein Programm dann für eine Zeit blockiert (hier 500ms, mit der Zeit müsste man vermutlich etwas spielen). Wenn das für Dich ok ist, sollte das Problem sich so lösen lassen. Wenn nicht, dann vielleicht so:
1 | uint32_t releaseTime = 0; |
2 | |
3 | void loop() { |
4 | if ( !releaseTime && itw.available() ) { |
5 | Serial.println ( (char *)itw.getData() ); |
6 | releaseTime = millis() + 500; |
7 | }
|
8 | if ( releaseTime && releaseTime > millis() ) { |
9 | itw.release(); |
10 | releaseTime = 0; |
11 | }
|
12 | // hier kann jetzt immer noch etwas anderes gemacht werden
|
13 | }
|
Wie funktioniert es: Wenn etwas empfangen wird, wird es ausgegeben und
die Variable releaseTime auf einen Zeitpunkt in der Zukunft (auch hier
500ms) gesetzt. Erst wenn diese Zeit verstrichen ist, wird release()
aufgerufen. releaseTiem wird zugleich verwendet, um zu erkennen, ob
gerade auf ein release gewartet wird.
Der Vorteil ist, dass die Schleife nicht blockiert, wie es beim delay
der Fall wäre.
(Der Code ist trocken, ohne Test geschrieben, sorry)
Sonst müsste ich mir mal Dein ganzes Programm ansehen - wie immer gibt
es viele Möglichkeiten...
> Danke für diene Idee (Entschuldigung für mein Deutsch, das ist nicht meine
Muttersprache!!)
ich verstehe Dich bestens, das ist mehr, als ich bei manchem Bayern
sagen kann ;-)
Viel Erfolg
Jens
Danke Yens, Hier ist meines Program. Aber nicht sehr zuverlässig. Und wenn die lange Drück ist da es gibt auch ein kurze Press am Ende.
1 | const unsigned long REPEAT_TIME = 200; // time between repeat measured 160ms |
2 | const unsigned long DOUBLE_PRESS_TIME = 800; // max time to be a double press |
3 | const unsigned long LONG_PRESS_TIME = 2000; // max time to be a long press |
4 | |
5 | elapsedMillis longPressTime; |
6 | elapsedMillis releasedTime; |
7 | |
8 | uint8_t pressNumber; |
9 | |
10 | boolean firstPress, nextPress, continuousPress; |
11 | |
12 | /* |
13 | Decoding remote control ITW |
14 | |
15 | tested on Arduino Uno |
16 | |
17 | protocol: |
18 | start condition: >10ms low, short high, >2,5ms <3ms low |
19 | 33 data elements: |
20 | 0: short high, long low |
21 | 1: short high, short low, short high, long low |
22 | 2: short high, short low, short high, long low, short high, long low |
23 | |
24 | */ |
25 | #include <itwControl.h> |
26 | |
27 | #define RXPIN 5 // Input Pin 5 is interrupt 0 |
28 | |
29 | itwControl itw (RXPIN); |
30 | |
31 | |
32 | |
33 | void setup() { |
34 | Serial.begin ( 9600 ); |
35 | Serial.println ( "ITW Test 3" ); |
36 | attachInterrupt ( digitalPinToInterrupt(RXPIN), rxInterrupt, CHANGE ); |
37 | firstPress = false; |
38 | nextPress = false; |
39 | continuousPress = false; |
40 | pressNumber=0; |
41 | } |
42 | |
43 | void loop() |
44 | { |
45 | if (itw.available()) |
46 | { |
47 | Serial.println ( (char *)itw.getData() ); |
48 | // delay(100); |
49 | itw.release(); |
50 | if (firstPress == false) //first press: start all counters |
51 | { |
52 | firstPress = true; |
53 | continuousPress = false; |
54 | nextPress = false; |
55 | releasedTime = 0; //start release timer |
56 | longPressTime = 0; //start long press counter time |
57 | } |
58 | else //next press |
59 | { |
60 | if (releasedTime < REPEAT_TIME) //key is always pressed |
61 | { |
62 | Serial.println("C"); |
63 | continuousPress = true; //it's a contiuous press |
64 | nextPress = false; |
65 | releasedTime = 0; //restart timer for the next check |
66 | pressNumber=0; |
67 | } |
68 | else |
69 | {pressNumber++; |
70 | |
71 | Serial.println("2"); |
72 | continuousPress = false; |
73 | if(pressNumber<2) |
74 | { |
75 | nextPress = true; //it's a second or more press |
76 | } |
77 | } |
78 | } |
79 | |
80 | } |
81 | |
82 | if ((firstPress) && (releasedTime > DOUBLE_PRESS_TIME )) |
83 | { |
84 | Serial.println("SHORT PRESS"); |
85 | firstPress = false; |
86 | continuousPress = false; |
87 | nextPress = false; |
88 | } |
89 | |
90 | if ((continuousPress) && (longPressTime > LONG_PRESS_TIME)) |
91 | { |
92 | Serial.println("LONG PRESS"); |
93 | firstPress = false; |
94 | continuousPress = false; |
95 | nextPress = false; |
96 | } |
97 | |
98 | if ((nextPress) )// && (releasedTime > REPEAT_TIME))//means double press |
99 | // if ((nextPress) && (releasedTime < DOUBLE_PRESS_TIME)) //means double press |
100 | { |
101 | Serial.println("DOUBLE PRESS"); |
102 | firstPress = false; |
103 | continuousPress = false; |
104 | nextPress = false; |
105 | } |
106 | |
107 | } |
108 | |
109 | void rxInterrupt() { |
110 | itw.rxInterrupt(); |
111 | } |
Schöne Samstag! Gruss
Ich suche auch ein Senderlibrary für die "neue" Intertechno Code...
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.