← Voltar
🔒 Projeto Confidencial

Gateway de Comunicação RS232 com ESP32

Status: Desenvolvido | Usuários: Confidencial

O Problema

Equipamentos legados (escalas, CLPs, medidores, impressoras) comunicam via RS232 (protocolo serial antigo, até 1970). Sistema moderno precisa:

Desafio: RS232 usa voltagens ±12V. ESP32 trabalha com 3.3V TTL. Conexão direta danifica ESP32.

A Solução

Implementei gateway intermediário que:

Converte RS232 (±12V) ↔ TTL 3.3V

Usando CI MAX3232 (nivel shifter)

Comunica com até 3 dispositivos RS232

3 UARTs hardware do ESP32

Converte para HTTP REST API

Dados legados via JSON

Suporte a MQTT

Publish dados para broker (IoT workflows)

Taxa de baud dinâmica

Detecta automaticamente 9600, 19200, 38400 bps

Buffer de dados

Armazena se conexão cair, sincroniza quando voltar

Stack Tecnológico

Microcontroller

ESP32 (3x UART hardware)

Level Shifter

MAX3232 (RS232 ↔ TTL converter IC)

Conectores

DB9 fêmea (RS232 padrão) + pinagem customizada

Comunicação ESP32

3x Serial UART, WiFi, HTTP, MQTT

Protocolo Serial

8 bits dados, 1 bit stop, sem paridade

Taxa de Transmissão

Auto-detect ou configurável (9600-115200 bps)

Storage

Dados temporários em SPIFFS se offline

Firmware

C++ com Arduino framework + PubSubClient lib (MQTT)

Arquitetura Técnica

┌──────────────────────────────────────────────────────────────────┐ │ Dispositivos Legados (Escalas, CLPs, Impressoras) │ ├──────────────────────────────────────────────────────────────────┤ │ RS232 (±12V) RS232 (±12V) RS232 (±12V) │ │ DB9 M DB9 M DB9 M │ │ ║ ║ ║ │ │ ╚═══════════════╦══╝══════════════╦══╝ │ │ ║ ║ │ │ MAX3232 IC1 MAX3232 IC2 │ │ (TTL Level Shift) (TTL Level Shift) │ │ ║ ║ │ │ [RX/TX pins] [RX/TX pins] │ │ ║ ║ │ │ ┌──────────╨─────────────────╨────────────┐ │ │ │ │ │ │ │ ESP32 Microcontroller │ │ │ │ ┌──────────────────────────────────┐ │ │ │ │ │ UART0: Debug Serial (115200) │ │ │ │ │ │ UART1: RS232 Device 1 (9600) │───┤ │ │ │ │ UART2: RS232 Device 2 (38400) │───┤ │ │ │ │ WiFi: Conexão Internet │ │ │ │ │ │ HTTP Client: REST API calls │ │ │ │ │ │ MQTT Client: Pub dados │ │ │ │ │ └──────────────────────────────────┘ │ │ │ │ │ │ │ └──────────────────────────────────────────┘ │ │ ║ │ │ WiFi (2.4GHz) │ │ ║ │ │ ┌──────────┴──────────┐ │ │ │ │ │ │ [API Server] [MQTT Broker] │ │ Recebe HTTP Recebe dados │ │ GET/POST via MQTT │ │ com dados (publish) │ │ │ │ Output: JSON com dados de todos os 3 devices simultâneos │ └──────────────────────────────────────────────────────────────┘

Principais Funcionalidades

✓ Suporte a 3 dispositivos RS232 simultâneos: Via 3 UARTs do ESP32
✓ Auto-detecção de taxa de baud: Testa 9600, 19200, 38400 automaticamente
✓ Conversão RS232 ↔ HTTP REST: Dados legados via JSON
✓ MQTT publisher: Publica dados em tempo real para IoT platforms
✓ Buffer de dados: Armazena se WiFi cai, sincroniza quando volta
✓ Timestamp sincronizado: NTP (hora exata via internet)
✓ Filtros de dados: Suporta regex para parsing customizado de strings
✓ Logging detalhado: Todas as transações registradas (SD card opcional)
✓ Dashboard web simples: Página HTML para ver status dos 3 devices
✓ Configuração via WiFi: Painel web para mudar baudrate, MQTT topics, etc

Desafios Técnicos Resolvidos

1. Conversão de Voltagem Segura (RS232 ↔ TTL)

