Monitor de consumo de energia para 1, 2 ou 3 fases baseado no ESP32 e ESPHome

Monitor de consumo de energia para 1, 2 ou 3 fases baseado no ESP32 e ESPHome

Por Daniel
Seg, 26/12/2022 - Atualizado 1 mês atrás
0 comments

Medição de tensão, corrente, potência aparente, potência real e consumo de energia utilizando um dispositivo não intrusivo montado com base no processador ESP32, no firmware ESPHome e na plataforma OpenEnergyMonitor.

Introdução

Durante meses busquei uma solução para medir o consumo energético de casa, que não fosse baseada em plataformas em nuvem como Tuya ou eWelink. Infelizmente os produtos disponíveis no mercado para medição de mais de uma fase são caríssimos. 

A solução que encontrei foi construir o meu próprio medidor baseado no conhecimento produzido pelo time do Open Energy Monitor e utilizando plataforma ESPHome, que facilita a integração com outros sistemas como Home Assistant e MQTT.

O controlador ESP32 foi escolhido por conta da quantidade de portas analógicas que apresenta.

Diferenciais

  • Medição de corrente em 1, 2 ou 3 fases
  • Medição de tensão em 1, 2 ou 3 fases
  • Não é preciso cortar ou soltar nenhum cabo de força para instalar
  • Firmware baseado no ESPHome
  • Inclui também um firmware genérico para quem não deseja utilizar o ESPHome ou escrever seu próprio código (calibrate-vi.ino)
  • Integração automática com o Home Assistant
  • Integração com MQTT
  • Nenhum serviço em nuvem é necessário
  • 100% código aberto
  • Muito barato para construir, menos de R$150,00 em componentes e materiais.
  • Parâmetros calculados:
    • Potência aparente (VA)
    • Potência real (W)
    • Corrente (A, RMS)
    • Tensão (V, RMS)
    • Consumo diário de energia (kWh)
    • Consumo semanal de energia (kWh)
    • Consumo mensal de energia (kWh)
    • Estatísticas do Wifi

Hardware

Lista de componentes

N = número de fases a serem medidas (1, 2 ou 3)

  • 1 x ESP32 Dev Kit V1
  • 1 x Fonte 5V USB + cabo micro USB
  • N x Módulo ZMPT101B AC 250VAC, 5-30VDC
  • N x Sensor de corrente SCT013 100A-50mA. Outros modelos podem ser usados, ver detalhes abaixo.
  • 2 x N x Resistor 10 kOhm
  • N x  Capacitor eletrolítico 10µF
  • N x Resistor 22 Ohm. Caso utilize outro tipo de sensor de corrente, a especificação do resistor pode mudar ou o mesmo pode até ser eliminado
  • N x Conector estéreo 2.5mm
  • Cabos, conectores e placa de prototipagem para montar tudo

Parts and final assembly Componentes e montagem preliminar

Utilizando um modelo diferente do sensor de corrente

Na família SCT013 existem dois tipos de sensores de corrente:

  • Sensores com saída em corrente variável, tipicamente 50mA
  • Sensores com saída em tensão variável, tipicamente 0-1V

O sensor padrão para este projeto consiste de um detector de até 100A com saída em corrente de 50mA. Se você pretende utilizar um sensor com outro fundo de escala (10A, 15A, 30A, etc...) mas que mantenha a saída em corrente, precisa recalcular o resistor de pré-carga de 22Ω. Existe um tutorial no Open Energy Monitor que mostra como fazer isso.

Agora se você decidir comprar um detector com saída em tensão (1V), independente da escala, vai precisar eliminar o resistor de 22Ω do circuito. Posteriormente, para aumentar a resolução dos sensores de 0-1V, você pode tentar reduzir a atenuação ADC no firmware.

Múltiplas medições de tensão

Em geral, no relógio de luz da concessionária, todas as fases chegam com a mesma tensão e não é necessário ter um medidor para cada uma delas. Entendo que em algumas instalações rurais ou mais distantes, as fases podem chegar com tensões diferentes e por este motivo eu incluí no software o suporte para múltiplos voltímetros.

Entradas analógicas do ESP32

