- DHT11 - Specificatie en werking
- Communiceren met DHT11-sensor
- Vereiste componenten
- Schematisch
- DHT11 met PIC MPLABX Code uitleg
Temperatuur- en vochtigheidsmeting is vaak nuttig in veel toepassingen zoals domotica, omgevingsbewaking, weerstation, enz. De meest populaire temperatuursensor naast LM35 is de DHT11, we hebben eerder veel DHT11-projecten gebouwd door deze te koppelen met Arduino, met Raspberry Pi en vele andere ontwikkelborden. In dit artikel zullen we leren hoe we deze DHT11 kunnen koppelen met PIC16F87A, een 8-bit PIC Microcontroller. We zullen deze microcontroller gebruiken om de waarden van temperatuur en vochtigheid met DHT11 te lezen en op een LCD-scherm weer te geven. Als u helemaal nieuw bent met het gebruik van PIC-microcontrollers, kunt u gebruik maken van onze PIC-tutorialserie om te leren hoe u PIC-microcontrollers kunt programmeren en gebruiken, laten we echter aan de slag gaan.
DHT11 - Specificatie en werking
De DHT11-sensor is verkrijgbaar in module- of sensorvorm. In deze tutorial gebruiken we de sensor, het enige verschil tussen beide is dat de sensor in modulevorm een filtercondensator en een pull-up-weerstand heeft die is bevestigd aan de uitgangspen van de sensor. Dus als u de module gebruikt, hoeft u deze niet extern toe te voegen. De DHT11 in sensorvorm wordt hieronder getoond.
De DHT11-sensor wordt geleverd met een blauwe of witte kleurbehuizing. In deze behuizing bevinden zich twee belangrijke componenten die ons helpen de relatieve vochtigheid en temperatuur te voelen. De eerste component is een paar elektroden; de elektrische weerstand tussen deze twee elektroden wordt bepaald door een vochthoudend substraat. De gemeten weerstand is dus omgekeerd evenredig met de relatieve vochtigheid van de omgeving. Hoe hoger de relatieve luchtvochtigheid, hoe lager de waarde van de weerstand en vice versa. Merk ook op dat de relatieve vochtigheid verschilt van de werkelijke vochtigheid. Relatieve vochtigheid meet het watergehalte in de lucht ten opzichte van de temperatuur in de lucht.
Het andere onderdeel is een op het oppervlak gemonteerde NTC-thermistor. De term NTC staat voor de negatieve temperatuurcoëfficiënt, voor de temperatuurstijging neemt de weerstandswaarde af. De output van de sensor is in de fabriek gekalibreerd en daarom hoeven we ons als programmeur geen zorgen te maken over het kalibreren van de sensor. De output van de sensor gegeven door 1-draads communicatie, laten we eens kijken naar de pin en het aansluitschema van deze sensor.
Het product zit in een 4-pins verpakking met één rij. De 1e pin is verbonden met de VDD en de 4e pin is verbonden met de GND. De 2e pin is de datapin, die wordt gebruikt voor communicatiedoeleinden. Deze datapin heeft een pull-up weerstand van 5k nodig. Andere pull-up weerstanden zoals 4.7k tot de 10k kunnen echter ook worden gebruikt. De 3e pin is nergens mee verbonden. Het wordt dus genegeerd.
Het gegevensblad bevat technische specificaties en informatie over de interface die u kunt zien in de onderstaande tabel
De bovenstaande tabel toont het meetbereik en de nauwkeurigheid van temperatuur en vochtigheid. Het kan temperatuur meten van 0-50 graden Celsius met een nauwkeurigheid van +/- 2 graden Celsius en relatieve vochtigheid van 20-90% RH met een nauwkeurigheid van +/- 5% RH. De detailspecificatie is te zien in de onderstaande tabel.
Communiceren met DHT11-sensor
Zoals eerder vermeld teneinde de data gelezen van DHT11 met PIC hebben we gebruiken PIC een draad communicatieprotocol. De details over hoe dit moet worden uitgevoerd, kunnen worden afgeleid uit het interfacing-diagram van DHT 11 dat te vinden is in de datasheet, hetzelfde wordt hieronder gegeven.
De DHT11 heeft een startsignaal van de MCU nodig om de communicatie te starten. Daarom moet de MCU elke keer een startsignaal naar de DHT11-sensor sturen om deze te vragen de waarden van temperatuur en vochtigheid te verzenden. Na voltooiing van het startsignaal zendt de DHT11 een reactiesignaal met informatie over temperatuur en vochtigheid. De datacommunicatie verloopt via het datacommunicatieprotocol met enkele bus. De volledige datalengte is 40 bit en de sensor stuurt eerst een hogere databit.
Door de pull-up weerstand blijft de datalijn tijdens inactiviteit altijd op het VCC-niveau. De MCU moet deze spanning gedurende minimaal 18 ms van hoog naar laag verlagen. Gedurende deze tijd detecteert de DHT11-sensor het startsignaal en maakt de microcontroller de datalijn hoog voor 20-40us. Deze 20-40us-tijd wordt een wachtperiode genoemd waarin de DHT11 begint met reageren. Na deze wachttijd stuurt DHT11 de gegevens naar de microcontrollereenheid.
DHT11 Sensor DATA Formaat
De gegevens bestaan uit decimale en integrale delen die met elkaar zijn gecombineerd. De sensor volgt het onderstaande gegevensformaat -
8-bits integrale RH-gegevens + 8-bits decimale RH-gegevens + 8-bits integrale T-gegevens + 8-bits decimale T-gegevens + 8-bits checksum.
Men kan de gegevens verifiëren door de checksum-waarde te vergelijken met de ontvangen gegevens. Dit kan worden gedaan omdat, als alles correct is en als de sensor de juiste gegevens heeft verzonden, de checksum de som moet zijn van "8bit integrale RH-data + 8bit decimale RHdata + 8bit integrale T-data + 8bit decimale T-data".
Vereiste componenten
Voor dit project zijn onderstaande dingen vereist -
- PIC-microcontroller (8bit) programmeerinstellingen.
- Breadboard
- 5V 500mA voedingseenheid.
- 4.7k weerstand 2st
- 1k weerstand
- PIC16F877A
- 20 MHz kristal
- 33pF condensator 2 stuks
- LCD-scherm van 16x2 tekens
- DHT11-sensor
- Doorverbindingsdraden
Schematisch
Het schakelschema voor de koppeling van de DHT11 met PIC16F877A wordt hieronder weergegeven.
We hebben een 16x2 LCD gebruikt om de temperatuur- en vochtigheidswaarden weer te geven die we meten vanaf DHT11. Het LCD-scherm is aangesloten in 4-draads modus en zowel de sensor als het LCD-scherm worden gevoed door een externe voeding van 5V. Ik heb een breadboard gebruikt om alle benodigde aansluitingen te maken en heb een externe 5V adapter gebruikt. Je kunt dit breadboard voedingsbord ook gebruiken om je bord van 5V te voorzien.
Zodra het circuit klaar is, hoeven we alleen maar de code onderaan deze pagina te uploaden en kunnen we beginnen met het lezen van de temperatuur en vochtigheid zoals hieronder weergegeven. Als je wilt weten hoe de code is geschreven en hoe deze werkt, lees dan verder. Ook kun je de volledige werking van dit project vinden in de video die onderaan deze pagina wordt gegeven.
DHT11 met PIC MPLABX Code uitleg
De code is geschreven met MPLABX IDE en gecompileerd met behulp van de XC8-compiler, beide geleverd door Microchip zelf en is gratis te downloaden en te gebruiken. Raadpleeg de basishandleidingen om de basisprincipes van programmeren te begrijpen, alleen de drie belangrijke functies die nodig zijn voor communicatie met de DHT11-sensor worden hieronder besproken. De functies zijn -
leegte dht11_init (); leegte find_response (); char read_dht11 ();
De eerste functie wordt gebruikt voor het startsignaal met dht11. Zoals eerder besproken, begint elke communicatie met DHT11 met een startsignaal, hier wordt eerst de pinrichting veranderd om de datapin te configureren als uitvoer van de microcontroller. Dan wordt de datalijn laag getrokken en blijft wachten op de 18mS. Daarna wordt de lijn weer hoog gemaakt door de microcontroller en blijft wachten tot 30us. Na die wachttijd wordt de datapin ingesteld als invoer voor de microcontroller om de gegevens te ontvangen.
leegte dht11_init () { DHT11_Data_Pin_Direction = 0; // Configureer RD0 als uitvoer DHT11_Data_Pin = 0; // RD0 stuurt 0 naar de sensor __delay_ms (18); DHT11_Data_Pin = 1; // RD0 stuurt 1 naar de sensor __delay_us (30); DHT11_Data_Pin_Direction = 1; // Configureer RD0 als invoer }
De volgende functie wordt gebruikt voor het instellen van een controlebit, afhankelijk van de status van de datapin. Het wordt gebruikt om de reactie van de DHT11-sensor te detecteren.
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);} }
Eindelijk de dht11 read-functie; hier worden de gegevens gelezen in een 8-bits formaat waar de gegevens worden geretourneerd met behulp van een bitverschuivingsbewerking, afhankelijk van de status van de gegevenspen.
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)); // Wis bit (7-b) } anders { data- = (1 << (7 - for_count)); // Stel bit (7-b) in terwijl (DHT11_Data_Pin); } } gegevens retourneren; }
Het is een feit dat u zich geen zorgen hoeft te maken.
Daarna wordt alles in de hoofdfunctie gedaan. Eerst wordt de systeeminitialisatie uitgevoerd waar het LCD-scherm wordt geïnitialiseerd en de poortrichting van de LCD-pinnen wordt ingesteld op de uitgang. De applicatie draait binnen de hoofdfunctie
void main () { system_init (); while (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 (); Sommatie = read_dht11 (); if (Sommatie == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Vochtigheid = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Vochtigheid / 10)% 10)); lcd_data (48 + (vochtigheid% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Vochtigheid:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Checksum-fout"); } } anders { clear_screen (); lcd_com (0x80); lcd_puts ("Fout !!!"); lcd_com (0xC0); lcd_puts ("Geen reactie."); } __delay_ms (1000); } }
De communicatie met de DHT11-sensor vindt plaats in de while- lus waar het startsignaal naar de sensor wordt gestuurd. Daarna wordt de functie find_response geactiveerd. Als de Check_bit 1 is, wordt de verdere communicatie uitgevoerd, anders zal het LCD-scherm een foutdialoog weergeven.
Afhankelijk van de 40bit-gegevens, wordt de read_dht11 5 keer gebeld (5 keer x 8bit) en worden de gegevens opgeslagen volgens het gegevensformaat in het gegevensblad. De checksum-status wordt ook gecontroleerd en als er fouten worden gevonden, wordt dit ook gemeld op het LCD-scherm. Ten slotte worden de gegevens geconverteerd en verzonden naar het LCD-scherm van 16x2 tekens.
De volledige code voor deze PIC temperatuur- en vochtigheidsmeting kan hier worden gedownload. Bekijk ook de onderstaande demonstratievideo.
Ik hoop dat je het project hebt begrepen en het leuk vond om iets nuttigs te bouwen. Als u vragen heeft, laat deze dan achter in de commentaarsectie hieronder of gebruik onze forums voor andere technische vragen.