Welche Kodierung wird in diesem Signal verwendet?

Ich habe ein billiges drahtloses Poolthermometer (AcuRite 617 1 ) und möchte die Temperaturdaten am Empfänger abfangen und mit einem computergestützten Datenerfassungssystem verwenden.

Praktischerweise befindet sich im Inneren des Empfängers ein kleines Breakout-Board, das mit der Antenne verbunden ist und digitale „V“, „G“, „D“ und „SH“ Pins hat:

RF211-Platine

Hier ist ein Segment der erfassten Daten vom „D“-Pin während einer Übertragung (diese geschehen einmal pro Minute). Vor diesem Segment scheinen Daten mit viel höherer Rate zu sein, aber ich glaube, das könnte Rauschen sein – dies ist der Beginn der 1,36-kHz-/680-Hz-Daten.

erfasstes Signal vom "D"-Pin

Ich habe ein bisschen gegoogelt und kann keine Codierung finden, die so aussieht, aber wenn ich raten müsste, was los ist, denke ich Folgendes:

  • die ersten 4 Zyklen von 680 Hz sollen die Uhren synchronisieren, enthalten aber keine Daten
  • Die folgenden 13 Zyklen von 1,36 kHz (das Doppelte der Anfangsrate) scheinen eine von zwei Formen zu haben: Sie fallen entweder vor dem Mittelpunkt des Zyklus oder danach ab - ich würde annehmen, dass eine Form logisch ist und die andere ist eine Null.
  • Danach scheint es eine seltsame Lücke zu geben, aber wenn Sie den Teil des Tiefs abziehen, der Teil der vorangehenden "1" ist, dann beträgt die verbleibende Lücke 735 µs, was eine (phasenrichtige!) Fortsetzung der ist 680-Hz-Präambel.

Sehe ich das richtig? Gibt es einen Namen für diese Kodierung?

Einige weitere Anmerkungen zum Breakout-Board:

  • Die Platine ist mit „RF211“ gekennzeichnet und sieht bemerkenswert gut aus mit dem MICRF211 „allgemeiner 3-V-QwikRadio-Empfänger, der mit 433,92 MHz arbeitet“ 3
  • Das MICRF211-Datenblatt enthält die folgende Abbildung (mit sehr wenig Erklärung), die verlockend aussieht wie das, was ich sehe, mit Ausnahme der Rechteckwelle mit doppelter Datenrate im Vergleich zu meiner Aufnahme:
    Datenprofil

2016-02-14 Update: Ich habe dieses Projekt erneut besucht und scheine einen sauberen 64-Bit-Stream zwischen einer 4-Zyklus-Präambel und einer 1-Zyklus-„Postambel“ zu erhalten, wonach die Anzeigetafel das HF-Modul abschaltet ^SH nach unten ziehen (obere Zeile):

64 Bit Daten

Laut dem „33/66% PWM“-Schema von Micrel (das nirgendwo sonst bei Google erscheint) ist das so

-_-_-_-_0000011110011000110000000000000000000000100011101000010010101010-_

Also muss ich jetzt anfangen, die Temperatur zu manipulieren, um die Bits zu dekodieren. Hier ("x") sind die Bits, die sich ohne erkennbare Änderung in der Anzeige zu ändern scheinen:

0000011110011000110000000000000000000000100011101000010010101010
------------------------------------------------x----xxxx----xxx

Ich gehe davon aus, dass dies entweder niederwertigste Bits oder der Batteriestand sind (der nur als "Niedrig" angezeigt wird, wenn er erheblich abfällt).

2016-02-15 Update: Ich nehme die Show mit auf die Straße, um dem neuen "Reverse Engineering"-Stackexchange einen Versuch zu geben, die Bedeutung zu bestimmen: https://reverseengineering.stackexchange.com/questions/12048/what-is-contained -in-dieser-übertragung-rf-pool-temperatursensor-basiseinheit-re

