Medida de Potência.-V2
Medida de Potência.-V2
Medida de Potência.-V2
+
Links onde
comprei os
componentes
https://bit.ly/2VM1ZdQ
Em www.fernandok.com
4
SEJA MEMBRO
5
SEJA MEMBRO
6
forum.fernandok.com
Instagram
fernandok_oficial
Telegram
fernandok_oficial
8
Materias utilizados
• Módulo ESP32 WROOM 32
• Resistores de 10k 1% e 82k
• Capacitores de 0,22nF, 4n7 e 47nF
• Capacitor de 1000uF / 25V
• Led
• Sensor de tensão AC ZMPT101B
• Sensor de corrente ACS758LCB-050B
• Multímetro
• Osciloscópio
• Plugue NBR14136
• Tomada NBR14136
• Pcb universal
• Variac
• 5 Cargas resistivas de 150W
• Aplicativo datalogger SerialFK
Circuito
Circuito – Rede AC e sensores
Abaixo vemos a interligação dos sensores à rede AC a ser monitorada:
Vcc (5V)
Sinal
Rede AC GND da alimentação e
127V do sinal
Circuito – Rede AC e sensores
Detalhes sobre o sensor de corrente baseado no ACS758LCB-050B:
• Mas também pode ser obtido passando por um amp-op seguidor de tensão,
formado por U2.
A figura ao lado mostra uma parte dos dados capturados e o valor médio obtido
para o código de offset do sensor de tensão.
Esse valor será importante para a conversão dos valores em valores de tensão e
será utilizada como uma constante no código-fonte de captura.
Da mesma forma, vamos utilizar futuramente este valor nos cálculos de conversão
dos códigos do ADC em valores de tensão.
Aplicamos neste exemplo uma tensão senoidal de 137Vrms. Essa produzirá picos de +193,7V e -193,7V.
Capturando os códigos gerados e comparando os valores máximos e mínimos obtidos (descartando os picos causados por ruídos eventuais), podemos
obter uma relação direta entre o código do ADC e os valores instantâneos, como mostrado na figura abaixo:
Capturando os códigos gerados e comparando os valores máximos e mínimos obtidos (descartando os picos causados por ruídos eventuais), podemos
obter uma relação direta entre o código do ADC e os valores instantâneos, como mostrado na figura abaixo:
Mesmo assim, todos as medidas obtidas com estes sensores posteriormente, foram verificadas diversas vezes e por processos diferentes após a
calibração, descartando os possíveis desvios para além das limitações dos próprios sensores.
Em aplicações mais exigentes, mesmo conhecendo os sensores, utilize uma metodologia estatística mais robusta para garantir a determinação correta
dos parâmetros de conversão.
Calibração – Sensor de tensão – valores RMS
Para calibração dos valores RMS de tensão, utilizamos um variac para criar diversas tensões AC na entrada do sensor de tensão.
Já os códigos usados na regressão, são o resultado do algoritmo de cálculo da raíz quadrada média (root mean square ou RMS) dos códigos obtidos em
um certo número de períodos da onda AC, capturados.
Utilizando os pares tensão e código do ADC obtidos, podemos então encontrar uma reta de conversão, como mostrado abaixo.
Já os códigos usados na regressão, são o resultado do algoritmo de cálculo da raiz quadrada média (root mean square ou RMS) dos códigos obtidos em
um certo número de períodos da onda AC, capturados, assim como foi feito com os códigos para cálculo da tensão RMS.
Utilizando os pares corrente e código do ADC obtidos, podemos então encontrar uma reta de conversão, como mostrado abaixo.
1. Primeiro, vamos acumular o valor do quadrado de cada medida, bastando para isso, multiplicar cada medida realizada por ela
mesma e, em seguida, adicioná-la a uma variável acumuladora.
2. Depois de todas as medidas serem realizadas, dividimos o resultado do acumulador pelo número de medidas.
3. Aplicamos então a raiz quadrada neste último valor. O resultado é então o valor RMS da coleção de medidas
Códigos-Fonte: Declarações e setup()
/* Seleção do MODO de operação:
0 - Transmite os valores brutos dos ADCs
1 - Transmite os valores instantâneos de tensão e corrente, em volts e ampères
2 - Transmite os valores RMS de tensão e corrente, em volts e ampères
*/
#define MODO 0
void setup()
{
Serial.begin(1000000); //Iniciando a comunicação serial
}
Códigos-Fonte: loop no MODO 0
void loop()
{
#if MODO == 0
//Envio direto dos códigos do ADC sem nenhum tratamento
//Variáveis
int32_t tensao = 0;
int32_t corrente = 0;
//Captura
tensao = analogRead(pinAdcTensao);
corrente = analogRead(pinAdcCorrente);
//Transmissão
//Serial.print(micros());
//Serial.print(separador);
Serial.print(tensao);
Serial.print(separador);
Serial.print(corrente);
Serial.println();
#endif
Códigos-Fonte: loop no MODO 1
#if MODO == 1
//Envio dos códigos convertidos em tensão e corrente instantâneos
//Variáveis
int32_t tensao = 0;
int32_t corrente = 0;
//Captura
tensao = analogRead(pinAdcTensao);
corrente = analogRead(pinAdcCorrente);
//Transmissão
//Serial.print(micros());
//Serial.print(separador);
Serial.print((float(tensao) - offsetVAC)*coefA_VAC + coefB_VAC);
Serial.print(separador);
Serial.print((float(corrente) - offsetIAC)*coefA_IAC + coefB_IAC);
Serial.println();
#endif
Códigos-Fonte: loop no MODO 2
#if MODO == 2
//Envio dos códigos convertidos da tensão e corrente RMS
//Período mínimo de captura de 16,7ms para garantir que ao menos um ciclo seja capturado
const int32_t duracaoDaAmostragem = (int32_t)((1000.0 / 60.0) * 6.0); //6 ciclos de 1000ms/60 (60Hz)
//Variáveis
int32_t tensao = 0;
int32_t corrente = 0;
uint32_t qtdDeAmostras = 0;
float acumuladorTensao = 0.0;
float acumuladorCorrente = 0.0;
//Captura
unsigned long inicio = millis();
do
{
tensao = analogRead(pinAdcTensao) - offsetVAC;
corrente = analogRead(pinAdcCorrente) - offsetIAC;
qtdDeAmostras++;
} while ((millis() - inicio) < duracaoDaAmostragem);
Códigos-Fonte: loop no MODO 2
//Cálculo dos valores RMS
acumuladorTensao = acumuladorTensao / float(qtdDeAmostras); //Média dos quadrados
acumuladorCorrente = acumuladorCorrente / float(qtdDeAmostras); //Média dos quadrados
//Transmissão
//Serial.print(micros());
//Serial.print(separador);
Serial.print(acumuladorTensao);
Serial.print(separador);
Serial.print(acumuladorCorrente);
Serial.println();
#endif
}
Serial FK
Serial FK – Enviando a Tensão e Corrente AC RMS
Vamos utilizar agora o dispositivo para enviar as medidas de tensão e corrente AC RMS para o software Serial FK, onde podemos
acompanhar seu comportamento através de indicadores, gravar logs e observar graficamente as variações.
Para isso, vamos introduzir mais um modo de operação do programa, o MODO 3. Nele, vamos apenas alterar as informações enviadas
para o formato de recepção do Serial FK, incluindo o nome das variáveis e enviando também o instante da captura para registro no log,
se necessário.
Serial FK
Fonte AC
Medidor de tensão
e corrente AC
V
AC
A AC
Serial FK – Enviando a Tensão e Corrente AC RMS
Foto do barramento AC com as cargas e os multímetros de controle de tensão e corrente. Ao lado o medidor montado.
Serial FK – Enviando a Tensão e Corrente AC RMS
Abaixo mais detalhes do software Serial FK.
Widgets
Tensão
Corrente
Complemento – Conexão do Display
Abaixo, a tabela de conexão entre o ESP32 e o Display.
Display ESP32
Vcc (verde para LED) 3V3
GND GND
CS GPIO15
RST GPIO4
DC GPIO2
SDI GPIO23
SCK GPIO18
Complemento – Conexão do Display
Abaixo, a tabela de conexão entre o ESP32 e o Display.
Complemento – Biblioteca
• Biblioteca TFT_eSPI
1. Vá em Sketch -> Incluir Biblioteca -> Gerenciar bibliotecas
2. Pesquise por tft_espi
3. Selecione e instale a biblioteca TFT_eSPI distribuída por Bodmer
Complemento – Biblioteca
• Configuração da biblioteca TFT_eSPI
Precisamos configurar o arquivo User_Setup.h para utilizá-lo com o display escolhido e os pinos do
ESP32. Para isso, localize-o no local de instalação da biblioteca, como mostrado no exemplo abaixo.
Complemento – Biblioteca
• Configuração da biblioteca TFT_eSPI: Arquivo User_Setup.h
Verifique se o driver correto está selecionado e se os pinos estão ajustados corretamente. Confira
também as velocidades para comunicação SPI.
Código
com
display
Códigos-Fonte: Declarações
#include <SPI.h> //Para a comunicação SPI com o display
#include <TFT_eSPI.h> // Biblioteca de controle do display
//Variáveis Globais
float ultimaTensao = 0; //Usada para apagar o valor de tensão no display
float ultimaCorrente = 0; //Usada para apagar o valor de corrente no display
Códigos-Fonte: Setup()
void setup()
{
Serial.begin(115200); //Iniciando a comunicação serial
tft.init(); //inicia o display
tft.setRotation(1); //Ajusta a rotação do display
tft.fillScreen(0x0); //pinta a tela de preto
//tft.setTextFont(7); //Ajusta o tamanho da fonte
}
Códigos-Fonte: Loop() – Variáveis e constantes
void loop()
{
//coeficientes das regressões lineares. Usados para a conversão dos códigos
const float coefA_VAC = 0.2652;
const float coefB_VAC = 0.0;
const float coefA_IAC = 0.1191;
const float coefB_IAC = 0.0;
//Período mínimo de captura de 16,7ms para garantir que ao menos um ciclo seja capturado
const int32_t duracaoDaAmostragem = (int32_t)((1000.0 / 60.0) * 100.0); //100 ciclos de 1000ms/60 (60Hz)
//Variáveis
int32_t tensao = 0;
int32_t corrente = 0;
uint32_t qtdDeAmostras = 0;
float acumuladorTensao = 0.0;
float acumuladorCorrente = 0.0;
qtdDeAmostras++;
} while ((millis() - inicio) < duracaoDaAmostragem);
//Imprime a unidades
tft.setTextSize(2);
tft.setCursor(270, 120, 4);
tft.print("V");
tft.setCursor(270, 240, 4);
tft.print("A");
ultimaTensao = acumuladorTensao;
ultimaCorrente = acumuladorCorrente;
}
Captura: Display indicando valores
Em www.fernandok.com
Download arquivo PDF e INO
47