Em medidor de energia IoT será apresentado o projeto de um medidor de energia elétrica. A aplicação emprega: o kit de desenvolvimento ESP32 DevKitC v1, o sistema operacional de tempo real FreeRTOS, o módulo dedicado PZEM004T-100A da empresa Peacefair responsável por coletar os dados de tensão, corrente, potência e energia consumida, os quais serão exportados para a plataforma IoT TagoIO.
Para um bom aproveitamento do conteúdo deste artigo, o leitor deverá ter conhecimentos ou experiência em:
- Instalação do Arduino IDE;
- Instalação do framework ESP-IDF no Arduino IDE;
- Experiência com sistemas operacionais de tempo, como o FreeRTOS (criação de tasks, queues e mutexes).
- Experiência com o kit de desenvolvimento ESP32 DevKitC v1;
- Experiência com TagoIO (criação de devices, dashboard, configurações e manuseio de chaves).
A seguir, os tópicos deste artigo:
Para o melhor aproveitamento deste conteúdo e também para agilizar o acesso, aqui estão alguns artigos relacionados para auxiliar o desenvolvimento:
Artigos relacionados
1. Hardware
O projeto do medidor de energia IoT é constituído por alguns módulos os quais cumprem objetivos específicos. Deste modo, a seguir estão listados esses módulos:
- Kit de desenvolvimento ESP32 DevKitC v1;
- Módulo PZEM004T-100A com interface TTL e transformador de corrente externo;
- Relê de estado sólido OMRON de 2A;
- Cabo USB tipo micro;
- Extensão para alimentação AC.

Para o módulo PZEM004T, as linhas de alimentação AC L (fase) e N (neutro) da figura 1 são conectadas diretamente a rede elétrica de alimentação por meio de um cabo e plug AC individuais. Já as linhas L e N da carga, esta última linha interrompida pelo relê de estado sólido, fornecem alimentação para a carga através da extensão AC listada acima, assim ambos recebendo alimentação da rede elétrica de forma paralela.

2. IDE
O desenvolvimento do código da aplicação será feita no Arduino IDE, deste modo, será necessário instalar a última versão. Para auxiliar o desenvolvedor, a seguir, o link para realizar o download da ferramenta:
https://www.arduino.cc/en/software
Neste link, o usuário poderá escolher o pack de instalação conveniente ao sistema operacional pessoal.
Além da instalação da IDE, é necessário instalação o framework da Espressif, ou seja, o ESP-IDF no Arduino IDE. Para auxiliar o desenvolvedor nessa tarefa, a seguir, um tutorial de como realizar o procedimento de instalação desse framework, assim, possibilitando o uso das bibliotecas e exemplos do ESP32, veja:
Este tutorial é do site EletroShields e explica de maneira sucinta o procedimento.
3. Plataforma IoT
A plataforma de IoT escolhida para receber os dados de telemetria do medidor de energia IoT e fazer parte desta solução é a TagoIO, pois além de proporcionar a utilização de seus recursos para contas gratuitas, oferece diversos recursos interessantes e indispensáveis para um projeto de IoT, assim sendo, uma das melhores opção do mercado.
Para faz-se o uso dessa ferramenta, deve-se acessar o site da TagoIO e realizar o cadastro aqui.
Feito isto, faça o login na plataforma e encontre a figura de interrogação para ter as primeiras orientações de utilização. Vide a figura 2.

Depois de compreendido como a ferramenta funciona e ter interagido com ela, o desenvolvedor deve construir um dashboard parecido com a figura 3, a qual é o dashboard do medidor de energia IoT, veja:

Alguns detalhes importantes devem ser levados em conta: percebe-se alguns nomes abaixo dos valores de cada widget no dashboard: fVoltage, fCurrent, fEnergy, Percent, bRelay e fPower, pois eles possuem relação direta com o código da aplicação. Mais detalhes serão vistos a seguir.
A seguir, o que o dashboard possui:
- Gauge – VOLTAGE é tensão lida da rede elétrica e a mesma que alimenta a carga;
- Gauge – CURRENT: é a corrente consumida pela carga;
- Gauge – ENERGY SPENT: é a energia consumida pela carga;
- Gauge – PERCENTUAL OF LOAD: é o percentual em relação aos 2A (relê de estado sólido);
- Gauge – STATE OF RELAY: é o estado do relê (ligado ou desligado);
- Gauge – POWER CONSUMED: é a potência consumida em Watts.
4. Código
A seguir, temos o código do programa do medidor de energia IoT, escrito em linguagem C para a Arduino IDE como mencionado anteriormente, veja:

