Integração de Sensores DHT22 e DS18B20 no STM32 para IoT

A integração de sensores como o DHT22 (temperatura e umidade) e o DS18B20 (temperatura) com microcontroladores STM32Famílias de microcontroladores STM32: Uma visão geralFamílias de microcontroladores STM32: Uma visão geralProfundo mergulho nas famílias STM32, explorando arquitetura, aplicações e desempenho. Descubra dicas e casos práticos para projetos embarcados. é fundamental para projetos de IoT, automação residencial e monitoramento ambiental. Este artigo combina teoria e prática, explorando desde a seleção de sensores até a implementação robusta, incluindo protocolos de comunicação, tratamento de erros, calibração e exemplos de código. Você aprenderá a configurar hardware, otimizar leituras e implementar um sistema completo com log de dados em cartão SD.

Índice🔗

Comparação DHT22 vs. DS18B20: Quando usar cada sensor🔗

Especificações técnicas

CaracterísticaDHT22DS18B20
Tipo de sensorUmidade + TemperaturaTemperatura
Faixa de medição-40°C a +80°C (Temp)
0–100% RH (Umidade)
-55°C a +125°C
Precisão±2% RH, ±0.5°C±0.5°C (entre -10°C e +85°C)
InterfaceSingle-bus (GPIO)1-Wire
Alimentação3.3V - 6V3V - 5.5V
Resolução16 bits (umidade)9-12 bits (configurável)

Casos de uso

  • DHT22: Ideal para aplicações que exigem umidade relativa, como estufas, climatização e monitoramento ambiental.
  • DS18B20: Adequado para medições de temperatura em múltiplos pontos (redes industriais) ou onde a escalabilidade via One-Wire é crítica.

Configuração de hardware: Conexões físicas e pinagem🔗

Diagrama de conexões

graph TD STM32 -->|GPIO PD12| DHT22 STM32 -->|GPIO PA5 (1-Wire)| DS18B20 DHT22 -->|VCC| 3.3V DHT22 -->|GND| GND DS18B20 -->|VDD| 3.3V DS18B20 -->|GND| GND

Notas críticas:

  • Use resistor pull-up de 4.7KΩ no pino de dados do DS18B20.
  • Cabos longos (>20m) no DHT22 podem causar perda de sincronização.
  • Alimente os sensores com a mesma tensão do STM32 (3.3V) para evitar danos.

Protocolos de comunicação: GPIO e 1-Wire no STM32🔗

DHT22: Timing do protocolo single-bus

1. Inicialização: MCU puxa a linha para baixo por 1ms.

2. Resposta do sensor: Pulso de 80µs (low) + 80µs (high).

3. Transmissão de dados: 40 bits (16 bits umidade + 16 bits temperatura + 8 bits checksum).

$$ \text{Umidade} = \frac{\text{Dados[0]} \times 256 + \text{Dados[1]}}{10} $$

DS18B20: Comandos 1-Wire

1. Reset: Pulso de 480µs.

2. ROM Command (0xCC para skip ROM).

3. Function Command (0x44 para iniciar conversão).

4. Leitura de Scratchpad (0xBE) após 750ms (12-bit resolution).

Dica: Utilize timersUsando temporizadores para criar delays precisosUsando temporizadores para criar delays precisosDescubra como configurar temporizadores STM32 para criar delays precisos com polling, interrupções e DMA, otimizando energia em sistemas embarcados. do STM32 para garantir precisão na temporização.

Código exemplo: Leitura simultânea de DHT22 e DS18B20🔗

Leitura do DHT22 (GPIO)

void DHT22_Read(float *temp, float *humidity) {
    GPIO_InitTypeDef gpio = {.Pin = GPIO_PIN_12, .Mode = GPIO_MODE_OUTPUT_OD};
    HAL_GPIO_Init(GPIOD, &gpio);
    // Envia sinal de start
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);
    gpio.Mode = GPIO_MODE_INPUT;
    HAL_GPIO_Init(GPIOD, &gpio);
    // Lê os 40 bits (implementar timeout)
    // ... (código completo disponível no repositório)
}

Leitura do DS18B20 (1-Wire)

