- DHT11 - Especificação e Funcionamento
- Comunicando-se com o Sensor DHT11
- Componentes necessários
- Esquemático
- DHT11 com explicação do código PIC MPLABX
A medição de temperatura e umidade é frequentemente útil em muitas aplicações como automação residencial, monitoramento de ambiente, estação meteorológica, etc. O sensor de temperatura mais popularmente usado ao lado do LM35 é o DHT11, nós construímos anteriormente muitos projetos DHT11 fazendo interface com Arduino, com framboesa Pi e muitas outras placas de desenvolvimento. Neste artigo, aprenderemos como fazer a interface deste DHT11 com o PIC16F87A, que é um microcontrolador PIC de 8 bits. Usaremos este microcontrolador para ler os valores de Temperatura e Umidade usando DHT11 e exibi-lo em um display LCD. Se você não tem experiência com o uso de microcontroladores PIC, pode usar nossa série de tutoriais PIC para aprender como programar e usar microcontroladores PIC. Dito isso, vamos começar.
DHT11 - Especificação e Funcionamento
O sensor DHT11 está disponível em forma de módulo ou em forma de sensor. Neste tutorial, estamos usando o sensor, a única diferença entre os dois é que na forma de módulo o sensor possui um capacitor de filtragem e um resistor pull-up acoplado ao pino de saída do sensor. Portanto, se você estiver usando o módulo, não precisa adicioná-los externamente. O DHT11 em forma de sensor é mostrado abaixo.
O sensor DHT11 vem com um invólucro de cor azul ou branco. Dentro dessa caixa, temos dois componentes importantes que nos ajudam a sentir a umidade relativa e a temperatura. O primeiro componente é um par de eletrodos; a resistência elétrica entre esses dois eletrodos é determinada por um substrato que retém umidade. Portanto, a resistência medida é inversamente proporcional à umidade relativa do ambiente. Quanto maior a umidade relativa menor será o valor da resistência e vice-versa. Além disso, observe que a umidade relativa é diferente da umidade real. A umidade relativa mede o conteúdo de água no ar em relação à temperatura do ar.
O outro componente é um termistor NTC montado em superfície. O termo NTC significa coeficiente de temperatura negativo, pois o aumento da temperatura diminui o valor da resistência. A saída do sensor é calibrada de fábrica e, portanto, como programadores, não precisamos nos preocupar em calibrar o sensor. A saída do sensor dada pela comunicação 1-Wire, vamos ver o pino e o diagrama de conexão deste sensor.
O produto está em um pacote de 4 pinos com uma única linha. O primeiro pino é conectado ao VDD e o 4º pino é conectado ao GND. O segundo pino é o pino de dados, usado para fins de comunicação. Este pino de dados precisa de um resistor pull-up de 5k. No entanto, outros resistores de pull up, como 4,7k a 10k também podem ser usados. O terceiro pino não está conectado a nada. Portanto, é ignorado.
A folha de dados fornece especificações técnicas, bem como informações de interface que podem ser vistas na tabela abaixo
A tabela acima mostra a precisão e a faixa de medição de Temperatura e Umidade. Ele pode medir a temperatura de 0-50 graus Celsius com uma precisão de +/- 2 graus Celsius e umidade relativa de 20-90% UR com uma precisão de +/- 5% UR. A especificação de detalhes pode ser vista na tabela abaixo.
Comunicando-se com o Sensor DHT11
Conforme mencionado anteriormente, para ler os dados do DHT11 com PIC, temos que usar o protocolo de comunicação de um fio PIC. Os detalhes de como fazer isso podem ser entendidos no diagrama de interface do DHT 11 que pode ser encontrado em seu datasheet, o mesmo é dado abaixo.
O DHT11 precisa de um sinal de início do MCU para iniciar a comunicação. Portanto, toda vez que o MCU precisa enviar um sinal de partida ao Sensor DHT11 para solicitar que ele envie os valores de temperatura e umidade. Após completar o sinal de partida, o DHT11 envia um sinal de resposta que inclui as informações de temperatura e umidade. A comunicação de dados é feita pelo protocolo de comunicação de dados de barramento único. O comprimento total dos dados é de 40 bits e o sensor envia os bits de dados mais altos primeiro.
Devido ao resistor pull-up, a linha de dados sempre permanece no nível VCC durante o modo inativo. O MCU precisa reduzir essa tensão de alta para baixa por um intervalo mínimo de 18 ms. Durante este tempo, o sensor DHT11 detecta o sinal de início e o microcontrolador torna a linha de dados alta para 20-40us. Este tempo de 20-40us é chamado de período de espera onde o DHT11 começa a responder. Após esse período de espera, o DHT11 envia os dados para a unidade microcontroladora.
Formato de DADOS do Sensor DHT11
Os dados consistem em partes decimais e inteiras combinadas. O sensor segue o formato de dados abaixo -
Dados RH integrais de 8 bits + dados RH decimais de 8 bits + dados T integrais de 8 bits + dados T decimais de 8 bits + soma de verificação de 8 bits.
Pode-se verificar os dados verificando o valor da soma de verificação com os dados recebidos. Isso pode ser feito porque, se tudo estiver correto e se o sensor tiver transmitido os dados corretos, a soma de verificação deve ser a soma de “dados RH integrais de 8 bits + dados RH decimais de 8 bits + dados T integrais de 8 bits + dados T decimais de 8 bits”.
Componentes necessários
Para este projeto, as coisas abaixo são necessárias -
- Configuração da programação do microcontrolador PIC (8 bits).
- Tábua de pão
- Fonte de alimentação 5V 500mA.
- Resistor 4,7k 2pcs
- Resistor 1k
- PIC16F877A
- Cristal de 20mHz
- Capacitor 33pF 2 pcs
- LCD de 16x2 caracteres
- Sensor DHT11
- Fios de ligação
Esquemático
O diagrama do circuito para fazer a interface do DHT11 com PIC16F877A é mostrado abaixo.
Usamos um LCD 16x2 para exibir os valores de temperatura e umidade que medimos no DHT11. O LCD é conectado no modo de 4 fios e o sensor e o LCD são alimentados por uma fonte de alimentação externa de 5V. Usei uma placa de ensaio para fazer todas as conexões necessárias e usei um adaptador externo de 5V. Você também pode usar esta placa de alimentação da placa de ensaio para alimentar sua placa com 5V.
Assim que o circuito estiver pronto, tudo o que temos que fazer é carregar o código fornecido no final desta página e podemos começar a ler a Temperatura e Umidade como mostrado abaixo. Se você deseja saber como o código foi escrito e como funciona, leia mais. Além disso, você pode encontrar o trabalho completo deste projeto no vídeo fornecido no final desta página.
DHT11 com explicação do código PIC MPLABX
O código foi escrito usando MPLABX IDE e compilado usando o compilador XC8, ambos fornecidos pela própria Microchip e podem ser baixados e usados gratuitamente. Consulte os tutoriais básicos para entender os fundamentos da programação; apenas as três funções importantes que são necessárias para a comunicação com o sensor DHT11 são discutidas abaixo. As funções são -
void dht11_init (); void find_response (); char read_dht11 ();
A primeira função é usada para o sinal de partida com dht11. Como discutido antes, toda comunicação com DHT11 começa com um sinal de início, aqui a direção do pino é alterada primeiro para configurar o pino de dados como saída do microcontrolador. Então a linha de dados é puxada para baixo e continua esperando por 18 ms. Depois disso, novamente a linha é elevada pelo microcontrolador e fica aguardando até 30us. Após esse tempo de espera, o pino de dados definido como entrada para o microcontrolador para receber os dados.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Configure RD0 como saída DHT11_Data_Pin = 0; // RD0 envia 0 para o sensor __delay_ms (18); DHT11_Data_Pin = 1; // RD0 envia 1 para o sensor __delay_us (30); DHT11_Data_Pin_Direction = 1; // Configure RD0 como entrada }
A próxima função é usada para configurar um bit de verificação dependendo do status do pino de dados. É usado para detectar a resposta do sensor DHT11.
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);} }
Finalmente, a função de leitura dht11; aqui os dados são lidos em um formato de 8 bits, onde os dados são retornados usando a operação de deslocamento de bits, dependendo do status do pino de dados.
char read_dht11 () { dados de char, 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)); // Limpar bit (7-b) } else { data- = (1 << (7 - for_count)); // Definir bit (7-b) while (DHT11_Data_Pin); } } dados de retorno; }
Depois disso, tudo é feito na função principal. Primeiro, a inicialização do sistema é feita onde o LCD é inicializado e a direção da porta dos pinos do LCD é definida para a saída. O aplicativo está rodando dentro da função principal
void main () { system_init (); enquanto (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 (); Soma = read_dht11 (); if (Soma == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Umidade = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Umidade / 10)% 10)); lcd_data (48 + (umidade% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Umidade:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Erro de soma de verificação"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("Erro !!!"); lcd_com (0xC0); lcd_puts ("Sem resposta."); } __delay_ms (1000); } }
A comunicação com o sensor DHT11 é feita no interior do enquanto ciclo em que o sinal de arranque é apresentado para o sensor. Depois disso, a função find_response é acionada. Se Check_bit for 1, a comunicação posterior será realizada, caso contrário, o LCD mostrará uma caixa de diálogo de erro.
Dependendo dos dados de 40 bits, o read_dht11 é chamado 5 vezes (5 vezes x 8 bits) e armazenado os dados de acordo com o formato de dados fornecido na ficha técnica. O status da soma de verificação também é verificado e, se forem encontrados erros, ele também notificará no LCD. Finalmente, os dados são convertidos e transmitidos para o LCD de 16x2 caracteres.
O código completo para esta medição de temperatura e umidade PIC pode ser baixado aqui. Verifique também o vídeo de demonstração abaixo.
Espero que você tenha entendido o projeto e gostado de construir algo útil. Se você tiver alguma dúvida, deixe-a na seção de comentários abaixo ou use nossos fóruns para outras questões técnicas.