Acima, vemos os includes utilizados nesta aplicação. Destaque para a biblioteca PZEM004T.h a qual é feita por terceiros e não faz parte do Arduino IDE e também do framework ESP-IDF. Esta biblioteca pode ser adquirida no seguinte endereço:

Nesta parte são inseridas as definições utilizadas, bem como, os protótipos de funções da aplicação.

Aqui, a declaração do objeto client o qual possui os métodos de conexão através de um socket TCP/IP com o servidor da TagoIO sob o protocolo HTTP. Em seguida, há também a declaração do objeto wifiMulti que estabelece conexão com a rede local Wi-Fi para acesso à internet. Também estão declarados os recursos de mutex e queue do FreeRTOS.
A string apiKey é o token fornecido pelo TagoIO a partir do momento em que o desenvolvedor cria o device, este está relacionado ao medidor de energia IoT e, para consultar o token do device criado, basta seguir o seguinte caminho:
- home/devices/nome_do_device/general information/token & serial number.
Clique na figura do olho, copie e cole no lugar da string: “insert your TagoIO device token here”.
A string server é o endereço da TagoIO para realizar os posts da aplicação no respectivo dashboard e, por fim, os protótipos de funções relacionados ao módulo analisador de energia PZEM004T.

Percebe-se nesta parte do código a criação de duas estruturas de dados: stSysStatus e stPzem as quais estão relacionadas:
stSysStatus: revisão do chip ESP32, frequência de funcionamento da CPU, espaço livre da memória heap e o MAC address.
stPzem: estado do relê, percentual de carga, tensão, corrente da carga, energia consumida pela carga e potência consumida pela carga.

Inicialização da variável de estrutura do PZEM004T e a função vPrintStr() que imprime strings, passadas por argumento na porta serial de console do Arduino IDE, equipada com recurso de mutex para evitar possível concorrência entre as tasks.

Função vPrintStrNum() imprime strings e valores inteiros na serial de console. A vPrintStrFloat() imprime strings e valores de ponto flutuante.

Em vPrintHex() imprime apenas valores hexadecimais.



A HTTP task é responsável por estabelecer conexão com a TagoIO por meio de um socket TCP/IP sob o protocolo HTTP, esta task depende de duas informações para iniciar a comunicação com a plataforma IoT: se o ESP32 está conectado com a rede local através do objeto wifiMulti e as informações de leitura do módulo de energia passados através da queue xPzemQueue.
Deste modo, se há conexão com a internet e já há valores lidos pelo PZEM004T e carregados na xPzemQueue, a vHttpTask já pode iniciar a conexão por meio do objeto client.connect, uma vez conectado com a TagoIO, o LED azul da ESP32 é aceso, é impresso no console a string de conexão com a TagoIO, os valores recebido pela xPzemQueue são formatados em JSON e enviados para a plataforma.
Por fim, percebe-se a finalização da conexão TCP/IP por meio do client.stop.
Ainda nesta em vHttpTask há o mecanismo de tentar conexão com a rede local se esta for perdida por meio do último else e pelo objeto wifiMulti.addAP(). Além disso, percebe-se o intervalo de execução dessa task em 15 segundos, isto quer dizer que as informação serão enviadas para a TagoIO neste tempo.




Em vPzemTask, inicialmente, há a tentativa de estabelecer comunicação com o módulo PZEM004T através da UART2 e, uma vez adquirida essa conexão, o relê de estado sólido é acionado e o programa segue para o loop principal desta task.
No loop, basicamente, são executados duas tarefas: a leitura dos valores do PZM004T, ou seja, tensão, corrente, energia e potência, e a verificação da conexão deste módulo. Uma vez conseguido os valores, estes serão carregado na xPzemQueue, os valores também serão impressão no console serial e o processo se repete a cada 100ms.



Em prvSetupHardware() são configurados: o baudrate da serial de console em 115200 bps, os GPIOs do LED azul da ESP32 e também o que acionará o relê de estado sólido. É estabelecida a conexão com a rede local por meio do objeto wifiMulti.addAP() e também possui código de timeout de conexão em 15 segundos. Depois, são lidos as informações relacionadas ao hardware do ESP32, ou seja: revisão do chip, frequência de clock da CPU, memória livre de heap e o MAC address, estas informação são exibidas no console e carregadas na variável stSysStatus.
Por fim, em setup(), são criadas as duas tasks já mencionadas: vPzemTask e a vHttpTask.

O projeto do medidor de energia IoT pode ser consultado ou baixado através do Github no seguinte endereço:
https://github.com/EderAndrade/Medidor-de-Energia-IoT
Lembrando que este é um projeto aberto e o desenvolvedor por alterá-lo e utilizá-lo para suas própria necessidades, lembre-se apenas de nós como fonte de referências 😉