- Materiais necessários para o medidor de potência ESP32
- Medidor de eficiência baseado em Arduino e ESP32 - Diagrama de circuito
- Projeto PCB para Arduino e medidor de eficiência baseado em ESP32
- Medidor de eficiência baseado em Arduino e ESP32 - Código
- Testando o Medidor de Eficiência Baseado em Arduino e ESP32
- Outras melhorias
Todos nós conhecemos um voltímetro, amperímetro e wattímetros básicos, as três coisas básicas de que você precisa para medir valores em qualquer projeto ou circuito eletrônico. Medir a tensão e a corrente com a ajuda de um multímetro pode ser uma boa maneira de começar, mas um dos maiores problemas que enfrento ao testar um circuito é medir a eficiência de energia. Então, hoje vamos resolver esse problema construindo um medidor de eficiência baseado em Arduino e ESP32 que pode medir a tensão de entrada, a corrente de entrada, a tensão de saída e a corrente de saída. Portanto, ele pode medir a potência de entrada e a potência de saída ao mesmo tempo e, com esses valores, podemos medir a eficiência facilmente. Anteriormente, também fizemos algo muito semelhante em nosso projeto Wattímetro baseado em Arduino, mas aqui mediremos a potência de entrada e a potência de saída para calcular a eficiência energética.
Em vez de comprar quatro medidores para o trabalho, poderemos resolver esse problema incorporando os recursos de todos os quatro medidores em um. Construir seu medidor digital não apenas reduz os custos, mas também oferece espaço para atualizações e melhorias. Como estamos usando um ESP32 para construir este projeto, podemos facilmente habilitar esse medidor para IoT e registrar dados pela web, que é o tópico do projeto futuro. Com todos os fundamentos esclarecidos, vamos direto ao assunto.
Nota: Este medidor de energia é projetado para circuitos CC. Se você está procurando medir a corrente CA para calcular a eficiência de energia CA, você pode verificar os projetos de medidor de energia elétrica e medidor de energia pré-pago com base em IoT.
Materiais necessários para o medidor de potência ESP32
A imagem abaixo mostra os materiais usados para construir o circuito. Como isso é feito com componentes muito genéricos, você deve conseguir encontrar todo o material listado em sua loja local de hobbies.
Também listei os componentes abaixo, juntamente com a quantidade necessária. Se você estiver construindo o circuito sozinho, é altamente recomendável obter todos os materiais da lista abaixo.
- Placa ESP32 - 1
- 128X64 OLED - 1
- ACS712-20 IC - 2
- Jack Barril DC - 1
- Capacitor 100uF - 2
- 104pF - 2
- 102pF - 2
- 10K, 1% - 4
- 68K, 1% - 2
- 6,8K, 1% - 2
Medidor de eficiência baseado em Arduino e ESP32 - Diagrama de circuito
O esquema para o medidor de eficiência baseado em Arduino e ESP32 é mostrado abaixo. A criação deste circuito é muito simples e usa componentes genéricos.
O funcionamento do circuito é muito simples. Estaremos medindo a tensão e a corrente neste projeto, mas de uma forma única. Estamos medindo tensão e corrente tanto para a entrada quanto para a saída, portanto, podemos ver a eficiência do circuito. Isso é muito útil para alguns projetos. Um exemplo poderia ser um conversor DC para DC onde a medição da eficiência se torna obrigatória. A forma como esse circuito funciona é descrita a seguir.
O CI do sensor de corrente ACS712:
Como você pode ver na imagem acima, estamos usando um CI Sensor de Corrente ACS712 para medir a corrente. Este é um IC muito interessante, pois usa o efeito Hall para medir a corrente, existem três variantes deste IC que podem ser encontradas no mercado f (ou 5A, 20A e 30A). Estamos usando a variante 20A disso e é rotulada como ACS712-20.
A folha de dados do ACS712 recomenda uma faixa de tensão de 4,5 - 5,5 para operar sem problemas. E como vamos medir a corrente com um ESP32, é apenas 3,3 V tolerante, é por isso que usei um divisor de tensão com dois resistores de 10K para diminuir a tensão de saída do IC ACS712. Quando nenhuma corrente está fluindo pelo IC, ele produz 2,5 V, e quando alguma quantidade de corrente flui pelo IC, ela diminui a tensão ou aumenta a tensão, dependendo da direção do fluxo da corrente. Usamos dois desses ICs para medir a corrente de entrada e saída. Confira nossos projetos anteriores (abaixo) nos quais usamos este Sensor ACS712.
- Medidor de energia elétrica baseado em IoT usando Arduino e módulo Wi-Fi ESP8266
- Circuito Amperímetro Digital usando Microcontrolador PIC e ACS712
Onde discutimos o funcionamento desses sensores em detalhes. Você pode verificá-los se quiser saber mais sobre esses sensores.
O divisor de tensão:
Para medir a tensão de entrada e saída, temos dois divisores de tensão no lado de entrada e saída do circuito. A tensão máxima que o circuito pode medir é 35 V, mas pode ser facilmente alterada alterando os valores do resistor para o divisor de tensão.
O regulador de tensão:
Um regulador de tensão LM7805 genérico é usado para alimentar os ICs ESP32, OLED e ACS712. Como o estamos ligando com uma energia razoavelmente limpa, nenhum capacitor de desacoplamento é usado, mas usamos capacitores de 100uF na entrada e na saída para estabilizar o IC.
O ESP32 IC e o display OLED:
Usamos um ESP32 como processador principal, que é responsável por todas as leituras, cálculos, entradas e saídas. Além disso, usamos um display OLED de 128X64 para saber os valores.
Projeto PCB para Arduino e medidor de eficiência baseado em ESP32
A placa de circuito impresso para nosso medidor de eficiência baseado em Arduino e ESP32 é projetada em uma placa de um lado. Usei o Eagle para projetar meu PCB, mas você pode usar qualquer software de design de sua escolha. A imagem 2D do design da minha placa é mostrada abaixo.
Rastreamento de aterramento suficiente é usado para fazer conexões de aterramento adequadas entre todos os componentes. Além disso, garantimos o uso de rastreamentos adequados de 5 V e 3,3 V para reduzir o ruído e melhorar a eficiência.
- Baixar PCB Design e arquivos GERBER Arduino e medidor de eficiência baseado em ESP32
PCB feito à mão:
Por conveniência e teste, fiz minha versão artesanal do PCB e é mostrado abaixo. Na primeira versão, cometi alguns erros, que retifiquei usando alguns cabos jumper. Mas na versão final, eu consertei isso, você pode apenas baixar os arquivos e usá-los.
Medidor de eficiência baseado em Arduino e ESP32 - Código
Agora que temos um bom entendimento do lado do hardware, podemos abrir o IDE do Arduino e começar nossa codificação. O objetivo do código é ler a tensão analógica dos pinos 35 e 33 da placa ESP32. Além disso, lemos a tensão de 32 e 34 pinos, que é o valor atual. Depois de fazer isso, podemos multiplicá-los para obter a potência de entrada e a potência de saída e, aplicando a fórmula de eficiência, podemos obter a eficiência.
Finalmente, nós o exibimos na tela LCD. O programa completo para fazer o mesmo é fornecido no final, e pode ser usado como tal para o hardware discutido acima. Além disso, o código é dividido em pequenos fragmentos e explicado.
Como estamos usando um display OLED de 128X64, precisamos da biblioteca Adafruit_GFX e da biblioteca Adafruit_SSD1306 para nos comunicarmos com o display. Você pode baixar os dois do terminal gerenciador de placa padrão do Arduino; se você estiver tendo problemas com a parte do gerenciador de placa, também pode baixar e incluir as bibliotecas de seu repositório GitHub associado, que é fornecido abaixo.
- Baixe a biblioteca Adafruit_GFX
- Baixe a biblioteca Adafruit_SSD1306
Como sempre, começamos nosso código incluindo todas as bibliotecas necessárias. Em seguida, definimos todos os pinos e variáveis necessários, todos mostrados abaixo.
#incluir
Os SCREEN_WIDTH & SCREEN_HEIGHT definições são usadas para definir o tamanho da tela. A seguir definimos todos os pinos necessários, através dos quais vamos medir a tensão e a corrente. A seguir, definimos os valores do resistor que são usados no hardware, como você pode ver no esquema. Se você não tem esses valores ou se deseja alterar a faixa do medidor, pode alterar esses valores, o código funcionará perfeitamente.
Como estamos usando um ACS712 para medir a corrente, precisamos do valor mVperAmp para calcular a corrente da tensão. Como estou usando um módulo ACS712 20A, o valor mV / A é 100, conforme fornecido na folha de dados. Mas, como estamos usando um ESP32 e um divisor de tensão, teremos metade do valor, que é 50, e é por isso que inserimos o valor mV / AMP.
O ACSoffset é o deslocamento necessário para calcular a corrente da tensão. Como os ICs do ACS712 são alimentados por 5V, a tensão de deslocamento é 2,5V. Mas como estamos usando um divisor de tensão, ele desce para 1,25V. Você já deve conhecer o ADC de baixa qualidade do ESP32, então tive que usar um valor de 1136. Se você estiver tendo problemas de calibração, pode ajustar os valores e compensar o ADC.
Finalmente, terminamos esta seção criando um objeto de exibição da classe Adafruit_SSD1306 e passando a largura da tela, altura, configuração I 2 C e o último parâmetro -1 é usado para definir a funcionalidade de redefinição. Se sua tela não tiver um pino de reinicialização externo (o que certamente é para a minha tela), você deve usar -1 para o último argumento.
configuração vazia () {Serial.begin (115200); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Endereço 0x3D para 128x64 Serial.println (F ("SSD1306 alocação falhou")); para (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); atraso (100); }
A seguir, temos nossa seção setup () . Nesta seção, habilitamos serial para depuração, verificamos se uma exibição I 2 C está disponível ou não com a ajuda do método de início do objeto de exibição. Além disso, definimos o endereço I 2 C. A seguir, limpamos a tela com o método clearDisplay () . Além disso, giramos a tela com o método setRotation , porque baguncei meu design de PCB. A seguir, colocamos um atraso de 100 ms para que as funções tenham efeito. Feito isso, podemos passar para a função de loop. Mas antes de prosseguir para a função loop, precisamos discutir duas outras funções que são return_voltage_value () , e return_current_value () .
valor_voltagem_do_voltagem (int pin_no) {tmp duplo = 0; tensão ADC dupla = 0; tensão de entrada dupla = 0; média dupla = 0; para (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } média = tmp / 150; ADCVoltage = ((média * 3,3) / (4095)) + 0,138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // fórmula para calcular a tensão em ie GND return inputVoltage; }
A função return_voltage_value () é usada para medir a tensão que chega ao ADC e leva o pin_no como argumento. Nesta função, começamos declarando algumas variáveis, que são tmp, ADCVoltage, inputVoltage e avg. A variável tmp é usada para armazenar o valor ADC temporário que obtemos da função analogRead (), então fazemos a média 150 vezes em um loop for e armazenamos o valor em uma variável chamada avg. Em seguida, calculamos ADCVoltage a partir da fórmula fornecida e, por fim, calculamos a tensão de entrada e retornamos os valores. O valor de +0,138 que você vê é o valor de calibração que usei para calibrar o nível de tensão, brinque com esse valor se estiver obtendo algum erro.
double return_current_value (int pin_no) {double tmp = 0; média dupla = 0; tensão ADC dupla = 0; Amps duplos = 0; para (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } média = tmp / 150; ADCVoltage = ((média / 4095.0) * 3300); // Obtém mV Amps = ((ADCVoltage - ACSoffset) / mVperAmp); return Amps; }
Em seguida, temos a função return_current_value () . Esta função também leva pin_no como argumento. Nesta função também temos quatro variáveis viz. tmp, avg, ADCVoltage e Amps
Em seguida, lemos o pino com a função analogRead () e calculamos a média 150 vezes, em seguida usamos a fórmula para calcular a tensão ADC, com isso calculamos a corrente e retornamos o valor. Com isso, podemos passar para a seção de loop.
void loop () {float input_voltage = abs (return_voltage_value (INPUT_VOLTAGE_SENSE_PIN)); float input_current = abs (return_current_value (INPUT_CURRENT_SENSE_PIN)); float output_voltage = abs (return_voltage_value (OUTPUT_VOLTAGE_SENSE_PIN)); float output_current = abs ((return_current_value (OUTPUT_CURRENT_SENSE_PIN))); input_current = input_current - 0,025; Serial.print ("Tensão de entrada:"); Serial.print (input_voltage); Serial.print ("- Corrente de entrada:"); Serial.print (input_current); Serial.print ("- Tensão de saída:"); Serial.print (output_voltage); Serial.print ("- Corrente de saída:"); Serial.println (output_current); atraso (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (input_voltage); display.setCursor (70, 0); exibição.imprimir ("V"); }
Começamos a seção de loop declarando e definindo algumas variáveis float, em todas as quatro variáveis. Chamamos as respectivas funções, passando pin_no como argumento, pois o módulo ACS712 pode retornar valores atuais negativos. Usamos a função abs () da biblioteca matemática para tornar o valor negativo positivo. Em seguida, imprimimos em série todos os valores para depuração. Em seguida, limpamos a tela, definimos o cursor e imprimimos os valores. Fazemos isso para todos os personagens mostrados no display. O que marca o fim da função de loop e do programa.
Testando o Medidor de Eficiência Baseado em Arduino e ESP32
Como você pode ver minha configuração de teste na imagem acima. Eu tenho meu transformador de 30 V como entrada e tenho meu medidor conectado para a placa de teste. Estou usando uma placa conversora buck baseada em LM2596 e para a carga e estou usando três resistores de 10 Ohms em paralelo.
Como você pode ver na imagem acima, conectei vários medidores para verificar a tensão de entrada e saída. O transformador produz quase 32V e a saída do conversor Buck é de 3,95V.
A imagem aqui mostra a corrente de saída medida pelo meu medidor de eficiência e pelo multímetro. Como você pode ver, o multímetro mostra 0,97 Amps, e se você aumentar um pouco o zoom, ele mostra 1,0A, está um pouco desligado devido à não linearidade presente no módulo ACS712, mas isso serve para o nosso propósito. Para uma explicação detalhada e testes, você pode verificar o vídeo em nossa seção de vídeos.
Outras melhorias
Para esta demonstração, o circuito é feito em um PCB feito à mão, mas o circuito pode ser facilmente construído em um PCB de boa qualidade. Em meu experimento, o tamanho do PCB é realmente grande devido ao tamanho do componente, mas em um ambiente de produção, ele pode ser reduzido usando componentes SMD baratos. O circuito também não tem nenhum recurso de proteção embutido, portanto, incluir um circuito de proteção melhorará o aspecto geral de segurança do circuito. Além disso, ao escrever o código, percebi que o ADC do ESP32 não é tão bom. Incluir um ADC externo como o módulo ADS1115 aumentará a estabilidade geral e a precisão.
Espero que tenha gostado deste artigo e aprendido algo novo com ele. Se você tiver alguma dúvida, pode perguntar nos comentários abaixo ou pode usar nossos fóruns para uma discussão detalhada.