Pular para conteúdo

Hardware — Smart Meter ESP32

Este documento consolida o material técnico de hardware/firmware do Smart Meter (camada Edge Computing) que alimenta o EnergIA via MQTT. É a versão resumida e versionada do material bruto que fica em hardware/ na raiz do projeto (pasta não versionada — ver seção 10).

Status atual: protótipo monofásico montado, calibrado e instalado em um quadro elétrico residencial real. O trifásico existe apenas como especificação (seção 6), sem montagem física.


1. Arquitetura Edge (monofásico)

Componente Modelo Função
Microcontrolador ESP32 (30 pinos, 4MB Flash, Wi-Fi/BT) Processamento e conectividade
Shield expansor Base para ESP32 30 pinos Jumper de tensão obrigatoriamente em 3V (3.3V)
Fonte Chaveada AC/DC 12V, 450mA / 5W Alimentação, via Jack P4 do shield
Caixa Plástica Patola (PB-114/2 TE, 38x97x148mm) Alojamento
Sensor de tensão ZMPT101B Amostragem via ADC nativo do ESP32 (pino D35)
Sensor de corrente SCT-013-100 (100A/1V, não invasivo) Corrente via pinça amperimétrica
Conversor A/D ADS1115 (16 bits, I2C, endereço 0x48) Leitura de corrente em alta resolução
Circuito de bias 2x resistores 10kΩ + 1x capacitor 10µF Gera referência DC de 1.65V para o SCT-013
RTC DS3231 (I2C, endereço 0x68, bateria CR2032) Hora válida desde o boot, sem depender de NTP — timestamps do buffer offline e TLS (firmware v3, montado e validado em 18/07/2026)

O DS3231 compartilha o barramento I2C com o ADS1115 (SDA=GPIO21, SCL=GPIO22, VCC 3.3V) — endereço 0x68 não conflita com os 0x48/0x49/0x4A dos conversores.

O sinal de tensão (ZMPT101B) vai direto ao ADC nativo do ESP32, nunca ao ADS1115 — compartilhar o mesmo ADC para tensão e corrente ativaria a multiplexação interna, reduzindo a velocidade de amostragem pela metade e distorcendo a leitura da onda.


2. Orçamento (BOM)

Monofásico (protótipo base)

Componente Qtd. Preço Unit. (R$) Subtotal (R$)
Microcontrolador ESP32 (30 pinos, 4MB Flash, Wi-Fi/BT) 1 38,60 38,60
Módulo Shield Expansor de Portas 1 24,50 24,50
Fonte Chaveada Módulo AC/DC (12V, 5W, 450mA) 1 26,90 26,90
Caixa Plástica Patola (PB-114/2 TE) 1 48,30 48,30
Módulo Sensor de Tensão AC (ZMPT101B) 1 22,97 22,97
Sensor de Corrente AC Não Invasivo (SCT-013, 100A/1V) 1 47,90 47,90
Módulo Conversor ADC (ADS1115, 16 bits, I2C) 1 19,00 19,00
Kit Jumper Fêmea-Fêmea 20cm (10 un.) 1 11,00 11,00
Módulo RTC DS3231 (I2C, com bateria CR2032) 1 (preencher — adquirido em jul/2026)
Total monofásico R$ 239,17 + RTC

Trifásico (escala comercial)

Componente Qtd. Preço Unit. (R$) Subtotal (R$)
Microcontrolador ESP32 (30 pinos, 4MB Flash, Wi-Fi/BT) 1 38,60 38,60
Módulo Shield Expansor de Portas 1 24,50 24,50
Fonte Chaveada Módulo AC/DC (12V, 5W, 450mA) 1 26,90 26,90
Caixa Plástica Patola (PB-114/2 TE) 1 48,30 48,30
Módulo Sensor de Tensão AC (ZMPT101B) 3 22,97 68,91
Sensor de Corrente AC Não Invasivo (SCT-013, 100A/1V) 3 47,90 143,70
Módulo Conversor ADC (ADS1115, 16 bits, I2C) 3 19,00 57,00
Kit Jumper Fêmea-Fêmea 20cm (10 un.) 3 11,00 33,00
Total trifásico R$ 440,91