A placa de desenvolvimento ESP32 possui dois barramentos ADC (Conversor Analógico Digital) porém, ao utilizar o Wifi, um dos barramentos fica indisponível para nossos sensores. Desta forma, os sensores só podem ser conectados em um testes GPIOs: 32, 33, 34, 35, 36, 37, 38 and 39.

Diagrama e montagem

O diagrama abaixo ilustra uma montagem típica para um único sensor de corrente e um sensor de tensão. Para instalar múltiplos detectores, basta repetir os circuitos. Lembrar que o resistor de 22Ω depende to tipo de sensor de corrente utilizado e em alguns casos ele pode ser até eliminado.

O medidor de tensão precisa ser ligado ao neutro e uma fase. Se você ligar o medidor entre duas fases ele vai funcionar, porém, o cálculo da potência vai precisar ser ajustado no código do programa.

ESP32 Energy Monitor Schematic

Software

O repositório deste projeto contém 3 programas/firmware para o ESP32:

  1. O programa para ajuste do parafuso do potenciômetro do medidor de tensão. Esse ajuste só é realizado uma única vez.
  2. O programa para calibração dos sensores de corrente e tensão. Este ajuste pode ser feito diretamente do firmware final, baseado no ESPHome, porém o processo demora muito mais por conta da inicialização mais lenta.
  3. O firmware final baseado em ESPHome para o monitor de consumo de energia.

Todos os aplicativos exigem a alteração de algumas configurações no código (explicadas abaixo) antes de serem carregados no ESP32.

NOTA: A biblioteca EmonLib utilizada neste projeto não é a original, ela foi modificada por Savjee para suportar a placa ESP32.

Requisitos

  • ESPHome
  • Arduino IDE 2.0 ou superior
  • Qualquer editor de texto/código para realizar as alterações em outros formatos de arquivo.
  • Cabo Micro USB para conectar o computador à placa de desenvolvimento
  • Multímetro ou voltímetro + amperímetro para calibrar os dispositivos
  • Uma carga resistiva para calibrar os sensores (recomendo maior que 5A): aquecedor de água, boiler, ducha elétrica, aquecedor de ambiente a óleo, etc... Não utilizar como carga dispositivos indutivos ou capacitivos como motores, lâmpadas LED, transformadores, etc...

Adicionar o suporte ao ESP32 no Arduino IDE

Antes de poder compilar o firmware para o ESP32, é necessário configurar o Arduino IDE para que ele encontre as bibliotecas corretas.

Adicionar o seguinte endereço no  Gerenciador de placas adicionais , dentro das preferências do Arduino IDE: https://dl.espressif.com/dl/package_esp32_index.json

Para maiores detalhes existe um tutorial ilustrado nos links do final desta página.

Calibrando o potenciômetro do ZMPT101B

O ZMPT101B possui um potenciômetro (componente azul com um parafuso de latão em cima) que precisa ser ajustado uma única vez. O sketch calibrate-pot.ino deve ser utilizado junto com o Serial plotter do Arduino IDE para esta tarefa:

  1. Montar os circuitos e instalar os sensores.
  2. Ligar o ZMPT101B na fase/neutro da rede. A tensão precisa estar próxima à que você pretende medir quando o equipamento estiver em operação 100-130V ou 200-240V. Não conectar à fontes que geram ondas quadradas ou deformadas como no-breaks ou inversores.
  3. Editor o arquivo calibrate-pot.ino  e ajustar o endereço do GPIO de acordo com sua montagem.
  4. Compilar o código e carregar no ESP32 usando o Arduino IDE.
  5. Abrir o plotter da porta serial e ajustar a velocidade para 115200bps.
  6. Girar o parafuso do potenciômetro no sentido horário ou anti-horário até que o gráfico deixe de possuir um topo abaulado, deve formar uma curva senoidal perfeita. É importante não exceder muito a zona de transição entre plano e curvo para não perder sensibilidade do sensor.

Potentiometer out of calibration Potenciômetro descalibrado (topo plano)

Potentiometer properly calibrated Potenciômetro calibrado (topo e fundo curvados)

Calibrando os sensores de tensão e corrente

