back to lab notes
iotactive2025

ESP32 + LoRa IoT System

Sistema multi-nó para monitoramento agrícola e de segurança com topologia híbrida LoRa-to-HTTP e gestão autônoma de energia via Deep Sleep NTP.

ESP32LoRaC++ArduinoHardware

Specifications

MCU

ESP32 (Heltec WiFi LoRa 32 V2)

Protocolo RF

LoRa 915 MHz · 14 dBm

Alcance

~3 km (campo aberto)

Display

OLED SSD1306 128×64

Energia

~10 µA deep sleep

Filesystem

LittleFS (HTML async)

Tech Stack

C++ESP32LoRa SX1276ArduinoESPAsyncWebServerLittleFSNTP

Overview

Arquitetura de rede multi-nó com negociação dinâmica Mestre/Escravo via protocolo PING_CENTRAL / ACK_CENTRAL. Transmissão binária de structs C++ diferenciadas em runtime por contagem de bytes (sizeof). Gateway HTTP assíncrono com API REST servindo dados JSON. Gestão de energia com Deep Sleep sincronizado via NTP — o nó acorda, verifica o horário, e dorme de 18h a 08h. Fallback inteligente de 5 minutos de sono curto em caso de falha WiFi.

Key Features

  • Negociação dinâmica Mestre/Escravo (PING_CENTRAL / ACK_CENTRAL)
  • Discriminação de pacotes LoRa por contagem de bytes: sizeof(JardimData) vs sizeof(GasData)
  • File System embarcado (LittleFS) servindo HTML assincronamente na porta 80
  • Deep Sleep NTP com agendamento noturno (18h-08h) e fallback de 5 min
  • Nó Jardim: sensores umidade solo (ADC GPIO36/37), motor DC (GPIO34/35) — 648 linhas
  • Nó Fogo: sensor gás MQ-2 (analógico GPIO36), sensor chama KY-026 (digital PULLUP GPIO2)

Discriminação de Pacotes LoRa por Tamanho

cpp
// Identificação do tipo de dados pela contagem de bytes
int packetSize = LoRa.parsePacket();

if (packetSize == sizeof(JardimData)) {
  JardimData dados;
  LoRa.readBytes((uint8_t*)&dados, sizeof(dados));
  // Processa dados de irrigação...
} else if (packetSize == sizeof(GasData)) {
  GasData dados;
  LoRa.readBytes((uint8_t*)&dados, sizeof(dados));
  // Processa alarme de gás/fogo...
}