O núcleo de processamento e alojamento (ESP32, shield, fonte, caixa) mantém-se único na versão trifásica; apenas os sensores de leitura e conversores são triplicados.

Este orçamento cobre compra unitária/varejo. Para a estimativa de custo em escala (100+ unidades) — ver seção 8; é uma estimativa a partir de dados públicos de atacado, não uma cotação formal confirmada por fornecedor.


3. Firmware

Stack (v1): WiFi.h, WiFiClientSecure, MQTT (biblioteca de Joël Gähwiler), Wire.h, Adafruit_ADS1X15, ArduinoJson, time.h.

Stack (v3, adições): LittleFS (buffer offline), Preferences (kWh persistente em NVS), RTClib (DS3231), ArduinoOTA (atualização por Wi-Fi), esp_sntp.h (callback de sincronização NTP → ajuste do RTC).

Versões: | Versão | Arquivo | Conteúdo | |---|---|---| | v1 | hardware/ESP32_script.txt | Medição + MQTT TLS (em produção no protótipo instalado) | | v2 | hardware/ESP32_script_v2_buffer.txt | + buffer local, kWh persistente, reconexão não-bloqueante | | v3 | firmware/smart_meter_v3/smart_meter_v3.ino (versionado) | + RTC DS3231, OTA por Wi-Fi, downsample adaptativo (gravado e validado em 18/07/2026 — em produção) |

A v3 é a primeira versão versionada no repositório: as credenciais ficam em firmware/smart_meter_v3/secrets.h (ignorado pelo git — copie de secrets.example.h e preencha antes de compilar).

Requisitos de compilação da v3: biblioteca RTClib (Adafruit) via Library Manager; Partition Scheme "Default 4MB with spiffs" — tem os 2 slots de app exigidos pelo OTA e ~1.5MB de LittleFS (não usar "Huge APP", que remove o OTA). Antes de gravar, definir OTA_PASSWORD.

Fluxo de atualização OTA: a primeira gravação da v3 é via USB; depois, o dispositivo aparece na IDE Arduino como Porta de Rede (smartmeter-sm001, protegido por senha) e as próximas atualizações são feitas pela rede local, sem abrir a caixa. Durante o upload, a amostragem pausa e o kWh é salvo no NVS antes do reinício. O OTA só funciona na mesma LAN (não via internet).

Fluxo de execução: 1. Conecta ao Wi-Fi e sincroniza o relógio via NTP (obrigatório para validar a cadeia de certificados TLS). 2. Conecta ao broker HiveMQ Cloud via MQTTS (porta 8883), com Last Will and Testament configurado no tópico de status. 3. A cada ciclo, coleta 500 amostras de tensão e corrente (a 860 SPS no ADS1115, ~0,6s), calcula Vrms/Irms via teorema da variância (remove o offset DC sem precisar de uma constante fixa), aplica um filtro passa-alta para zerar leituras com irms < 0.1A, e calcula potência ativa e fator de potência. 4. Publica o payload a cada 5 segundos no tópico casa/{mqtt_id}/telemetria.

Payload MQTT (monofásico ativo):

{ "vrms": 220.5, "irms": 4.2, "watts": 910.1, "fp": 0.98, "kwh": 12.34, "ts": 1751500000 }

Nota de segurança: o firmware de referência (hardware/ESP32_script.txt, não versionado) contém credenciais de Wi-Fi e MQTT em texto puro, usadas apenas na bancada de testes. Não usar esse arquivo como template sem antes extrair as credenciais para fora do código-fonte.


4. Calibração e Validação

