Forum: Mikrocontroller und Digitale Elektronik Arduino-Library für Intertechno-Devices ITW-852


von Jens M. (dl4aas) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Ursus Polaris (Gast)


Lesenswert?

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

von Jens M. (dl4aas) Benutzerseite


Lesenswert?

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

von Syl W. (syl)


Lesenswert?

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

von JensM (Gast)


Lesenswert?

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

von Syl W. (syl)


Lesenswert?

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

von Jens M. (dl4aas) Benutzerseite


Lesenswert?

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

von Syl W. (syl)


Lesenswert?

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!!)

von Jens M. (dl4aas) Benutzerseite


Lesenswert?

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

von Syl W. (syl)


Lesenswert?

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

von Syl W. (syl)


Lesenswert?

Hallo Jens,

Hast mein Programm probiert ?

Gruss

von Syl W. (syl)


Lesenswert?

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
Noch kein Account? Hier anmelden.