#include "pico/stdlib.h"
#include <stdio.h>
#include <string.h>
#define PINO_DHT 20 // Pino do DHT22
#define TIMEOUT_US 1000 // Tempo limite para pulsos do sensor
// Função para medir a duração de um pulso
static uint32_t medir_pulso(bool nivel) {
uint32_t inicio = time_us_32();
while (gpio_get(PINO_DHT) == nivel) {
if (time_us_32() - inicio > TIMEOUT_US) {
return TIMEOUT_US; // Timeout
}
}
return time_us_32() - inicio;
}
// Envia o pulso inicial para o DHT22
void enviar_pulso_inicial() {
gpio_set_dir(PINO_DHT, GPIO_OUT);
gpio_put(PINO_DHT, 0); // Pulso baixo por 18ms
sleep_ms(18);
gpio_put(PINO_DHT, 1); // Pulso alto por 20-40µs
sleep_us(30);
gpio_set_dir(PINO_DHT, GPIO_IN); // Configura como entrada
}
// Lê os dados do DHT22
bool ler_dados_dht22(uint8_t *dados) {
memset(dados, 0, 5); // Zera o buffer
// Aguarda a resposta do sensor
if (medir_pulso(0) == TIMEOUT_US || medir_pulso(1) == TIMEOUT_US) {
printf("Erro: Sem resposta do sensor\n");
return false;
}
// Lê os 40 bits de dados (5 bytes)
for (int i = 0; i < 40; i++) {
if (medir_pulso(0) == TIMEOUT_US) {
printf("Erro: Pulso baixo longo demais\n");
return false;
}
uint32_t duracao = medir_pulso(1);
if (duracao == TIMEOUT_US) {
printf("Erro: Pulso alto longo demais\n");
return false;
}
// Determina o valor do bit com base na duração do pulso
if (duracao > 50) {
dados[i / 8] |= (1 << (7 - (i % 8)));
}
}
// Verifica o checksum
uint8_t checksum = dados[0] + dados[1] + dados[2] + dados[3];
if (checksum != dados[4]) {
printf("Erro: Checksum inválido\n");
return false;
}
return true;
}
int main() {
stdio_init_all(); // Inicializa a saída serial
gpio_init(PINO_DHT); // Inicializa o pino do sensor
uint8_t dados[5]; // Buffer para dados do sensor
float temperatura, umidade;
while (true) {
printf("Iniciando leitura do DHT22...\n");
enviar_pulso_inicial();
if (ler_dados_dht22(dados)) {
// Converte os dados para valores reais
umidade = ((dados[0] << 8) + dados[1]) / 10.0;
temperatura = ((dados[2] << 8) + dados[3]) / 10.0;
if (dados[2] & 0x80) { // Verifica se a temperatura é negativa
temperatura = -temperatura;
}
// Validação adicional para valores lidos
if (umidade >= 0.0 && umidade <= 100.0) {
printf("Temperatura: %.1f °C, Umidade: %.1f %%\n", temperatura, umidade);
} else {
printf("Erro: Umidade fora do intervalo válido (0-100%%): %.1f %%\n", umidade);
}
} else {
printf("Erro ao ler o DHT22\n");
}
sleep_ms(2000); // Aguarda 2 segundos entre leituras
}
return 0;
}
Loading
pi-pico-w
pi-pico-w