Подключение датчика влажности DHT11 к микроконтроллеру PIC16F877A

В этой статье мы рассмотрим, как с помощью 8-битного микроконтроллера PIC16F877A вывести данные с цифрового датчика влажности и температуры DHT11 на LCD модуль.

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

фото DHT11

Как вы можете видеть, у DHT11 есть только четыре вывода, один из которых NC, то есть не подключен. Так что будем использовать только три провода для подключения. Вывод VCC должен быть подключен к плюсу источника питания 5В. Вывод данных должен быть подключен к контакту 28 (RD5) микроконтроллера. GND  — это минус питания.

DHT11 к микроконтроллеру PIC16F877A

Загрузите программу в микроконтроллер, которая доступна в конце этой страницы. Загрузку можно выполнить с помощью 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 МГц. Использование резонатора с другой частотой нарушит работу программного кода.

Скачать прошивку (скачено: 1)

http://digital-wizard.net


Добавить комментарий

Ваш электронный адрес не будет опубликован.

*