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
voidloop(){
2
if(itw.available()){
3
Serial.println((char*)itw.getData());
4
itw.release();
5
}
6
}
Diese könnte so verändert werden:
1
voidloop(){
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_treleaseTime=0;
2
3
voidloop(){
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