Resultados obtidos durante a validação metrológica em bancada, documentados no Relatório Técnico original (hardware/, não versionado):

  • Conectividade TLS: a ausência de RTC no ESP32 fazia o relógio iniciar em 1970, invalidando a cadeia de certificados — resolvido com sincronização NTP obrigatória antes do handshake TLS. A biblioteca PubSubClient (buffer de 256 bytes) foi substituída pela MQTTClient (buffer de 1024 bytes) para acomodar a URL do broker + cabeçalhos de criptografia. net.setInsecure() é usado para evitar esgotamento de SRAM na validação da cadeia de certificado — o tráfego permanece 100% criptografado ponto-a-ponto, apenas a validação da assinatura de terceiros é suprimida.
  • Estabilidade da conexão: desconexões intermitentes a cada ~22s ("efeito ioiô") eram causadas pela janela de amostragem bloqueando a main thread além do Keep-Alive do broker. Resolvido elevando o Data Rate do ADS1115 de 128 SPS para o máximo de hardware (860 SPS).
  • Calibração de tensão (ZMPT101B): ganho ajustado via trimpot + calibração por software, validada contra multímetro True RMS Minipa ET-3711. Variação de aproximadamente 0,6% (225,7V real vs. 227,2V amostrado).
  • Correção de offset dinâmico: o SCT-013 apresentava uma "corrente fantasma" de 0,8A em vazio, causada por dilatação térmica dos resistores do divisor de tensão (referência de 1,65V). Resolvido com o teorema da variância (calcula a média em tempo real e subtrai, isolando a componente AC do ruído DC térmico).
  • Calibração de corrente: constante CORRENTE_CAL = 0.0188, aferida cruzando a leitura da ESP com um alicate amperímetro de referência (3,32A).
  • Fator de potência: validado sob carga puramente resistiva, resultando em FP = 0,99.

Ressalva sobre o FP: carga resistiva tem FP verdadeiro igual a 1,000, e é o único ponto da curva onde um erro de fase não aparece. O valor de 0,99 indica um erro sistemático de aproximadamente 8 graus, que superestima o FP em cargas indutivas e cresce conforme o FP cai. A medição não está validada fora da carga resistiva.

Os 8 graus são ordem de grandeza inferida de um único ponto, não constante de calibração. O mecanismo proposto (leitura não simultânea de tensão e corrente) implicaria um atraso bem maior que o inferido, e parte do erro pode vir do ZMPT101B ou do núcleo do SCT-013. Por isso o número não deve ser invertido sobre leituras de produção para estimar o FP real de uma instalação: qualquer leitura mapeia para algum valor de aparência plausível, e isso não constitui medição. Análise completa, impacto quantificado e protocolo de ensaio em fator-de-potencia.md.


5. Especificação Trifásica (plano de expansão — não construído)

Arquitetura documentada no Documento Final e na Adenda Técnica (hardware/, não versionados). Não há evidência de montagem física — o bloco trifásico está comentado no firmware de referência, e as fotos de instalação existentes mostram apenas um sensor de corrente instalado.

  • 3x ZMPT101B (fases R, S, T), ligados diretamente aos pinos ADC nativos do ESP32: D35 (R), D34 (S), D33 (T).
  • 3x SCT-013-100, cada um acoplado a um ADS1115 dedicado (um por fase, para evitar o gargalo de multiplexação que reduziria a taxa efetiva de amostragem pela metade).
  • Endereçamento I2C via pino ADDR: 0x48 (GND, fase R), 0x49 (VDD, fase S), 0x4A (SDA, fase T).
  • Circuito de bias único (1,65V) compartilhado entre os três sensores de corrente, para economia de espaço.
  • PHASECAL (biblioteca EmonLib): corrige digitalmente o desfasamento introduzido pelo núcleo do SCT-013 e pelo tempo de resposta I2C do ADS1115, necessário para o cálculo correto de cos(φ).
  • Payload MQTT passaria a agrupar a telemetria por fase (V, I, W, FP) mais a totalização (Watts e kWh).
  • Custo: R$ 440,91 (seção 2).

6. Segurança Elétrica

O protótipo monofásico já está instalado em um quadro elétrico residencial real (evidência fotográfica em hardware/, não versionada).

