- DHT11 - Spezifikation und Arbeitsweise
- Kommunikation mit dem DHT11-Sensor
- Erforderliche Komponenten
- Schema
- DHT11 mit Erklärung des PIC MPLABX-Codes
Die Temperatur- und Feuchtigkeitsmessung ist häufig in vielen Anwendungen wie Hausautomation, Umgebungsüberwachung, Wetterstation usw. nützlich. Der am häufigsten verwendete Temperatursensor neben LM35 ist der DHT11. Wir haben zuvor viele DHT11-Projekte erstellt, indem wir ihn mit Arduino und Himbeere verbunden haben Pi und viele andere Entwicklungsboards. In diesem Artikel erfahren Sie, wie Sie diesen DHT11 mit PIC16F87A verbinden, einem 8-Bit-PIC-Mikrocontroller. Wir werden diesen Mikrocontroller verwenden, um die Werte von Temperatur und Luftfeuchtigkeit mit DHT11 zu lesen und auf einem LCD-Display anzuzeigen. Wenn Sie mit der Verwendung von PIC-Mikrocontrollern noch nicht vertraut sind, können Sie in unserer PIC-Lernprogrammreihe lernen, wie Sie PIC-Mikrocontroller programmieren und verwenden.
DHT11 - Spezifikation und Arbeitsweise
Der DHT11-Sensor ist entweder in Modulform oder in Sensorform erhältlich. In diesem Tutorial verwenden wir den Sensor. Der einzige Unterschied zwischen beiden besteht darin, dass der Sensor in Modulform einen Filterkondensator und einen Pull-up-Widerstand hat, der am Ausgangsstift des Sensors angebracht ist. Wenn Sie das Modul verwenden, müssen Sie es nicht extern hinzufügen. Der DHT11 in Sensorform ist unten dargestellt.
Der DHT11-Sensor wird mit einem blauen oder weißen Gehäuse geliefert. In diesem Gehäuse befinden sich zwei wichtige Komponenten, mit denen wir die relative Luftfeuchtigkeit und Temperatur erfassen können. Die erste Komponente ist ein Elektrodenpaar; Der elektrische Widerstand zwischen diesen beiden Elektroden wird durch ein feuchtigkeitsspeicherndes Substrat bestimmt. Der gemessene Widerstand ist also umgekehrt proportional zur relativen Luftfeuchtigkeit. Je höher die relative Luftfeuchtigkeit, desto niedriger der Widerstandswert und umgekehrt. Beachten Sie auch, dass sich die relative Luftfeuchtigkeit von der tatsächlichen Luftfeuchtigkeit unterscheidet. Die relative Luftfeuchtigkeit misst den Wassergehalt in der Luft im Verhältnis zur Lufttemperatur.
Die andere Komponente ist ein oberflächenmontierter NTC-Thermistor. Der Begriff NTC steht für den negativen Temperaturkoeffizienten, für den Temperaturanstieg nimmt der Widerstandswert ab. Der Ausgang des Sensors ist werkseitig kalibriert und daher müssen wir uns als Programmierer keine Gedanken über die Kalibrierung des Sensors machen. Die Ausgabe des Sensors durch 1-Draht-Kommunikation zeigt den Pin und das Anschlussdiagramm dieses Sensors.
Das Produkt befindet sich in einer 4-poligen einreihigen Verpackung. Der 1. Pin ist über den VDD und der 4. Pin über den GND angeschlossen. Der 2. Pin ist der Daten-Pin, der für Kommunikationszwecke verwendet wird. Dieser Datenstift benötigt einen Pull-Up-Widerstand von 5k. Es können jedoch auch andere Pull-up-Widerstände wie 4,7 k bis 10 k verwendet werden. Der 3. Pin ist mit nichts verbunden. Also wird es ignoriert.
Das Datenblatt enthält technische Spezifikationen sowie Schnittstelleninformationen, die in der folgenden Tabelle aufgeführt sind:
Die obige Tabelle zeigt den Messbereich und die Genauigkeit der Temperatur und Luftfeuchtigkeit. Es kann Temperaturen von 0 bis 50 Grad Celsius mit einer Genauigkeit von +/- 2 Grad Celsius und relative Luftfeuchtigkeit von 20 bis 90% rF mit einer Genauigkeit von +/- 5% rF messen. Die Detailspezifikation ist in der folgenden Tabelle aufgeführt.
Kommunikation mit dem DHT11-Sensor
Wie bereits erwähnt, müssen wir zum Lesen der Daten von DHT11 mit PIC das PIC-Ein-Draht- Kommunikationsprotokoll verwenden. Die Einzelheiten dazu sind aus dem Schnittstellendiagramm von DHT 11 ersichtlich, das in seinem Datenblatt zu finden ist. Dasselbe ist unten angegeben.
DHT11 benötigt ein Startsignal von der MCU, um die Kommunikation zu starten. Daher muss die MCU jedes Mal ein Startsignal an den DHT11-Sensor senden, um ihn aufzufordern, die Werte für Temperatur und Luftfeuchtigkeit zu senden. Nach Abschluss des Startsignals sendet der DHT11 ein Antwortsignal, das die Temperatur- und Feuchtigkeitsinformationen enthält. Die Datenkommunikation erfolgt über das Einzelbus-Datenkommunikationsprotokoll. Die volle Datenlänge beträgt 40 Bit und der Sensor sendet zuerst ein höheres Datenbit.
Aufgrund des Pull-up-Widerstands bleibt die Datenleitung im Leerlauf immer auf dem VCC-Niveau. Die MCU muss diese Spannung für eine Mindestspanne von 18 ms von hoch nach niedrig senken. Während dieser Zeit erkennt der DHT11-Sensor das Startsignal und der Mikrocontroller macht die Datenleitung für 20-40us hoch. Diese 20-40us-Zeit wird als Wartezeit bezeichnet, in der der DHT11 mit der Antwort beginnt. Nach dieser Wartezeit sendet DHT11 die Daten an die Mikrocontrollereinheit.
DHT11 Sensor DATA Format
Die Daten bestehen aus Dezimal- und Integralteilen, die miteinander kombiniert werden. Der Sensor folgt dem folgenden Datenformat -
8-Bit-Integral-RH-Daten + 8-Bit-Dezimal-RH-Daten + 8-Bit-Integral-T-Daten + 8-Bit-Dezimal-T-Daten + 8-Bit-Prüfsumme.
Man kann die Daten überprüfen, indem man den Prüfsummenwert mit den empfangenen Daten überprüft. Dies kann geschehen, weil, wenn alles korrekt ist und der Sensor korrekte Daten übertragen hat, die Prüfsumme die Summe aus „8-Bit-Integral-RH-Daten + 8-Bit-Dezimal-RH-Daten + 8-Bit-Integral-T-Daten + 8-Bit-Dezimal-T-Daten“ sein sollte.
Erforderliche Komponenten
Für dieses Projekt sind folgende Dinge erforderlich:
- Programmieraufbau für PIC-Mikrocontroller (8 Bit).
- Steckbrett
- 5V 500mA Netzteil.
- 4,7k Widerstand 2St
- 1k Widerstand
- PIC16F877A
- 20 MHz Kristall
- 33pF Kondensator 2 Stck
- 16x2 Zeichen LCD
- DHT11 Sensor
- Überbrückungsdrähte
Schema
Das Schaltbild für die Verbindung von DHT11 mit PIC16F877A ist unten dargestellt.
Wir haben ein 16x2-LCD verwendet, um die Temperatur- und Feuchtigkeitswerte anzuzeigen, die wir mit DHT11 messen. Das LCD ist im 4-Draht-Modus angeschlossen und sowohl der Sensor als auch das LCD werden von einer externen 5-V-Stromversorgung gespeist. Ich habe ein Steckbrett verwendet, um alle erforderlichen Verbindungen herzustellen, und einen externen 5-V-Adapter verwendet. Sie können dieses Steckbrett-Netzteil auch verwenden, um Ihr Board mit 5 V zu versorgen.
Sobald die Schaltung fertig ist, müssen wir nur noch den unten auf dieser Seite angegebenen Code hochladen und können mit dem Lesen der Temperatur und Luftfeuchtigkeit wie unten gezeigt beginnen. Wenn Sie wissen möchten, wie der Code geschrieben wurde und wie er funktioniert, lesen Sie weiter. Die vollständige Arbeitsweise dieses Projekts finden Sie auch in dem Video unten auf dieser Seite.
DHT11 mit Erklärung des PIC MPLABX-Codes
Der Code wurde mit MPLABX IDE geschrieben und mit dem XC8-Compiler kompiliert, die beide von Microchip selbst bereitgestellt werden und kostenlos heruntergeladen und verwendet werden können. In den grundlegenden Tutorials finden Sie Informationen zu den Grundlagen der Programmierung. Im Folgenden werden nur die drei wichtigen Funktionen erläutert, die für die Kommunikation mit dem DHT11-Sensor erforderlich sind. Die Funktionen sind -
void dht11_init (); void find_response (); char read_dht11 ();
Die erste Funktion wird für das Startsignal mit dht11 verwendet. Wie bereits erwähnt, beginnt jede Kommunikation mit DHT11 mit einem Startsignal. Hier wird zunächst die Pin-Richtung geändert, um den Daten-Pin als Ausgang vom Mikrocontroller zu konfigurieren. Dann wird die Datenleitung nach unten gezogen und wartet auf die 18 ms. Danach wird die Leitung vom Mikrocontroller wieder hoch gemacht und wartet bis zu 30us. Nach dieser Wartezeit wird der Daten-Pin als Eingang für den Mikrocontroller gesetzt, um die Daten zu empfangen.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // RD0 als Ausgabe konfigurieren DHT11_Data_Pin = 0; // RD0 sendet 0 an den Sensor __delay_ms (18); DHT11_Data_Pin = 1; // RD0 sendet 1 an den Sensor __delay_us (30); DHT11_Data_Pin_Direction = 1; // RD0 als Eingabe konfigurieren }
Die nächste Funktion dient zum Einrichten eines Prüfbits in Abhängigkeit vom Daten-Pin-Status. Es wird verwendet, um die Reaktion des DHT11-Sensors zu erfassen.
void find_response () { Check_bit = 0; __delay_us (40); if (DHT11_Data_Pin == 0) { __delay_us (80); if (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Schließlich die dht11-Lesefunktion; Hier werden die Daten in ein 8-Bit-Format gelesen, in dem die Daten abhängig vom Daten-Pin-Status unter Verwendung einer Bitverschiebungsoperation zurückgegeben werden.
char read_dht11 () { char data, for_count; for (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __delay_us (30); if (DHT11_Data_Pin == 0) { data & = ~ (1 << (7 - for_count)); // Bit löschen (7-b) } else { data- = (1 << (7 - for_count)); // Bit (7-b) setzen while (DHT11_Data_Pin); } } Daten zurückgeben; }}
Danach wird alles in die Hauptfunktion erledigt. Zunächst erfolgt die Systeminitialisierung, bei der das LCD initialisiert und die Richtung der LCD-Pins auf den Ausgang eingestellt wird. Die Anwendung wird innerhalb der Hauptfunktion ausgeführt
void main () { system_init (); während (1) { __delay_ms (800); dht11_init (); find_response (); if (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); Summation = read_dht11 (); if (Summation == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Humidity = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Feuchtigkeit / 10)% 10)); lcd_data (48 + (Luftfeuchtigkeit% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Luftfeuchtigkeit:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Prüfsummenfehler"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("Fehler !!!"); lcd_com (0xC0); lcd_puts ("Keine Antwort."); } __delay_ms (1000); } }
Die Kommunikation mit dem DHT11-Sensor erfolgt innerhalb der while- Schleife, in der das Startsignal an den Sensor gesendet wird. Danach wird die Funktion find_response ausgelöst. Wenn das Check_bit 1 ist, wird die weitere Kommunikation durchgeführt, andernfalls zeigt das LCD einen Fehlerdialog an.
Abhängig von den 40-Bit-Daten wird read_dht11 5-mal (5-mal x 8-Bit) aufgerufen und die Daten gemäß dem im Datenblatt angegebenen Datenformat gespeichert. Der Prüfsummenstatus wird ebenfalls überprüft. Wenn Fehler gefunden werden, wird dies auch auf dem LCD angezeigt. Schließlich werden die Daten konvertiert und auf das 16x2-Zeichen-LCD übertragen.
Der vollständige Code für diese PIC-Temperatur- und Feuchtigkeitsmessung kann hier heruntergeladen werden. Überprüfen Sie auch das unten angegebene Demonstrationsvideo.
Ich hoffe, Sie haben das Projekt verstanden und es genossen, etwas Nützliches zu bauen. Wenn Sie Fragen haben, lassen Sie diese im Kommentarbereich unten oder nutzen Sie unsere Foren für andere technische Fragen.