Übrigens - Das Lesen der Benutzerkommentare auf der Home Depot-Website für das AcuRite 617-Gerät gibt einem kein gutes Gefühl hinsichtlich der Gesamthaltbarkeit dieses Produkts. Eigentlich klingt es so, als wäre es eine herausragende Position in Bezug darauf, nicht in die Sendeeinheit zu gelangen.
ach, es ist. meine ist schon ausgelaufen. Aber ich habe es getrocknet und zerlegt und bin zuversichtlich, dass ich die Abdichtung mit etwas Heißkleber und / oder Silikon verbessern kann. das Batteriefach scheint mit einem anständigen O-Ring gut gestaltet zu sein; es ist der rest der einheit, der so schlecht ist und der nie wieder geöffnet werden muss ...
Andere Antworten überflogen, aber das ist vom Aussehen her. Die anfängliche Rechteckwelle soll den Daten-Slicer auf 50%-Niveau synchronisieren. Pause vor Daten, um sicherzustellen, dass der "1"-Pegel abgeklungen ist. Dann 2:1 mk-spc = 1 sagen und 1:2 = 0. Mit Hysterese 50:50 schaltet nicht zwischen vorheriger 1 oder 0 um, ABER sollte nicht während des Datenstroms passieren. Das Vorhergehende ist "schlecht", da es nicht versucht, das mittlere Verhältnis von 50:50 beizubehalten, und Ihr DC-Pegel driftet, wenn Daten mehr Einsen oder Nullen enthalten, aber wenn Ihre DC-Pegel-Zeitkonstante im Vergleich zu einer Nachrichtenlänge lang ist, ist dies nicht der Fall Materie. Sie synchronisieren dann erneut mit einer 1:1-Präambel für die nächste Nachricht.
Ein Decoder könnte ein Operationsverstärker mit einem Eingang sein, der von einem RC-Filter gespeist wird, um den mittleren DC-Pegel und ein anderes gespeistes Signal über einen Widerstand plus + ve Hysterese-Rückkopplung (möglicherweise etwa 4R) einzustellen, sodass ein 1: 1-Signal den Ausgang nicht umdreht, sondern ein 2 :1 oder 1:2 tut es. Ein bisschen mit Hysterese % und DC RC-Zeitkonstante spielen und es sollte gut genug funktionieren.
Ein paar Körnchen Kalziumkarbid oder metallisches Kalzium am Boden des Gehäuses sollten es trocken und leicht unter Druck halten :-). Nein, das habe ich noch nie probiert.

Antworten (5)

Micrel bezeichnet es als 33/66 % PWM-Schema. Es scheint ein ziemlich einfaches, aber Ad-hoc-Protokoll zu sein.

PWM steht für Pulsweitenmodulation. Es gibt eine Wikipedia-Seite, die mehr ins Detail geht, aber kurz gesagt, bei PWM halten Sie einen festen Zeitraum ein, also ist es hier die Zeit von der steigenden Flanke zur nächsten steigenden Flanke, aber Sie variieren den Prozentsatz der Zeit, die im High verbracht wird Zustand, indem er sich ändert, wenn die fallende Flanke auftritt. Bei diesem können Sie sehen, dass es 33 % hoch für eine „1“ und 66 % hoch für eine „0“ ist.

Die anfängliche Reihe von Impulsen sind gleiche hohe und niedrige Zeiten. Dies geschieht normalerweise, damit sich der Empfänger synchronisieren kann, bevor die eigentlichen Daten empfangen werden.

Siehe http://www.micrel.com/_PDF/App-Notes/an-22.pdf für weitere Details darüber, was sie für das Modul erwarten.

Ein typischer Weg, um diese Art von Codierung empfangen zu können, wäre die Eingabe in einen Timer-Eingangs-Capture-Pin eines Mikrocontrollers. Oder Sie können einfach eine Verbindung zu einem allgemeinen Eingang herstellen und ihn mit dem 4-5-fachen der PWM-Periode abtasten lassen. Der Algorithmus zum Decodieren ist daher nicht zu schwer.

Alternativ können Sie sich, wie von markt vorgeschlagen, zum Temperatursensor selbst zurückarbeiten. Wenn es sich jedoch um ein analoges Ausgangssignal handelt, müssen Sie es selbst in ein digitales umwandeln und haben möglicherweise geringfügig andere Nummern in Ihrer Protokollierung als die ursprüngliche Ausgabe.

Leute meines Bekanntenkreises nennen diese Codierungstechnik normalerweise "PWM", was meiner Meinung nach eine vernünftige Beschreibung ist.

