В этой статье мы рассмотрим, как с помощью 8-битного микроконтроллера PIC16F877A вывести данные с цифрового датчика влажности и температуры DHT11 на LCD модуль.
DHT11 — это популярный и не дорогой цифровой датчик температуры и влажности. Датчик полностью откалиброван на заводе, поэтому его выходные данные очень точны. Его интерфейс является цифровым, поэтому нам не нужно использовать аналого-цифровой преобразователь (АЦП) микроконтроллера. Кроме того, для обмена данными используется двунаправленная шина 1-Wire, поэтому схема подключения очень проста.

Как вы можете видеть, у DHT11 есть только четыре вывода, один из которых NC, то есть не подключен. Так что будем использовать только три провода для подключения. Вывод VCC должен быть подключен к плюсу источника питания 5В. Вывод данных должен быть подключен к контакту 28 (RD5) микроконтроллера. GND — это минус питания.
Загрузите программу в микроконтроллер, которая доступна в конце этой страницы. Загрузку можно выполнить с помощью USB программатор для PIC микроконтроллеров.
Ниже приведен код программы
#include <xc.h> #include <stdint.h> #include "lcd_hd44780_pic16.h" #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #define DH11_DATA_BIT PORTDbits.RD5 #define DH11_DATA_TRIS TRISDbits.TRISD5 uint8_t dht11_data[40]; uint8_t dht11_rh; uint8_t dht11_temp; uint8_t dht11_measure(); void delay() { uint16_t i; for(i=0;i<3000;i++) { __delay_ms(1); } } void main() { LCDInit(LS_NONE); __delay_ms(50); LCDWriteStringXY(0,0,"DHT11 Demo"); LCDWriteStringXY(0,1,"By -Avinash G"); delay(); LCDClear(); while(1) { LCDClear(); if(!dht11_measure()) { LCDClear(); LCDWriteStringXY(0,0,"Error!"); LCDWriteStringXY(0,1,"No Sensor Found"); } else { LCDWriteStringXY(0,0,"Humidity: % "); LCDWriteIntXY(10,0,dht11_rh,-1); LCDWriteStringXY(0,1,"Temperat: %0C"); LCDWriteIntXY(10,1,dht11_temp,-1); } __delay_ms(50); __delay_ms(50); __delay_ms(50); __delay_ms(50); __delay_ms(50); __delay_ms(50); } } uint8_t dht11_measure() { for(uint8_t i=0;i<40;i++) dht11_data[i]=0; DH11_DATA_BIT=0; DH11_DATA_TRIS=0; __delay_ms(20); DH11_DATA_TRIS=1; uint8_t counter=0; //wait for falling edge while(DH11_DATA_BIT) { counter++; __delay_us(1); if(counter==80) return 0; } //wait for rising edge while(!DH11_DATA_BIT) { counter++; __delay_us(1); if(counter==180) return 0; } //wait for falling edge while(DH11_DATA_BIT) { counter++; __delay_us(1); if(counter==80) return 0; } for(uint8_t i=0;i<40;i++) { //wait for rising edge while(!(PORTD & (1<<5))); //Setup Timer1 T1CKPS0=1; //Prescaller = 1:2 TMR1L=0x00; //Init counter TMR1H=0x00; TMR1ON=1; //Stat timer //wait for falling edge while((PORTD & (1<<5))); TMR1ON=0; /**/ uint16_t time=TMR1L; time=time | (TMR1H<<8); time=time*2; if(time>55 && time <70) { //bit is 0 dht11_data[i]=0; } else if(time>150) { //bit is 1 dht11_data[i]=1; } } dht11_rh=dht11_temp=0; for(uint8_t i=0;i<8;i++) { if(dht11_data[i]==1) dht11_rh|=(1<<(7-i)); } for(uint8_t i=0;i<8;i++) { if(dht11_data[16+i]==1) dht11_temp|=(1<<(7-i)); } return 1; }
В программе наиболее важной функцией является dht11_measure (). Эта функция не принимает аргументов и возвращает 0 или 1. Если результат 1, то это указывает на успех, а если 0, то сбой. Неисправность может быть вызвана неправильным подключением датчика.
Так же важными являются две глобальные переменные dht11_rh и dht11_temp. В первой сохраняется относительная влажность, а во второй сохраняется температура. Этим двум переменным присваиваются значения только после вызова функции dht11_measure () с результатом (1).
Данная программа просто отображает эти две переменные на ЖК-экране.
Соберите схему на макетной плате согласно рисунку. После программирования микроконтроллера, установите его на макетную плату и подайте питание. Отрегулируйте переменным резистором RV1 контрастность LCD дисплея.
Обратите внимание, что для успешной работы схемы необходимо использовать только кварцевый резонатор с частотой 20 МГц. Использование резонатора с другой частотой нарушит работу программного кода.
Скачать прошивку (3,3 KiB, скачано: 243)
http://digital-wizard.net