Precauções técnicas de projeto adotadas na instalação: desenergização total do painel durante a acoplagem do sensor, isolamento do circuito de bias, e uso de um sensor de corrente não invasivo (não há corte de fio nem contato direto com condutores energizados).

Ressalva importante: este documento registra as precauções técnicas de engenharia adotadas no projeto. Ele não substitui uma Anotação de Responsabilidade Técnica (ART) nem certifica conformidade legal com a NBR 5410 ou a NR-10. Conformidade formal exige inspeção e assinatura de um profissional habilitado (eletricista/engenheiro eletricista), o que está fora do que este projeto de software pode produzir.


7. Persistência Local (firmware v3 — implementada e validada em 18/07/2026)

O firmware v1 (hardware/ESP32_script.txt) não tem buffer local e, pior, bloqueia a medição durante quedas de rede (os while de reconexão travam o loop principal — nem o kWh acumula). O incidente de produção de 2026-07-13 (~3 dias de leituras perdidas) materializou esse risco.

O firmware v3 (firmware/smart_meter_v3/, versionado) trata o gap com três mudanças:

  1. Buffer local (LittleFS) com downsample adaptativo: leituras não publicadas são gravadas em dois arquivos em rodízio (~600KB cada). Quedas curtas (até ~4,5h) são bufferizadas na taxa cheia de 5s (fidelidade total para o NILM); acima de metade da capacidade do arquivo, a taxa cai para 1 leitura a cada 30s, estendendo a cobertura total para ~31h–62h de queda. O kWh do período nunca se perde (campo acumulativo). Ao reconectar, o backlog é reenviado em lotes com o ts original — o backend usa ts como measured_at e deduplica por janela de ±3s, então o histórico se preenche retroativamente.
  2. kWh persistente (NVS): o acumulado sobrevive a reboot/queda de energia; gravação a cada 0.05 kWh para limitar desgaste da flash.
  3. Reconexão não-bloqueante: a medição continua rodando sem rede; Wi-Fi/NTP/MQTT são retentados a cada 15s sem travar o loop.

Limitação da v2 (resolvida na v3): após queda de energia (não só de rede), o relógio só era válido depois do NTP — leituras sem hora válida não eram bufferizadas. A v3 integra o RTC DS3231 (adquirido em jul/2026): o relógio do sistema é restaurado do RTC no boot (hora em UTC, bateria CR2032), e o NTP passa a apenas corrigir o drift do RTC quando há rede.

Status: CONCLUÍDO em 18/07/2026 — DS3231 montado no barramento I2C compartilhado (GPIO21/22), firmware v3 gravado via USB (placa substituta, perfil ESP32-WROOM-DA, partição "Default 4MB with spiffs") e troca física realizada no quadro mantendo a identidade SM-001. Os 3 cenários de validação foram executados (ver PRD item 21.1.8/21.1.9): (1) queda de energia+internet com timestamp íntegro restaurado do DS3231 no boot sem rede; (2) upload OTA real com kWh contínuo através de reinícios; (3) queda de Wi-Fi prolongada (12,6 min) com 30 leituras bufferizadas entregues com ts correto e kWh estritamente crescente.


8. Custo em Escala

Natureza desta seção: o que segue é uma estimativa documentada a partir de anúncios públicos de atacado (Alibaba/AliExpress) e de prática comum de desconto por volume de distribuidores brasileiros de eletrônica para maker (FilipeFlop, RoboCore, Eletrogate) — não é uma cotação formal de um fornecedor específico para este pedido. O critério de conclusão original ("pelo menos uma cotação por lote real") ainda não foi atendido no sentido estrito — o próximo passo concreto é enviar um RFQ (pedido formal de cotação) a 2–3 distribuidores nomeados acima para um lote de 100 unidades e substituir as estimativas abaixo pelos valores reais recebidos.

8.1 Metodologia

