mikrocontroller.net

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


Autor: Jens M. (dl4aas) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
Ebay-Artikel Nr. 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.

Autor: Ursus Polaris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens M. (dl4aas) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Syl W. (syl)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: JensM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Syl W. (syl)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens M. (dl4aas) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Syl W. (syl)
Datum:

Bewertung
0 lesenswert
nicht 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!!)

Autor: Jens M. (dl4aas) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
void loop() {
  if ( itw.available() ) {
    Serial.println ( (char *)itw.getData() );
    itw.release();
  }
}

Diese könnte so verändert werden:
void loop() {
  if ( itw.available() ) {
    Serial.println ( (char *)itw.getData() );
    delay (500);
    itw.release();
  }
}

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:
uint32_t releaseTime = 0;

void loop() {
  if ( !releaseTime && itw.available() ) {
    Serial.println ( (char *)itw.getData() );
    releaseTime = millis() + 500;
  }
  if ( releaseTime && releaseTime > millis() ) {
    itw.release();
    releaseTime = 0;
  }
  // hier kann jetzt immer noch etwas anderes gemacht werden
}

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

Autor: Syl W. (syl)
Datum:

Bewertung
0 lesenswert
nicht 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.

const unsigned long REPEAT_TIME        = 200;     // time between repeat measured 160ms
const unsigned long DOUBLE_PRESS_TIME  = 800;     // max time to be a double press
const unsigned long LONG_PRESS_TIME        = 2000;     // max time to be a long press

elapsedMillis longPressTime;
elapsedMillis releasedTime;

uint8_t pressNumber;

boolean firstPress, nextPress, continuousPress;

/*
   Decoding remote control ITW

   tested on Arduino Uno

   protocol:
   start condition: >10ms low, short high, >2,5ms <3ms low
   33 data elements:
    0: short high, long low
    1: short high, short low, short high, long low
    2: short high, short low, short high, long low, short high, long low

*/
#include <itwControl.h>

#define RXPIN     5   // Input Pin 5 is interrupt 0 

itwControl itw (RXPIN);



void setup() {
  Serial.begin ( 9600 );
  Serial.println ( "ITW Test 3" );
  attachInterrupt ( digitalPinToInterrupt(RXPIN), rxInterrupt, CHANGE );
  firstPress    = false;
  nextPress     = false;
  continuousPress = false;
  pressNumber=0;
}

void loop()
{
  if (itw.available())
  {
    Serial.println ( (char *)itw.getData() );
//    delay(100);
    itw.release();
    if (firstPress == false) //first press: start all counters
    {
      firstPress      = true;
      continuousPress = false;
      nextPress       = false;
      releasedTime    = 0;  //start release timer
      longPressTime   = 0; //start long press counter time
    }
    else                     //next press
    {
      if (releasedTime < REPEAT_TIME) //key is always pressed
      {
        Serial.println("C");
        continuousPress = true;      //it's a contiuous press
        nextPress       = false;
        releasedTime    = 0;    //restart timer for the next check
        pressNumber=0;
      }
      else
      {pressNumber++;
      
        Serial.println("2");
        continuousPress = false;
      if(pressNumber<2)
      {
        nextPress = true;             //it's a second or more press
      }
      }
    }
    
  }

  if ((firstPress) && (releasedTime > DOUBLE_PRESS_TIME ))
  {
    Serial.println("SHORT PRESS");
    firstPress = false;
    continuousPress = false;
    nextPress       = false;
  }

  if ((continuousPress) && (longPressTime > LONG_PRESS_TIME))
  {
    Serial.println("LONG PRESS");
    firstPress = false;
    continuousPress = false;
    nextPress       = false;
  }

  if ((nextPress) )// && (releasedTime > REPEAT_TIME))//means double press
    //    if ((nextPress) && (releasedTime < DOUBLE_PRESS_TIME))  //means double press
  {
    Serial.println("DOUBLE PRESS");
    firstPress = false;
    continuousPress = false;
    nextPress       = false;
  }

}

void rxInterrupt() {
  itw.rxInterrupt();
}

Schöne Samstag!

Gruss

Autor: Syl W. (syl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jens,

Hast mein Programm probiert ?

Gruss

Autor: Syl W. (syl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich suche auch ein Senderlibrary für die "neue" Intertechno Code...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.