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 pelaMQTTClient(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:
- 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
tsoriginal — o backend usatscomomeasured_ate deduplica por janela de ±3s, então o histórico se preenche retroativamente. - kWh persistente (NVS): o acumulado sobrevive a reboot/queda de energia; gravação a cada 0.05 kWh para limitar desgaste da flash.
- 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 emsecrets.hnã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).