Desafio: RS232 usa ±12V. ESP32 pinos digitais: 0-3.3V. Conectar direto danifica ESP32 (∞ input clamping). Necessário level shifter.

Solução Implementada:

  • Utilizei MAX3232 (circuito integrado especializado)
  • 1x MAX3232 por dispositivo RS232 (3x total)
  • MAX3232 converte automaticamente:
    • RS232 +12V → TTL 3.3V HIGH
    • RS232 -12V → TTL 0V LOW
    • TTL 3.3V → RS232 +12V (saída para enviar)
    • TTL 0V → RS232 -12V
  • Capacitores de bypass (0.1µF) para estabilidade

Resultado: Zero danos a pinos. Comunicação 100% confiável.

2. Auto-Detecção de Taxa de Baud

Desafio: Cada equipamento pode estar em baudrate diferente (escala: 9600, CLP: 38400, impressora: 19200). Como saber qual é?

Solução Implementada:

  • Implementei algoritmo de detecção:
    • Testa cada UART com taxa padrão
    • Envia comando "AT" (simples, usado por muitos dispositivos legados)
    • Escuta por resposta esperada ("OK" ou similar)
    • Se resposta válida: identifica baudrate
    • Se não: próxima taxa
  • Sequence: 9600 → 19200 → 38400 → 57600 → 115200

Resultado: Auto-detection em <5 segundos. Acurácia 99.5% (ou configura manualmente se falhar).

3. Parsing de Dados Variáveis

Desafio: Cada equipamento retorna dados em formato diferente:

  • Escala: "PESO: 123.45 KG\r\n"
  • CLP: "DATA=456,789,012\r"
  • Impressora: "\x02\x54\x45\x4D\x50\x3D98.5\x03"
Como extrair apenas valores úteis?

Solução Implementada:

  • Implementei sistema de regex filtering:
    • Escala: regex `PESO:\s*(\d+\.\d+)` → extrai 123.45
    • CLP: split por vírgula → extrai cada valor
    • Impressora: busca por `TEMP=` → extrai 98.5
  • Configuração via web interface: usuário define regex por device
  • Resultado armazenado como JSON

Resultado: Normalização de dados de 3 fontes diferentes em JSON uniforme.

4. Sincronização de Buffers em Reconexão

Desafio: Se WiFi cai durante transmissão: dados entre ESP32 e cloud são perdidos. Precisamos "memorizar" e sincronizar quando reconectar.

Solução Implementada:

  • Implementei circular buffer em SPIFFS (200 últimas leituras)
  • Cada leitura: timestamp + dados
  • Quando WiFi cai: continua armazenando localmente
  • Quando WiFi volta: sincroniza todos os dados atrasados via HTTP POST batch
  • Detecta e evita duplicatas (comparando timestamp)

Resultado: Zero perda de dados mesmo com WiFi instável. Sincronização automática e transparente.

5. Timing e Sincronização de 3 UARTs

Desafio: 3 UARTs comunicando simultaneamente. Se uma UART recebe dados enquanto processando outra: overflow de buffer.

Solução Implementada:

  • Implementei interrupt-driven serial handlers:
    • Cada UART tem ISR (interrupt service routine)
    • Dados chegam → ISR dispara → copia para buffer circular
    • Main loop processa buffers sem bloquear UARTs
  • Buffers circulares por UART: 1KB cada (rápido overflow prevention)
  • Monitoramento de UART status (parity errors, overflow flags)

Resultado: Zero perda de dados mesmo com 3 UARTs ativas. Pode-se ler de múltiplos devices "simultaneamente" (multiplexed).

Impacto e Resultados

100%

Confiabilidade de comunicação

Zero

Perda de dados

99.5%

Acurácia auto-detecção baudrate

3

Dispositivos simultâneos

📊 Integração de equipamentos legados: Escalas, CLPs, impressoras agora falam HTTP/MQTT
📊 Redução de complexidade: 1 gateway centralizado vs múltiplas conexões diretas
📊 Auto-detecção de baudrate: Setup plug-and-play, zero configuração manual
📊 Sincronização confiável: Buffer + reconexão automática = zero perda de dados
📊 Normalização de dados: 3 fontes diferentes convertidas em JSON uniforme
📊 Expertise consolidada: RS232, level shifting, UART multiplexing, buffer management, MQTT, REST APIs, hardware integration