O sketch calibrate-vi.ino  deve ser utilizado para calibrar os sensores. Ele atualiza os valores de tensão e corrente a cada par de segundos para cada um dos sensores. O firmware ESPHome também pode ser utilizado para esta tarefa porém a inicialização do mesmo é mais lenta em virtude da conexão com Wifi, etc...

Este código também pode ser utilizado para criar o seu próprio firmware de monitoramento de energia ou integrar a uma outra plataforma. Ele usa as mesmas bibliotecas e funções de cálculo RMS do programa final.

  1. Montar os circuitos. O potenciômetro do sensor de tensão já deve estar calibrado.
  2. Ligar o amperímetro a uma carga resistiva (recomendo maior que 5A): aquecedor de água, boiler, ducha elétrica, aquecedor de ambiente a óleo, etc... Não utilizar dispositivos indutivos ou capacitivos como motores, lâmpadas LED, transformadores, etc... Lembrar que o condutor neutro ou segunda fase não pode passar por dentro do sensor, apenas o cabo da fase a ser medida. Você pode conectar três alicates a uma única fase para calibrar o sistema trifásico sem problemas.
  3. Conectar o voltímetro do ESP32 a uma tomada com neutro.
  4. Conectar o multímetro/amperímetro + voltímetro de referência nas mesmas linhas.
  5. Editar o sketch calibrate-vi.ino e definir os pinos GPIO em que estão instalados os sensores.
  6. No mesmo arquivo, definir os coeficientes de calibração CV1, CV2, CV3, CI1, CI2 e CI3 com o valor 1000.
  7. Compilar e gravar o firmware na placa utilizando o Arduino IDE.
  8. Observar os valores no terminal, aguardar para que estabilizem. Utilizar 115200bps como baud rate.
  9. Tomar nota das correntes medidas (I) e das tensões (V) medidas no ESP32 bem como a tensão Vr e corrente Ir medidas no multímetro de referência.
  10. Calcular os fatores de calibração: CVnovo = Vr x CVantigo/V,  CInovo = Ir x CIantigo/I . CVantigo e CIantigo são as calibrações originais no sketch (inicialmente 1000).
  11. Alterar os valores na seção "Calibration" do calibrate-vi.ino para os novos valores calculados (CInovo and CVnovo)
  12. Compilar e carregar o firmware novamente. Verificar se os valores agora estão corretos.
  13. Repetir os passos 8 a 12 se necessário.

DICA: Posteriormente você pode fazer um ajuste fino da calibração usando a função de filtros do ESPHome. Neste caso, coeficientes também devem ser utilizados na potência real e aparente uma vez que estas são calculadas antes da aplicação dos filtros.

Configurando o firmware ESPHome

Arquivo esp32emon.h

Configurações obrigatórias

  • Polling interval: Frequência com que o dispositivo vai realizar as leituras de corrente e tensão.  O padrão são 30s (30000ms). Se a frequência for muito alta (< 5s), serviços como Wifi ou MQTT podem falhar por congestionamento de dados. 
  • Pin configuration: Configuração dos pinos GPIO em que os sensores estão conectados. Caso utilize um único sensor de tensão, usar o mesmo pino para os três valores.
  • Calibration: Valores de calibração para cada um dos sensores de tensão (CV) e corrente (CI) determinados anteriormente. Caso utilize um único sensor de tensão, usar a mesma calibração para os três sensores.
  • Comentar/remover comentários das seções do código para a quantidade de fases a serem medidas. O padrão são 2 fases.
  • Para o bloco Totals: remover o comentário de apenas um bloco, correspondente ao total de fases que serão medidas.

Configurações avançadas/opcionais

  • Analog attenuation: Alterar os valores para reduzir a filtragem nas portas analógicas da placa. Se você for utilizar os componentes que descrevi neste texto, não é preciso fazer nada neste campo.
  • Sample window length / crossings: Representa o tamanho da amostra de ondas utilizadas para calcular a tensão e a corrente RMS. Quanto maior este valor, mais demorada é a medição porém menos interferências ou erros vão ocorrer. Valores muito altos podem travar o ESP32 ou causar problemas com o Wifi ou MQTT. Minha recomendação é testar valores entre 30, 60, 90, 120 e 180 e ver o que atende melhor.
  • Watchdog timeout: Se o processo de amostragem demorar muito, o ESP32 considera que o programa travou e reinicia automaticamente. Aumente este valor para evitar que o controlador reinicie quando estiver utilizando tempos de amostragem muito longos (> 120 crossings). O padrão são 5 segundos.