uint8_t DS18B20_ReadTemp(float *temp) {
    if (OneWire_Reset()) return 0; // Erro na comunicação
    OneWire_WriteByte(0xCC); // Skip ROM
    OneWire_WriteByte(0x44); // Start conversion
    HAL_Delay(750);
    OneWire_Reset();
    OneWire_WriteByte(0xCC);
    OneWire_WriteByte(0xBE); // Read scratchpad
    uint8_t data[9];
    for (int i = 0; i < 9; i++) data[i] = OneWire_ReadByte();
  • temp = (data[1] << 8 | data[0]) * 0.0625;
return (OneWire_CRC8(data, 8) == data[8]); // Verifica CRC }

Calibração e compensação de erros em leituras🔗

Técnicas para DHT22

  • Compensação de temperatura:
$$ RH_{\text{real}} = RH_{\text{medida}} \times \frac{1}{1 + 0.001 \times (T - 25)} $$
  • Filtro de média móvel:
#define SAMPLES 5
float buffer[SAMPLES], sum = 0;
for (int i = 0; i < SAMPLES-1; i++) {
    buffer[i] = buffer[i+1];
    sum += buffer[i];
}
buffer[SAMPLES-1] = new_reading;
return (sum + new_reading) / SAMPLES;

Handling de falhas: Timeouts, checksums e recuperação🔗

Estratégias robustas

FalhaSoluçãoCódigo Exemplo
Timeout DHT22Reinicializa GPIOHAL_GPIO_DeInit(); HAL_GPIO_Init();
CRC inválidoDescarta leituraif (crc != checksum) retry++;
Sensor offlineModo de fallbackHAL_UART_Transmit(&huart2, "ERR", 3, 100);

Projeto prático: Sistema de monitoramento ambiental com log em SD🔗

Arquitetura do sistema

graph LR DHT22 --> STM32 DS18B20 --> STM32 STM32 --> SD_Card[Cartão SD via SPI] STM32 --> UART[Envio para PC]

Fluxo de dados:

1. Leituras a cada 60 segundos.

2. Validação via CRC.

3. Formatação em CSV: 2023-10-05 14:30, 25.4, 45.2, 24.9.

4. Escrita no SD card usando FATFSImplementando um sistema de arquivos no STM32Implementando um sistema de arquivos no STM32Descubra como implementar um sistema de arquivos robusto no STM32 usando FATFS e cartão SD. Exemplos práticos e técnicas avançadas para otimização..

void log_data(float temp1, float temp2, float humidity) {
    FIL file;
    char buffer[64];
    sprintf(buffer, "%lu,%.1f,%.1f,%.1f\n", HAL_GetTick(), temp1, temp2, humidity);
    f_open(&file, "data.csv", FA_WRITE | FA_OPEN_APPEND);
    f_write(&file, buffer, strlen(buffer), NULL);
    f_close(&file);
}

Dica: Use um buffer circular na RAM para evitar corrupção de arquivo durante falhas de energia.

Desafios e Boas Práticas🔗

Desafios Frequentes

1. Temporização precisaUsando temporizadores para criar delays precisosUsando temporizadores para criar delays precisosDescubra como configurar temporizadores STM32 para criar delays precisos com polling, interrupções e DMA, otimizando energia em sistemas embarcados.: Interferências podem afetar a leitura do DHT22.

2. Gerenciamento de múltiplos sensores: Redes One-Wire exigem endereçamento único.

3. Níveis de tensão: Garanta compatibilidade entre sensores e STM32O que é STM32 e por que usá-lo?O que é STM32 e por que usá-lo?Descubra os principais benefícios, arquitetura ARM Cortex-M e aplicações práticas dos microcontroladores STM32. Comece a inovar agora..

Boas Práticas

  • Bibliotecas validadas: Utilize bibliotecas otimizadas para One-Wire e DHT22.
  • Modularização: Separe funções de leitura, processamento e logging.
  • Testes contínuos: Valide leituras com termômetros e higrômetros de referência.

Conclusão🔗

A integração do DHT22 e DS18B20 com STM32O que é STM32 e por que usá-lo?O que é STM32 e por que usá-lo?Descubra os principais benefícios, arquitetura ARM Cortex-M e aplicações práticas dos microcontroladores STM32. Comece a inovar agora. permite criar sistemas de monitoramento ambiental robustos e escaláveis. Dominar protocolos como GPIO e One-Wire, aliado a técnicas de calibração e tratamento de falhas, é essencial para aplicações reais. O projeto prático com log em SD demonstra como consolidar dados para análise posterior, tornando-se uma base para soluções IoT complexas. Experimente, ajuste e documente cada etapa para garantir confiabilidade em seus projetos embarcados.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados