Repositório criado para disponibilização do código e documentação do projeto de Medição de Eletricidade, criado para a matéria de Computação Física e Aplicações, ministrada pelo Professor Doutor Fábio Nakano na Universidade de São Paulo. Neste projeto estará tanto o código, como a motivação e o racional por trás de decisões.
- ESP32 microcontrolador
- Sensor de corrente Allegro ACS712-05
- Resistor 10KΩ e resistor variável
- Placa de prototipagem
- Conectores jumper
- Módulo de relé
- Fios elétricos e/ou conectores (Dependendo de como o medidor será conectado ao circuito que se deseja medir)
A ideia central do projeto é obter as leituras do sensor de corrente e então fornencer uma interface de fácil utilização para que os dados coletados sejam demonstrados em tempo real.
- Pino Vin (5V) e pino GND do ESP32 são conectados aos barramentos de energia da placa de prototipagem.
- Pino VCC e GND do ACS712 são conectados ao barramento positivo e negativo da placa respctivamente.
- Pino VCC e GND do módulo de relé são conectados ao barramento positivo e negativo da placa respctivamente.
- Pino de controle do módulo de relé é conectado ao pino 26 do ESP32.
- Pino OUT do ACS712 é conectado ao pino 34 do ESP32, passando primeiro pelo divisor de tensão, como explicado a seguir.
- O ACS712 e o módulo de relé tem os seus conectores de medição ligados em série um com o outro.
- A carga a ser medida é ligada em série com o medidor, conforme o esquema do circuíto a seguir.
O conversor analógico digital do ESP32 tem a capacidade de lidar com sinais de amplitude de 0V - 3,3V. Enquanto que o sinal de saída do ACS712 possui amplitude de 0V - 5V. Por essa razão, é necessaŕio que o sinal de saída do ACS712 seja fornecido ao ESP32 por meio de um divisor de tensão o qual pode ser construído utilizando-se de resitores.
A fórmula que relaciona a tensão de entrada e tenão de saída no divisor de tensão é a seguinte:
Vout = (R2 / R1 + R2) Vin
Na qual, Vout é a tensão esperada na saída do divisor, Vin é a tensão de entrada, R1 e R2 são os valores da resistividade dos resistores.
No contexto do projeto, é necessário que a tensão de saída seja de 3,3V, no máximo, enquanto que a maior tensão de saída do sensor, é em teoria, 5V. Dessa forma temos:
Vout = 3,3V Vin = 5V R1 = 10KΩ (escolhido ao acaso) R2 = 5151Ω (determinado matematicamente) (resistor variável, para que seja possível calibrar a saída do sensor)
Produzindo assim a redução necessária. Além disso, de acordo com a folha de especificações do sensor, é esperado que haja uma variação de 185mV/A em relação a corrente eletrica a qual será medida. Mas ao passar o sinal pelo divisor de tensão, tal valor torna-se 122mV/A. Ou seja, para cada 1A de variação na corrente medida, havera uma variação de 185mV no sinal de saída do sensor e uma variação de 122mV no sinal lido pelo ESP32 através do divisor de tensão.
É esperado, pela folha de especificações do ACS712, que a tensão de saída para o caso de a corrente medida ser 0A deve ser de 2500mV. Porém, foi determinado empiricamente que o valor medido pelo ESP32, sem utilizar o divisor de tensão era de 2260mV, o que pode ser causado por interferências no fornecimento de energia ao ESP32. Por isso, o valor esperado na saída do divisor de tensão é de 1492mV, e dessa forma o divisor teve sua calibração final fina feita ao mover o resistor variável levemente até que o valor lido pelo ESP32 fosse correspondente ao teoricamente esperado (por volta de 1490mV).
O ESP32 conta com um conversor analógico digital (ADC) com capacidade de medir sinais de amplitude 0-3,3V. A arquitetura do ADC é de 12 bits e por essa razão, pode representar números inteiros entre 0 e 4096. Assim, um sinal recebido em um pino do ESP32 será representado, de acordo com a sua intensida, em uma escala de 0 a 4095. Com sinal de intensidade 0V sendo lido como 0 e sinais de intensidade 3,3V sendo representados como 4095. Os valores intermediários são proporcionalmente representados na escala dessa forma. Por isso, para se obter o valor da intensidade do sinal recebido do sensor em volts é necessário multiplicar os valores brutos lidos pelo ESP32 por 0,805.
Foi definido que o ESP32 ficá responsável por executar um programa Python capaz de realizar as medições do sensor de corrente. Para isso, foi necessário instalar o MicroPython no ESP32. Para o desenvolvimento do programa, foi escolhida a IDE Thonny, por sua simplicidade e facilidade de interface com o ESP32 (É necessário instalar na IDE o plug-in do ESP32 o que pode ser feito através da ferramente interna da IDE). Para isso, foi consultado o seguinte guia: https://www.youtube.com/watch?v=rP4E5IyB_E0
No ESP32 foi armazenado o código fonte do projeto MicroWevSrv, disponível em: https://github.com/jczic/MicroWebSrv.git Esse servidor é capaz de realizar as funções necessárias para o projeto:
- Prover arquivos HTML, CSS e Javascript
- Enviar e receber requisições HTTP, transferindo dados JSON
O ESP32 é conectado a uma rede Wi-Fi e ao iniciar o programa, o ESP32 fica preparado para receber requisições de dados no endereço: http://ip_do_ESP32_na_rede/valor
Qualquer outro dispositivo na mesma rede pode realizar requisições a esse endereço e obter um dado de medição instantânea do sensor.
A página web (medidor.html) ao ser acessada pelo usuário em outro dispositivo no endereço: http://ip_do_ESP32_na_rede/medidor.html, inicialmente não realiza requisições. Ao acionar o botão on/off na página, a mesma inicia o envio de requisições HTTP para o endereço supramencionado do ESP32 e ao receber os dados da medição instantânea do sensor, os adiciona ao gráfico de linha central na página.
Além disso, a página permite que um limite de corrente seja definido pelo usuário. Ao detectar que o limite foi excedido, a página web envia uma requisição para http://ip_do_ESP32_na_rede/estado, solicitando que a medição seja enterrompida. O ESP32 então desliga o circuíto com o relé.
O relé tembém pode ser acionado pelo mesmo esquema de comunicação quando o usuário interage com o botão On/Off no topo da página.
Contém a página web com os principais elementos: botão on/off, que quando ligado realiza a medição de corrente através do sensore. Gráfico com a medição de corrente produzido através da biblioteca AnyChart (ver mais em: https://www.anychart.com/). Link para o github do projeto (https://github.com/rodrigo-birocchi/ESP32-medidor-eletricidade).
Arquivo responsável pela inclusão do gráfico e sua atualização na interface. Realiza chamadas periódicas ao ESP32 com o método window.setInterval(). É possível configurar a frequência de medição em milissegundos por essa função.
Escrito em python contém de fato a medição e gestão do sensor.
leitura(): realiza a leitura analógica, conforme o datasheet do sensor.
auto_zero(): encontra o zero do sensor, isto é, valor medido com ausência de corrente. Essa função deve encontrar um valor próximo do valor esperado empiricamente (1492 ~ 1650) para que o sensor esteja funcionando corretamente. Caso o valor encontrado seja muito alto ou muito baixo, é provavel que haja algo de errado com a montegem do circuito. Além disso, caso o valor encontrado não seja correto a medição mostrada não ficará próxima de 0.0A mesmo sem carga alguma no circuito.
valor(): retorna corrente em ampéres, conforme especificações acima. Obtém a diferença entre a medição atual e o zero do sensor, ou seja, o quanto a medida do sensor se afastou do zero por conta da corrente que está sendo medida. Então o valor é dividido pela variação indicada pela folha de especificações do ACS712 (185mV/A ou 122mV/A com o divisor de corrente), pois para cada 1A de variação na corrente, há um aumento de 185mV na saída do sensor.
Também escrito em python, responsável pela interação com o relay.
Utilizando o pino 26 do ESP32, manda comandos para ligar e desligar.
on(): Liga o relé
off(): Desliga o relé
Nesse arquivo devem ser preenchidas as credenciais da rede Wi-Fi desejada.