Feuchte und Temperatur Sensor DHT11 an der C-Control I

Die asiatische Firma ASAIR (R) fertigt in grossen Stückzahlen für die
Industrie kombinierte Feuchte & Temperatursensoren. Sie werden weltweit in
vielen Geräten aus der Überwachung, Steuerung und in der Klimatechnik eingesetzt.
Als Massenprodukt sind sie sehr günstig zu bekommen.

Für andere Plattformen wie Raspberry (R) und Ardunio (R) gibt es passende Breakoutboards
und Softwaretreiber. Die Boards kommen anschlussfertig und können direkt an die
Versorgungsspannung und einem Digitalpin angeschlossen werden.

Bei den grossen Distributoren sind die Sensoren auch als Einzelbauteile zu bekommen.
Hier muss dann noch auf der Signalleitung ein Pullup Widerstand von etwa 10k Ohm
eingelötet wreden. Die Betriebsspannung liegt zwischen 3 und 5,5 V.  
Man sollte man noch ein Abblockkondenstaor von etwa 100nF verwenden.

So kann der Sensor direkt an die C-Control angeschlossen werden.

Ursprünglich hatte ich einen Treiber für die Pro geschrieben. Hier war schnell klar, dass
weder Basic noch C die nötige Geschwindikeit lieferten um den 1-Wire Bus zum
Transfer von Daten zu bewegen. Ich habe daher den Hauptteil in Assembler geschrieben.

Für ein anderes Projekt mit der C-Control I wollte ich den Sensor ebenfalls verwenden und habe
da gleich etwas in Assembler geschrieben.

Die Kommunikation mit dem Sensor funktioniert über einen 1-Wire Bus. Leider ist das
verwendete Protokoll zu bestehenden Implementierungen nicht kompatibel.

Es gibt im Netz ein ausführliches Datenblatt zum DHT11.

Ich beschreibe im Folgenden  kurz die Funktionsweise.    
  
Der Kontroller schaltet den Portpin (Output) für etwa 20ms auf low. Danach folgt ein High Pulse
von etwa 20us. Der Portpin wird vom Kontroller jetzt auf Input geschaltet (der Pullup sorgt für
high am Portpin) und wartet darauf, dass der Sensor den Portpin auf low zieht. Das ist der Fall
wenn er die Startsequenz erkennt und die Daten zur Verfügung stehen.

Die Aufbereitung der Daten dauert etwa 6s nach Datenblatt.

Der Sensor sendet nun seinerseits eine Startsequenz: 20us low, 80us high.

Nun folgen 40 Bits an Sensordaten.
Das sind 5 Bytes bestehend aus 2 Bytes für die Feuchte, 2 Bytes für die Temperatur und ein Byte
für die Checksumme.

Die Werte entsprechen einer Gleitkommazahl zur Basis 10. Das erste Byte ist der Ganzzahlteil der Mantisse,
das zweite entspricht dem Nachkommateil.

Beispiel:
Byte 1 = 30
Byte 2 = 0
Byte 3 = 25
Byte 4 = 1
Byte 5 = 56

Das enspricht einer Luftfeuchte von 30.0 % und einer Temperatur von 25.1 Grad Celsius.

Die Checksumme ist einfach berechnet : Checkusmme = Byte1+Byte2+Byte3+Byte4, 56=30+0+25+1.

Falls sie nicht stimmt, werden die Datenbytes und der Status auf den Wert 0 gesetzt.

High und low Bits werden folgendermassen kodiert:

Ein low Bit entspricht einer low/high Sequenz von 50us low mit 56us high.
Ein high Bit entspricht einer low/high Sequenz von 50us low mit 70us high.

Die Datenübergabe funktioniert in C-Control Basic ganz einfach über 5 Uservariablen vom Typ Byte.

Die ersten 4 Bytes enthalten dann die Daten, das 5. Byte den Status, entweder 0 oder 1.
Eine 1 bedeutet, dass die Daten in Ordnung sind. Das kann man dann in einer IF Anweisung abfragen.
Die Daten werden dann immer auf den Wert 0 resettet.

Wichtig ist, dass bei Erkennung der High/Low Flanke ein Timeout Timer/Counter mitläuft
damit der Kontroller hier nicht hängen bleibt. Das habe ich in anderen Implementierungen schon
leider oft falsch programmiert gesehen. 

Falls es einen Timeout gegeben hat erhält das 5. Byte bzw die 5. Uservariable den Wert 255.

Der DHT22 soll noch etwas präziser sein, ist im Prinzip vom Aufbau gleich, hat aber eine etwas andere
Startsequenz, die allerdings leicht im Code anzupassen ist.

Der Portpin ist hart kodiert im Assemblercode. Könnte aber auch über eine Uservariable übergeben werden.

Bei intensivem Gebrauch von Interrupts empfiehlt sich, diese im Code über cli zu deaktivieren und
am Ende über sei wieder zu aktivieren. Bei Verwendung der DCF-77 traten keine Probleme auf.

Der Sensor sollte nach Datenblatt höchstens alle 6s abgefragt werden. 



 





 