Mein erster Gedanke beim Betrachten Ihres Datenstroms und unter der Annahme, dass Sie die Polarität der Bits richtig erraten, ist, dass es sich um eine 12-Bit-ADC-Lesung handelt, LSB zuerst, mit einer führenden „1“ als Startbit. Ich gehe zuerst mit LSB, weil der Beginn des vermutlich nächsten Messwerts eine Ein-Bit-Variation zeigt und es unwahrscheinlich ist, dass ein ADC-Messwert der (Pool-) Temperatur in so kurzer Zeit um ein 2. oder 3. MSB variieren würde Rahmen.

Ich würde ein wenig weiter in das System eintauchen, zurück zu dem, was die Daten generiert (im Gegensatz zu ihrer Übertragung), sehen, ob Sie den Temperatursensor identifizieren können, und nach einer Korrelation zwischen den übertragenen Daten und der Temperatur suchen.

Es scheint mir, dass @RobStarling bereits in der Lage sein sollte, die übertragene Temperatur zu kennen, indem er auf das Empfängergerät schaut und sieht, was angezeigt wird.
stimmt, aber diese Dinge können knifflig sein. zB ist die Anzeige zwischen ˚F/˚C umschaltbar, so dass die Übertragung in absolutem ˚C oder ˚F erfolgen kann oder entweder relativ zu einem seltsamen Offset oder zu einer beliebigen Festkommagenauigkeit. Außerdem gibt es 3 umschaltbare Stations-IDs ("A", "B", "C"), und obwohl es heißt, dass das Ändern der ID den Empfang unterstützen könnte, habe ich das Gefühl, dass es nur ein Identifikationspräfix für die Nachrichten ist - ich werde wechseln es und sehen, was Änderungen an den Daten.
@RobStarling - Sie könnten die Sendeeinheit öffnen, um zu sehen, ob sie einen einfachen Temperatursensortyp wie einen LM75 oder einen der anderen gängigen I2C-Typen verwenden. Wenn dies der Fall ist, ist es wahrscheinlich, dass die Daten, die über die Verbindung als Temperaturwert gesendet werden, einfach dem folgen, der vom Temperatursensorgerät gelesen wird. Wenn der Sender andererseits einen analogen Sensor wie eine Diode oder einen BJT-Transistor als Sensor verwendet, wäre es schwieriger, auf die tatsächlich gesendeten Daten zu schließen.
Ich vermute, dass die beste Chance, den Dateninhalt herauszufinden, darin besteht, den Sender in eine kontrollierte Situation zu bringen, in der Sie die Temperatur langsam ändern können, sodass Sie sehen können, wie sich der Messwert nach und nach ändert. Auf dem Display des Empfängers wird Ihnen angezeigt, was tatsächlich erwartet wird.
@MichaelKaras - es ist schwer zu erkennen, was der Sensor ist - er befindet sich auf einem winzigen Brett, das an der Spitze in einen kleinen Halter eingeklemmt ist und in einen Tupfer Wärmeleitpaste getaucht ist, um ihn an die Außenwand unter Wasser zu koppeln.
@MichaelKaras Praktischerweise habe ich ein paar Wasserbäder mit kontrollierter Temperatur zum Sous-Vide-Garen ... bleib dran :)
Gut, dass Sie die Wasserbäder haben. Das sollte ungemein helfen.

Ich habe mit der Dekodierung des Acurite 617 begonnen und hier sind meine ersten Beobachtungen. Ich kann Ihnen sagen, dass das letzte Byte eine Art "Prüf"-Byte ist und die nächsten drei Bytes die Temperatur enthalten. Diese Bytes werden auch unter Verwendung des 7. Bits gesendet, um eine gerade Parität herzustellen, und es wird nur das untere Halbbyte jedes Bytes verwendet. Ich habe ein Arduino-Programm geschrieben, um die Daten zu erfassen, und die folgenden Meldungen/Temperaturen gesehen.

40 ce c0 00 00 0c 03 sein
(00 0C 03) => 0C3 => 67F

40 ce c0 00 00 0c 84 39
(00 0C 04) => 0C4 => 67F

40 ce c0 00 00 0c 05 b8
(00 0C 05) => 0C5 => 67F

Andere Daten / Temps, die ich gesehen habe, sind:

E2 => 73F

F5 => 76F

108 => 80F (81 00 88)

