In Teil 1 haben wir gezeigt, wie man die Adresse des DS2450 mit dem Pokeys auslesen kann und wie die Initialisierung funktioniert. Nun wollen wir die Daten auslesen und auswerten. Dazu werden wir als erstes die Daten-Konvertierung starten, dann die Daten auslesen und am Ende konvertieren.
Der gesamte Ablauf ist in dem Programm zu sehen. Im Block Convert Data werden die Daten konvertiert, im Block Read Data dann ausgelesen. Da der Baustein zwischen den Befehlen einige Zeit Pause erwartet, wird der Off Timer Baustein eingesetzt. mit 100ms Wartezeit läuft das Programm ziemlich stabil.
3. Schritt: Daten auf dem DS2450 konvertieren
Um die Daten auslesen zu können, muss als erstes die Convert Data Funktion des DS2450 ausgeführt werden. Dies wurde hier mit einem CustomPoil umgesetzt. Alternativ lässt sich hier aber auch der normale 1-Wire Baustein verwenden, da hier die Längenbegrenzung von 10 Ein- und Ausgabewerte nicht begrenzt.
Wir senden den Befehl 0xCC 0x3C 0x0F 0xAA. Dies bedeutet das folgende:
- 0xCC ist der Befehl für Skip ROM. Dies bedeutet, dass alle Geräte am Bus auf das nachfolgende Kommando lauschen sollen. Da alle unsere anderen Geräte entweder auch ein DS2450 oder ein anderer Chip, der auf die nachfolgenden Befehle nicht reagiert. Da wir keine auswertbare Antwort erwarten, ist es kein Problem, wenn alle DS2450 auf diesen Befehl reagieren. Wir können das sogar bei mehreren DS2450 ausnutzen, um weniger Befehle auf den Bus zu senden.
- 0x3C ist der Befehl für das Konvertieren der Daten.
- 0x0F 0xAA sind die Daten für den Befehl. Sie sagen aus, dass wir alle Kanäle konvertieren wollen und die Daten mit 1 Initialisiert werden sollen. Durch die Initialisierung mit 1 können wir gut erkennen, ob wirklich Daten drin stehen, oder noch die Init-Daten.
Als Ausgabe bekommen wir zur Zeit den CRC angezeigt, dies passiert hier im Beispiel aber eher als zusätzliche Information.
4. Schritt: Daten des DS2450 auslesen
Das Ergebnis der Konvertierung schreibt der DS2450 in die Seite 0. Nach dem Konvertierungsbefehl reicht es, einige Zeit zu warten, wir warten hier 100ms, dann kann man die Daten per Read Page Befehl auslesen. Der genaue Befehl ist dabei 0x55 addr1 addr2 addr3 addr4 addr5 addr6 addr7 addr8 0xAA 0x00 0x00. Das ist der gleiche Befehl, den wir schon im ersten Teil im Init Block verwendet haben. Nur lesen wir diesmal die 0. Seite aus, im Init Block haben wir die 1. und die 3. Seite ausgelesen.
Da wir diesmal die Rückgabedaten benötigen, müssen wir natürlich die Adresse des Chips angeben, von dem wir die Daten erwarten.
Die Rückgabedaten dieser Funktion sind die Daten der 4 Sensoren. Dabei haben wir es in der Init Funktion so konfiguriert, dass jeweils 16 Bit verwendet werden. D.h. also dass jeweils 2 Byte für einen Messwert stehen.
5. Schritt: Ausgelesene Daten konvertieren
Am Ende müssen die so ausgelesenen Daten nun noch konvertiert werden. Hier hat uns die Tabelle auf tm3d.de geholfen. In dieser stehen die Berechnungsvorschriften. Jetzt müssen wir nur die ausgelesenen Daten mit dieser Formel umrechnen und erhalten so Werte, die für jeden Menschen gut lesbar sind.
Dies tun wir im CustomPoil. Die einzige Funktion, die uns nicht zur Verfügung steht ist die E-Funktion für die Helligkeit. Dies muss dann vom Verwender der Werte nach dem Modbus noch durchgeführt werden.
LOAD t1 MUL BL[256] ADD t0 SUB BL[32767] STORE temp LOAD t3 MUL BL[256] ADD t2 STORE humidity LOAD t5 MUL BL[256] ADD t4 SUB BL[32767] STORE lux LOAD t7 MUL BL[256] ADD t6 DIV BL[32] STORE airpressure
Wichtig ist, dass die Reihenfolge der Bytes vertauscht ist. Im 0. Byte sind die Lower Bits für die Temperatur, im 1. Byte die Higher Bits.
Am Ende schicken wir die Daten noch auf den Modbus, damit wir sie in den anderen Komponenten verwenden können. Dies ist sehr einfach in PoBlocks gelöst. Hierzu muss man nur auf das Tab Shared Data am rechten Rand gehen. Hier stehen alle Nummern bereit, die man für den Modbus verwenden kann. Man wählt eine Nummer aus und klickt doppelt drauf. Im Zeichen Bereich ist dann ein runder Bereich zu sehen, den man auf den Ausgangsport schiebt. Dieser wird dann Gelb und bekommt die entsprechende Nummer. In der Shared Data Liste steht der Name der Ausgangsvariable.
Hier noch unsere Datei für PoBlocks (ohne Gewähr).
Weiterführende Links
- Forum mit interessanten Informationen zum DS2450
Hallo Monkonas.
wäre es möglich das du mir das komplette PoBlock Projekt sendest?
Wäre sehr hilfreich für mich, danke
Hallo,
wir haben hier kein komplettes Projekt, da wir mit den Sensoren auslesen über PoBlocks nur rumgespielt haben, aber inzwischen die Lösung über UDP verwenden, die wesentlich flexibler ist.
https://blog.h7d.de/2018/06/24/mit-dem-pokeys-direkt-per-udp-sprechen-um-die-1-wire-sensoren-auszulesen/
ich werde die Datei hier aber an den Post anhängen, allerdings ist die ohne Gewähr.