Cotação USD/BRL de referência: R$ 5,10 (13/07/2026, Investing.com/Banco Central). Desconto de volume aplicado sobre o preço unitário de varejo (seção 2) por categoria de componente, com base no padrão observado publicamente para pedidos de 100+ unidades:

Componente Preço varejo (R$) Desconto estimado (100+ un.) Preço estimado em lote (R$) Base da estimativa
ESP32 (30 pinos, 4MB) 38,60 22% 30,11 Placa altamente comoditizada; varejo internacional ~US$6–10, atacado ~US$4
Shield Expansor 24,50 20% 19,60 PCB genérica, sem dado de mercado específico — desconto típico de categoria
Fonte Chaveada AC/DC 26,90 15% 22,87 Fontes têm margem mais apertada mesmo no atacado
Caixa Plástica Patola 48,30 25% 36,23 Injeção plástica nacional tem bom ganho de escala a partir de 100+ un.
Sensor de Tensão ZMPT101B 22,97 20% 18,38 Tabela pública Alibaba: 1un. US$0,77 → 500+un. US$0,60 (≈22%)
Sensor de Corrente SCT-013-100 47,90 15% 40,72 Núcleo bobinado encarece o custo de material; desconto de escala mais modesto que sensores passivos
Conversor ADC ADS1115 19,00 30% 13,30 Breakout board I2C muito comoditizado; preço de varejo "boutique" (~US$9,75) tem margem alta sobre o FOB
Kit Jumper (10un.) 11,00 25% 8,25 Componente de commodity extrema
Módulo RTC DS3231 (c/ bateria) 18,00 (estimativa — preencher com o valor real da compra de jul/2026) 20% 14,40 Preço de varejo nacional típico para módulo com bateria CR2032; não confirmado com o recibo real da compra
Total estimado (100 un., monofásico) 257,17* ≈ 203,86 ≈ 21% abaixo do varejo (ponderado)

* Total varejo com o RTC na estimativa de R$18 (a seção 2 mantém o RTC em aberto até o recibo real ser lançado).

8.2 Da estimativa de custo de componentes ao preço de venda sugerido

O custo de componentes não é o custo de produção nem o preço de venda. Adicionando estimativas conservadoras de montagem/teste, embalagem e garantia (valores próprios, não cotados):

Item Valor estimado (R$) Base
Componentes (100 un., seção 8.1) 203,86 Tabela acima
Montagem, calibração e teste por unidade 20,00 ~15–20 min de mão de obra por unidade a taxa de mercado para montagem eletrônica simples
Embalagem, etiqueta e manual 8,00 Estimativa própria
Reserva de defeito/garantia (~3%) 7,00 3% sobre o custo de componentes
Custo total de produção estimado ≈ 238,86
Margem sugerida (35%, cobre P&D/suporte/distribuição) +83,60 Estimativa própria — típica para hardware de nicho em pequena escala
Preço de venda unitário sugerido (lote de 100) ≈ R$ 322,00

8.3 Nota de honestidade sobre a distância do valor de referência do briefing

O briefing do Desafio 6 cita ~R$150 como referência de custo unitário. A estimativa acima (≈R$322 de venda, ≈R$239 de custo de produção) fica acima dessa referência — e é importante não maquiar essa distância. O motivo estrutural: o BOM atual usa módulos "breakout" prontos (shield expansor, ADS1115 avulso, caixa injetada de terceiros) pensados para prototipagem, não uma placa de produção. Uma versão real de produto integraria o ESP32, o condicionamento de sinal e o RTC em uma PCB própria (eliminando o shield expansor e a placa ADS1115 avulsa) e usaria um invólucro sob molde próprio — o que reduziria o custo de material de forma muito mais agressiva do que desconto de volume sobre os módulos atuais, mas exige investimento de engenharia (NRE) e um lote mínimo de produção tipicamente medido em milhares de unidades, não 100. Fechar o gap até ~R$150 é, portanto, uma decisão de investir em uma segunda geração de hardware — não algo alcançável só por comprar mais unidades dos mesmos módulos de prototipagem.