109 => 80F

Damit sollten Sie in der Lage sein, die "geradlinige" (Annahme) Konvertierung durchzuführen.

Da ich kein gutes Zielfernrohr habe (und die Daten nur einmal pro Minute gesendet werden) bin ich mir über mein Timing nicht sicher. Ich sehe Sync HI und LO als 720 usec und die Datenbits als 240 und 480 usec.

Hoffentlich habe ich später mehr Infos. Ich habe ein paar davon. Sobald sie zu lecken beginnen, entferne ich sie aus dem Pool und trockne sie für den Gebrauch im Haus. Die späteren 617-Module (mit abschraubbarem Boden und O-Ring) scheinen länger zu halten.


Ich habe noch etwas dekodiert. Das letzte Byte (Prüfbyte) macht das XOR aller acht Bytes gleich 0FFH. Beispielsweise ist für „40 CE C0 00 00 8D 0C 30“ 40 xor CE xor C0 xor 00 xor 00 xor 8D xor 0C xor 30 gleich 0FF.

Außerdem habe ich die Temperatur auf 34F heruntergenommen und die Zählung war 10 Dezimalstellen (dh 00 00 0A) und bei 80F war die Zählung 264 Dezimalstellen (dh 81 00 88 oder 108H).

Daraus verwende ich Temp(F) = 0,1811 * Count + 32,1889. Ich bekomme möglicherweise eine größere Spanne, um bessere Daten zu erhalten, wenn ich einen Fehler sehe.

Betrachtet man die Saite von Rob Starling am 14.02.2016:

00000111/10011000/11000000/00000000/00000000/10001110/10000100/10101010 07 98 C0 00 00 8E 84 AA

XOR = FF

Anzahl = 0E4 oder 228

Temperatur = 73,5F

Danke Leute!!! Ich bin mir ziemlich sicher, dass die Zahl nicht nur eine "Zählung" ist, sondern die genaue Temperatur in 0,1 ° C - das heißt, die "Mathematik" für die Dekodierung 228ist, dass es 22.8C. Gehen Sie für Farenheit wie gewohnt vor F=C*9/5+32.
zusammengefasst auf der Reverse Engineering SE: reverseengineering.stackexchange.com/a/13593/15076
Rob, du hast recht – das hätte ich sehen sollen. F = 0,18 * Anzahl + 32,0. Gut, dass Sie darauf hingewiesen haben, ich wollte es bald in wirklich heißes Wasser legen, um ein besseres "m" und "x" mit einer größeren Spannweite zu erhalten.
Möglicherweise möchten Sie die Kalibrierung dennoch durchführen, um genauere Zahlen zu erhalten, da sich mehrere Rezensenten darüber beschwerten, dass das Display um ein paar Grad abweicht. Das könnte jedoch auch nur die Tatsache widerspiegeln, dass es nur ≈4 Zoll unter der Oberfläche liegt und die meisten Pool-Thermometer der alten Schule an einer langen Schnur hängen.
Update: Ich habe eine Arduino-Bibliothek geschrieben – github.com/robstarling/ArduRight – lassen Sie mich wissen, ob es für Sie funktioniert! Es hat ein Beispiel und alles. Unter Bezugnahme auf das Bild in diesem Beitrag müssen Sie Drähte an die Stifte "SH", "D" und "G" löten. Um die Beispielskizze auszuführen, verbinden Sie diese Drähte mit den Pins 2, 7 bzw. GND.

Nahezu alle HF-Übertragungsschemata müssen mehrere Merkmale in ihren Datencodierungsprotokollen aufweisen. Dazu gehören:

  1. Konsistente Formatpräambel, die verwendet wird, um einen Empfänger auf eine Frequenz zu sperren
  2. Eine Sync-Impulsanzeige zum Markieren des Starts, wenn die Rahmenanzeige angezeigt wird
  3. Eine Methode zum Codieren von Daten 1 und 0 mit einer Art codierter Taktung für die Datenwiederherstellung.

Der ungerade Ballimpuls, den Sie notiert haben, ist mit Sicherheit die Synchronisationsimpulsanzeige.