Arquivo secrets.yaml

  • Renomear o arquivo EXAMPLE_secrets.yaml to secrets.yaml e adicionar as configurações de senhas, URLs e usuários para os diversos serviços que pretende utilizar.

Arquivo esp32emon.yaml

Configurações obrigatórias

  • Custom sensors -> lambda: Remover os comentários ( //) da linha correspondente à quantidade de fases que serão medidas. Padrão são 2 fases. Não deixar mais de uma linha que começa com a palavra return habilitada.
  • Blocos de código dos sensores das fases 1, 2 e 3: Remover os comentários (#) de todos os blocos correspondentes à quantidade de fases que serão medidas. O padrão são 2 fases, logo, dois blocos já estão habilitados.

Configurações avançadas/opcionais

  • Wifi settings: Habilita ou desabilitar múltiplas redes Wifi. O SSID e a senha devem ser guardados no arquivo secrets.yaml
  • MQTT integration: Remover os comentários para habilitar a integração com o MQTT. Servidores e senhas são guardados no arquivo secrets.yaml
  • Campo restore nos sensores de consumo de energia: Definir true para que os valores de consumo energético sejam gravados na memória permanente do ESP32. Isso evita que os dados sejam perdidos em caso de falta de energia porém acaba por reduzir a vida útil da memória do dispositivo. Se você usa o Home Assistant, não precisa se preocupar em habilitar essa opção porque ele já armazena as leituras no servidor. 
  • Home Assistant integration: Não é preciso alterar este valor, ainda que você não utilize o Home Assistant.

Compilando e gravando o firmware ESPHome no ESP32

Para compilar e carregar o ESPHome, não deve ser utilizado o Arduino IDE. Veja como fazer no site do ESPHome. O comando final é:

esphome run esp32emon.yaml

DICA: Ao instalar o ESPHome, evite o processo de instalação via Docker por conta de algumas dificuldades em acessar ao hardware diretamente. O processo de instalação manual tende a ser mais rápido e livre complicações. 

Integração com o Home Assistant

A integração como o Home Assistant é habilitada por padrão e o dispositivo deve ser descoberto automaticamente se estiver na mesma rede. Caso isso não aconteça, adicione o dispositivo manualmente utilizando o endereço IP do ESP32.

Se o seu Home Assistant está instalado em outra rede ou em outro lugar do mundo é possível utilizar a integração via MQTT. Neste caso você precisa habilitar o MQTT e o MQTT discovery no arquivo sp32emon.yaml. A descoberta do dispositivo vai ocorrer automaticamente após 5 - 30 minutos.

Home Assistant Integration Screenshot Integração automática no Home Assistant com todos os sensores disponíveis.

Integração com MQTT

A integração com MQTT está desabilitada por padrão. Para habilidade, remover o comentário das linhas respectivas no esp32emon.yaml e adicionar os endereços do servidor, usuário e senhas no arquivo secrets.yaml.

Perguntas frequentes

  • Posso usar um medidor de corrente com outras especificações (20A, 30A, etc...)? Sim. Mas o resistor de carga vai mudar. Ver acima os detalhes.

  • Não tenho condutor neutro, posso medir a tensão entre duas fases? Sim mas você vai ter que alterar a fórmula para o cálculo das potências no código fonte.

  • A conexão com Wifi ou MQTT está caindo toda hora. Tente reduzir  valor de CROSSINGS no arquivo esp32emon.h. A biblioteca EmonLib bloqueira o processador por alguns ciclos e as vezes isso afeta a conectividade.

  • O servidor web do ESPHome está travando. O servidor foi desabilitado por padrão porque a natureza da biblioteca EmonLib acaba por bloquear o processador do ESP32 por algumas frações de segundo. Você pode conseguir rodar o servidor, reduzindo o valor de CROSSINGS no arquivo esp32emon.h.

  • Leituras negativas de potência: Verifique as conexões dos sensores de corrente. Inverta a posição de instalação do sensor no cabo de energia.

Download

Literatura e referências (em inglês)