8.4 Próximo passo real — RFQ

Enviar RFQ para 2–3 distribuidores nacionais (FilipeFlop, RoboCore, Eletrogate) especificando: 100 unidades de cada item da seção 8.1, prazo de entrega e condição de pagamento — e substituir as estimativas desta seção pelos valores recebidos antes de qualquer decisão de compra.

Modelo pronto para envio (e-mail ou formulário de atendimento comercial do distribuidor):

Assunto: Pedido de cotação — lote de 100 unidades (projeto de medidor de energia residencial)

Prezados,

Estou desenvolvendo um medidor de energia residencial não invasivo (projeto EnergIA · Smart Meter, incubado na 1ª Jornada Incubintech de Inovação Aberta / IFSC Florianópolis) e solicito cotação formal para o lote abaixo, com desconto por volume, prazo de entrega e condições de pagamento:

Item Qtd.
Placa de desenvolvimento ESP32 (30 pinos, 4 MB flash) 100
Shield expansor para ESP32 30 pinos 100
Fonte chaveada AC/DC 5 V 100
Caixa plástica tipo Patola (ou equivalente) 100
Sensor de tensão ZMPT101B 100
Sensor de corrente não invasivo SCT-013-100 (100 A) 100
Conversor ADC ADS1115 (breakout I2C) 100
Kit jumper fêmea-fêmea (10 un.) 100
Módulo RTC DS3231 com bateria CR2032 100

Pedimos, se possível: (1) preço unitário por item nesta quantidade; (2) validade da cotação; (3) prazo de entrega para Florianópolis/SC; (4) faixas de desconto adicionais (250/500 un.) caso existam.

Atenciosamente, [nome] — [telefone/e-mail]

Registro das respostas (preencher ao receber):

Distribuidor Data do envio Data da resposta Total do lote (R$) Validade Prazo Observações
FilipeFlop
RoboCore
Eletrogate

9. Material de Referência (pasta hardware/, não versionada)

A pasta hardware/ na raiz do projeto contém o material bruto usado para compor este documento, mas não é versionada (ver .gitignore) — entre outros motivos, porque o firmware de referência ali contém credenciais em texto puro (seção 3) e a pasta inclui fotos em formato HEIC de tamanho considerável. Conteúdo local disponível:

  • Orçamento de Hardware_ Smart Meter EnergIA (1).docx — BOM completo (seção 2).
  • Relatório Técnico_ Validação e Calibração do Edge Computing.docx — ensaios de calibração (seção 4).
  • Documento Final_ Especificação e Arquitetura - Smart Meter IoT (Trifásico).docx — arquitetura trifásica completa (seção 5).
  • Adenda Técnica_ Medição de Fator de Potência e Expansão Trifásica.docx — cálculo de FP e escalonamento trifásico.
  • ESP32_script.txt — firmware de referência v1 (monofásico ativo, trifásico comentado).
  • ESP32_script_v2_buffer.txt — firmware v2 com buffer local, kWh persistente e reconexão não-bloqueante (seção 7).
  • Fotos dos componentes (ESP32.png, modulo_ads1115.png, modulo_tensao.png, sensor_corrente.png, fonte_chaveada.png, caixa_patola.png, jumpers.png, modulo_expansor.png).
  • Fotos da montagem física e da instalação no quadro elétrico real (IMG_39*.HEIC).
  • Captura de tela do dashboard com telemetria real (Captura de tela 2026-06-09.png).

O firmware v3 (alvo) não fica nesta pasta: é versionado em firmware/smart_meter_v3/ na raiz do repositório, com credenciais separadas em secrets.h não versionado (seções 3 e 7).

Ver também EnergIA_vs_Desafio6_Analise.docx (raiz do projeto), seções 5.5 e 6, para o mapeamento desses itens contra os requisitos do Desafio 6 e o plano de sprints para fechar os gaps de persistência local, segurança elétrica e custo em escala (PRD.md, Sprint 21).