Die Datencodierung scheint dem zu folgen, was ich als Impulsbreitencodierung bezeichnet habe. Dies ist eine ziemlich übliche Technik, bei der die eine Übergangsrichtung einer konstanten Frequenz folgt, was zu Bitzellenzeiten mit konstanter Breite führt. Während der Bitzelle wird der aktive Impuls als 25 % der Bitzellenzeit oder 75 % der Bitzellenzeit dargestellt. Dieses Schema ist kein Impuls-zu-Impuls-DC-symmetrisches Codierungsschema, wie es die Manchester-Codierung bietet. Es ist eine übliche Technik mit Impulsbreitencodierung, einen Gleichstromausgleich innerhalb des Nachrichtenprotokolls bereitzustellen, indem zusätzliche Bits gesendet werden, um einen Gesamtausgleich in der gesamten Nachricht zu erzeugen. In ihrer einfachsten Form werden die Daten zweimal gesendet, wobei die zweite Kopie logisch invertiert wird.

In Ihrem Beispiel ist es seltsam, dass pulsweitenmodulierte Daten vor dem Sync-Impuls auftreten. Es ist jedoch immer noch ein praktikables Schema, wenn der Datendekodieralgorithmus so ausgelegt ist, dass er die empfangenen Daten mit dem Sync in dieser Position akzeptiert. Es ist möglich, dass das Gerät einen Datentyp vor der Synchronisierung und einen danach sendet. Die Aufteilung könnte zwischen Sensoradresse / Temperaturdaten ODER wahren Daten / invertierten Daten erfolgen.

Bearbeiten:

Es ist interessant festzustellen, dass es fast so aussieht, als würde die Sendeeinheit einen anderen Softwarealgorithmus verwenden, um die positiven Impulsbreiten für Datenzellen vor dem Sync-Muster zu formulieren als für die Impulsbreite bei und nach dem Sync-Muster. Dies impliziert, dass möglicherweise ein separates Stück Software vorhanden ist, das das frühere Muster erzeugt als das für den nachfolgenden Teil des Musters. Dieses unterschiedliche Muster könnte darauf hindeuten, dass die Datenquelle in jedem Fall eine unterschiedliche Handhabung hinsichtlich des bitweisen Zugriffs erforderte. Der im Zeitablaufdiagramm ersichtliche Unterschied könnte einfach ein Befehlszeitablauf oder zwei Unterschiede in den Mustererzeugungsschleifen sein.

Ich frage mich, ob dies ist: Präambel (Quadrat) + Startbit (1) + eindeutige ID (12 Bit) + Synchronisierungsimpuls + Daten. (Oh, wie Sie vorgeschlagen haben ... z. B. erwartet es, dass der µC während des Synchronisierungsimpulses für Daten bereit ist.)

Wie heißt es?

Diese Art der Kodierung taucht überall auf. Viele Leute stoßen darauf, wenn sie sich mit adressierbaren Pixeln (WS281x/Neopixels) mit "Single Wire" befassen. Es wird auch im DShot-Protokoll verwendet, das für die Steuerung von bürstenlosen ESCs in "Drohnen" / Drehflüglern beliebt ist. Irgendwie hat sich die Branche nicht für einen einheitlichen Namen entschieden.

Man könnte argumentieren, dass es sich um ein NRZ(L)-Signal handelt, da es keinen voreingestellten „Pegel“ gibt, der sich von den beiden möglichen Pegeln unterscheidet. Das Fehlen eines Impulses könnte jedoch als dritter Zustand betrachtet werden (und wird häufig zum Synchronisieren/Abgrenzen von Paketen verwendet). Daher denke ich, dass die Verwendung von NRZ zur Beschreibung dieser Signale bestenfalls nicht hilfreich und schlimmstenfalls irreführend ist.

Die Impulsbreiten werden moduliert, daher ist "PWM" nicht ganz fehl am Platz, aber PWM bedeutet normalerweise, die analoge Breite des Impulses proportional zu einem analogen Wert zu verwenden.

„Codieren“ bedeutet, ein Datenformat in ein anderes umzuwandeln. Alle diese Protokolle sind ein Strom binärer Bits mit einem Bittakt (und verwenden eine Pause, um anzuzeigen, welches das "erste" ist).

PWEB (Pulse Width Encoded Bits/Binary) erfasst die Kerndetails dieses Codierungsschemas, unabhängig von der digitalen Codierung/Verifizierung oder den erwarteten Impulslängen.