Este artigo explora a implementação de um medidor de energia simples, porém eficiente, utilizando o Arduino Portenta C33 e um transformador de corrente não-invasivo. O medidor de energia proposto possibilita a medição e monitoramento em tempo real do consumo de corrente elétrica, fornecendo insights valiosos sobre padrões de uso de energia ao usuário.
Os transformadores de corrente não invasivos apresentam diversas vantagens, como segurança elétrica, fácil instalação e a capacidade de medir a corrente em circuitos elétricos existentes sem interromper o fluxo de corrente. Essas características os tornam especialmente adequados para aplicações como medição de energia, monitoramento de potência e gerenciamento de carga.
O Arduino Portenta C33, com seu microcontrolador poderoso e conectividade sem fio integrada, destaca-se como uma escolha ideal para aplicações de monitoramento de energia. O módulo Wi-Fi integrado no Portenta C33 permite uma integração perfeita com redes sem fio, simplificando a comunicação com a plataforma Arduino IoT Cloud.
Ao combinar o Portenta C33 e o transformador de corrente SCT013-000, é possível criar rapidamente um medidor de energia capaz de medir a corrente eficaz (Root Mean Square – RMS), o consumo de energia e comunicar os dados à plataforma Arduino IoT Cloud para análises e visualizações adicionais.
Objetivos com Arduino Portenta C33
Os principais objetivos deste artigo são os seguintes:
- Desenvolver um medidor de energia funcional capaz de fornecer insights em tempo real sobre padrões de uso de energia, permitindo que os usuários acompanhem e analisem seu consumo de energia.
- Demonstrar a integração da placa Portenta C33 com um transformador de corrente não invasivo para medir corrente alternada (AC).
- Calcular o valor RMS (Root Mean Square) de uma forma de onda de corrente, proporcionando uma representação precisa da corrente real fluindo pelo circuito.
- Utilizar a corrente RMS medida e uma voltagem AC conhecida para calcular o consumo de energia em Watts.
- Estabelecer uma conexão entre o Portenta C33 e a Arduino IoT Cloud para enviar os dados de corrente RMS medidos para análises adicionais, visualização e monitoramento remoto.
Requisitos de Hardware e Software
Requisitos de Hardware:
- 1 un x Portenta C33
- 1 un x Cabo USB-C
- 1 un x Antena Wi-Fi W.FL
- 1 un x Transformador de corrente SCT013-000
- 1 un x Circuito condicionador
Requisitos de Software:
- Arduino IDE 2.0+
- Para a funcionalidade de conectividade Wi-Fi do Portenta C33, utilizaremos a Arduino IoT Cloud. Caso não tenha uma conta, crie uma gratuitamente aqui.
- O código de exemplo do medidor de energia
Visão Geral da Configuração de Hardware
As conexões elétricas do design de aplicação pretendido são mostradas no diagrama abaixo:
A visão geral ilustra a conexão do sensor passando por um circuito condicionador e interligando com o Portenta C33.
Leve em consideração que apenas um cabo AC deve passar entre o transformador de corrente, como mostrado abaixo:
Medindo Corrente Usando Transformadores de Corrente Não Invasivos
Transformadores de corrente não invasivos, como o transformador de corrente SCT013-000 usado neste artigo, fornecem um método seguro e conveniente para medir corrente elétrica, sem a necessidade de conexões elétricas diretas. Esses transformadores funcionam com base no princípio da indução eletromagnética e consistem em um enrolamento primário e um enrolamento secundário.
Como mostrado na animação abaixo, o enrolamento primário geralmente consiste em uma única volta ou algumas voltas de um condutor, enquanto o enrolamento secundário consiste em um grande número de voltas enroladas em torno de um núcleo magnético. Quando uma corrente alternada flui pelo enrolamento primário, ela induz uma corrente proporcional no enrolamento secundário. Essa corrente induzida pode ser medida e usada para determinar a magnitude da corrente primária.
Para medir com precisão a corrente induzida, um resistor de carga é conectado em paralelo com o enrolamento secundário do transformador de corrente. O resistor de carga cria uma queda de tensão proporcional à corrente secundária, que pode ser medida usando um sensor analógico ou digital, por exemplo, os pinos de entrada analógica do Portenta C33.
Neste artigo, a corrente secundária medida é convertida em um valor de corrente RMS usando razões de calibração apropriadas e cálculos.
Importante! O valor do resistor de carga deve ser escolhido cuidadosamente para coincidir com as características físicas do seu transformador de corrente e sensor de medição.
Para calcular o resistor de carga ideal, são necessários alguns cálculos matemáticos. Abaixo, você pode encontrar os cálculos feitos para o transformador de corrente SCT013-000 usado neste artigo técnico:
Corrente de pico no enrolamento primário (IP):
Corrente de pico no enrolamento secundário (IS):
Resistor de carga ideal (RBurden):
Para este artigo e o transformador de corrente não invasivo usado, o resistor de carga ideal (RBurden) é de 21,9 Ω; você pode usar um valor de resistor comercialmente disponível, por exemplo, 22 Ω.
Transformadores de corrente não invasivos oferecem várias vantagens, incluindo segurança elétrica, fácil instalação e a capacidade de medir corrente em circuitos elétricos existentes sem interromper o fluxo de corrente. Essas características os tornam adequados para aplicações como:
- Medição de energia
- Monitoramento de potência
- Gestão de carga
Exemplo de Código de Transformador de Corrente Não Invasivo
O código do transformador de corrente não invasivo tem uma estrutura simples que é explicada abaixo.
/** Nota de aplicação para medição de energia Nome: current_cloud.ino Propósito: Este código interage o Portenta C33 com o transformador de corrente SCT013-000 para medir corrente RMS e potência. @author Equipe Arduino @version 1.0 23/06/20 */ // Importar propriedades e definições para a integração com o Arduino IoT Cloud #include "thingProperties.h" // Definir um fator de conversão em ponto flutuante para a configuração do transformador de corrente SCT013-000 float Sensor_Factor = 51.8; // Definir variáveis em ponto flutuante para a corrente de Root Mean Square (RMS) e potência aparente float Irms, AP; // Definir um inteiro para a voltagem específica da região geográfica int Region_Voltage = 110; // Definir uma variável booleana para controlar se o processo de amostragem está ativo ou não bool Sample_Switch = true; // Definir o pino onde o transformador de corrente está conectado #define TRANSFORMER_PIN A0 void setup() { // Inicializar a comunicação serial com uma taxa de baud de 115200 Serial.begin(115200); // Definir o pino do transformador de corrente como entrada // Definir a resolução da leitura analógica para 12 bits // Pausar a execução do programa por um segundo pinMode(TRANSFORMER_PIN, INPUT); analogReadResolution(12); delay(1000); // Chamar a função para configurar o Arduino IoT Cloud iot_cloud_setup(); } void loop() { // Atualizar o status do Arduino Cloud ArduinoCloud.update(); // Se a chave de amostragem estiver ativa, calcular a corrente RMS if (Sample_Switch == true) { Irms = getCurrent(); // Calcular a potência aparente AP = Irms * Region_Voltage; // Imprimir corrente RMS e potência aparente no Monitor Serial da IDE Serial.print(F("- I_rms [A]: ")); Serial.print(Irms); Serial.print(F("- Potência Aparente [VA]: ")); Serial.print(AP); } else { // Se a chave de amostragem não estiver ativa, imprimir uma mensagem informando que a medição de energia foi pausada Serial.println(F("- A medição de energia foi pausada!")); } // Atualizar a corrente RMS e a potência aparente no Arduino IoT Cloud cloud_Current = Irms; cloud_ApparentPower = AP; // Pausar a execução do programa por um segundo delay(1000); } /** Esta função é executada sempre que um novo valor é recebido do Arduino IoT Cloud @param nenhum @return nenhum */ void onCloudCurrentChange() { // Imprimir uma mensagem de depuração Serial.print(F("- Valor I_RMS atualizado para IoT Cloud")); } /** Lê o pino analógico designado, conectado a um transformador de corrente SCT013-000 e calcula a corrente RMS @param nenhum @return corrente RMS (amperes) */ float getCurrent() { float Current = 0; float I_Sum = 0; int N = 0; long time = millis(); // Coletar amostras por 0,5 segundos (aproximadamente 30 ciclos a 60 Hz) while(millis() - time < 500) { // Ler o pino analógico int sensorValue = analogRead(TRANSFORMER_PIN); // Converter a leitura analógica para voltagem float sensorVoltage = sensorValue * (3.1 / 4096.0); // Converter a voltagem do sensor para corrente Current = sensorVoltage * Sensor_Factor; // Calcular a soma dos quadrados da corrente I_Sum += sq(Current); N++; delay(1); } // Compensar pelos quadráticos do semi-ciclo negativo I_Sum = I_Sum * 2; // Calcular corrente RMS (média) Current = sqrt((I_Sum)/N); return(Current); } /** Configura a conexão com o Arduino IoT Cloud @param nenhum @return nenhum */ void iot_cloud_setup() { // Definido em thingProperties.h initProperties(); // Conectar ao Arduino IoT Cloud ArduinoCloud.begin(ArduinoIoTPreferredConnection); /* A seguinte função permite obter mais informações relacionadas ao estado da rede e à conexão e erros do IoT Cloud quanto maior o número, mais informações granulares você obterá. O padrão é 0 (apenas erros). O máximo é 4 */ setDebugMessageLevel(2); ArduinoCloud.printDebugInfo(); sct_ratio = Sensor_Factor; system_Voltage = Region_Voltage; sample_Control = Sample_Switch; } /** Esta função é executada sempre que um novo valor de sct_ratio é recebido do Arduino IoT Cloud @param nenhum @return nenhum */ void onSctRatioChange() { Sensor_Factor = sct_ratio; } /* Esta função é executada sempre que um novo valor de system_Voltage é recebido do Arduino IoT Cloud */ void onSystemVoltageChange() { Region_Voltage = system_Voltage; } /* Esta função é executada sempre que um novo valor de sample_Control é recebido do Arduino IoT Cloud */ void onSampleControlChange() { Sample_Switch = sample_Control; if (Sample_Switch == true){ Serial.println(F("Medição de energia iniciada - Acionada pelo Arduino Cloud")); } if (Sample_Switch == false){ Serial.println(F("Medição de energia pausada - Acionada pelo Arduino Cloud")); } }
As seções seguintes ajudarão você a entender as principais partes do código.
Variáveis e Constantes do Arduino Portenta C33
As principais variáveis e constantes utilizadas no código são:
// Fator de conversão para a configuração específica do sensor float Sensor_Factor = 51.8; // Variáveis para Corrente RMS e Potência Aparente float Irms, AP; // Tensão específica da região geográfica em volts int Region_Voltage = 110; // Variável booleana para controlar a amostragem de medição bool Sample_Switch = true; // Pino analógico ao qual o transformador de corrente está conectado #define TRANSFORMER_PIN A0
- Sensor_Factor: Um fator de conversão usado para converter a leitura bruta do transformador de corrente em um valor de corrente RMS.
- Irms e AP: Variáveis usadas para armazenar a corrente RMS e a potência aparente, respectivamente.
- Region_Voltage: A voltagem do sistema de energia que está sendo monitorado. Isso varia dependendo do país e do tipo de sistema de energia.
- Sample_Switch: Um interruptor booleano para controlar se o Portenta C33 deve ou não medir a potência. Se for verdadeiro, o Portenta C33 medirá a potência.
- TRANSFORMER_PIN: O pino ao qual o transformador de corrente está conectado no seu Portenta C33.
Função de Inicialização
A função setup() ajuda a configurar a comunicação com o Arduino IoT Cloud, bem como as configurações de comunicação da placa:
void setup() { // Inicializa a comunicação serial com uma taxa de baud de 115200 Serial.begin(115200); // Define o pino do transformador de corrente como entrada // Define a resolução da leitura analógica para 12 bits // Pausa a execução do programa por um segundo pinMode(TRANSFORMER_PIN, INPUT); analogReadResolution(12); delay(1000); // Chama a função para configurar o Arduino IoT Cloud iot_cloud_setup(); }
Esta função é executada uma vez quando o Portenta C33 é inicializado:
- Inicializa a comunicação serial.
- Define o modo do pino de entrada do transformador de corrente.
- Define a resolução ADC para 12 bits e aguarda um segundo para a estabilização do sistema.
- Finalmente, chama a função iot_cloud_setup() para configurar a conexão com o Arduino IoT Cloud.
Loop Principal
O loop principal do código é o seguinte:
void loop() { // Atualiza o status do Arduino Cloud ArduinoCloud.update(); // Se a chave de amostragem estiver ativa, calcula a corrente RMS if (Sample_Switch == true) { Irms = getCurrent(); // Calcula a potência aparente AP = Irms * Region_Voltage; // Imprime a corrente RMS e a potência aparente no Monitor Serial da IDE Serial.print(F("- I_RMS [A]: ")); Serial.print(Irms); Serial.print(F("- Potência Aparente [VA]: ")); Serial.print(AP); } else { // Se a chave de amostragem não estiver ativa, imprime uma mensagem informando que a medição de energia foi pausada Serial.println(F("- A medição de energia foi pausada!")); } // Atualiza a corrente RMS e a potência aparente no Arduino IoT Cloud cloud_Current = Irms; cloud_ApparentPower = AP; // Pausa a execução do programa por um segundo delay(1000); } A função loop() é executada continuamente. Em cada iteração:
- Primeiro, atualiza a conexão com o Arduino IoT Cloud.
- Se a Sample_Switch for verdadeira, mede a corrente, calcula a potência aparente e imprime no Monitor Serial da IDE.
- Se Sample_Switch for falsa, imprime que a medição de energia foi pausada.
- Em seguida, atualiza as variáveis cloud_Current e cloud_ApparentPower com os valores locais de corrente e potência aparente, e aguarda um segundo antes da próxima iteração.
Funções do Usuário
A função iot_cloud_setup() agrupa o processo de configuração inicial do Arduino Cloud da seguinte forma:
void iot_cloud_setup() { // Definido em thingProperties.h initProperties(); // Conectar ao Arduino IoT Cloud ArduinoCloud.begin(ArduinoIoTPreferredConnection); /* A seguinte função permite obter mais informações relacionadas ao estado da rede e à conexão e erros do IoT Cloud quanto maior o número, mais informações granulares você obterá. O padrão é 0 (apenas erros). O máximo é 4 */ setDebugMessageLevel(2); ArduinoCloud.printDebugInfo(); sct_ratio = Sensor_Factor; system_Voltage = Region_Voltage; sample_Control = Sample_Switch; }
Esta função é responsável por configurar a conexão com o Arduino IoT Cloud:
- Inicia as propriedades da conexão com a nuvem.
- Inicia a conexão com a nuvem usando o método de conexão preferido.
- Define o nível de mensagens de depuração para 2 para depuração detalhada, e imprime as informações de depuração.
- As variáveis sct_ratio, system_Voltage e sample_Control são usadas para sincronizar os valores locais com o Arduino IoT Cloud.
Agora, vamos falar sobre a função getCurrent():
float getCurrent() { float Current = 0; float I_Sum = 0; int N = 0; long time = millis(); // Coleta amostras por 0,5 segundos (aproximadamente 30 ciclos a 60 Hz) while(millis() - time < 500) { // Lê o pino analógico int sensorValue = analogRead(TRANSFORMER_PIN); // Converte a leitura analógica para voltagem float sensorVoltage = sensorValue * (3.1 / 4096.0); // Converte a voltagem do sensor para corrente Current = sensorVoltage * Sensor_Factor; // Calcula a soma dos quadrados da corrente I_Sum += sq(Current); N++; delay(1); } // Compensa pelos quadráticos do semi-ciclo negativo I_Sum = I_Sum * 2; // Calcula a corrente RMS (média) Current = sqrt((I_Sum)/N); return(Current); }
A função getCurrent() calcula a corrente RMS a partir da leitura do sensor. Ela lê o valor do sensor, converte-o para voltagem e, em seguida, calcula a corrente. O quadrado da corrente é somado por 0,5 segundos (aproximadamente 30 ciclos a 60 Hz). Essa soma é compensada pelos quadráticos do semi-ciclo negativo e, em seguida, usada para calcular a corrente RMS. Esse valor é retornado ao usuário.
Finalmente, as funções onSctRatioChange(), onSystemVoltageChange() e onSampleControlChange(): Essas funções são executadas sempre que o valor correspondente é alterado no Arduino IoT Cloud. Por exemplo, se onSctRatioChange() for executada, o Sensor_Factor será atualizado com o novo valor recebido da nuvem, e o mesmo vale para as outras.
Código de Exemplo Completo
O código de exemplo completo pode ser baixado aqui. O cabeçalho thingProperties.h já está incluído para sua referência, e é baseado nas variáveis do código de exemplo. O cabeçalho é gerado automaticamente com o Arduino IoT Cloud. Se desejar modificar os requisitos do ambiente de aplicação, recomenda-se fazer alterações dentro do ambiente Arduino Cloud.
Dashboard do Arduino Cloud
O Arduino Cloud permite criar um painel com interação humano-computador (HCI) em tempo real profissional, como pode ser visto na seguinte animação, mostrando uma placa Portenta C33 ativa:
Uma das características marcantes do Dashboard do Arduino Cloud é a capacidade de atualizar o fator do transformador de corrente em tempo real. Esse recurso se torna particularmente útil quando é necessário trocar para um transformador de corrente diferente em um cenário de implantação ao vivo. Diferentes transformadores de corrente podem ter características elétricas mais ou menos convenientes para cenários diferentes, e a capacidade de atualização em tempo real simplifica a troca entre eles.
Além disso, o painel permite que você selecione a tensão de instalação para atender aos requisitos do seu local. Essa adaptabilidade destaca a flexibilidade e facilidade de uso do Dashboard do Arduino Cloud, tornando-o uma ferramenta valiosa para lidar com dados de sensores em tempo real.
Em um telefone celular, o painel do Arduino Cloud exibe as informações como na figura anterior. Ele fornece a interface completa que você usaria em uma plataforma desktop, tornando-o um recurso muito útil para acessar o painel de onde quer que esteja.
Conclusões
Nesta aplicação, exploramos a interação entre uma placa Portenta C33 e o transformador de corrente SCT013-000. Examinamos como o Arduino IoT Cloud nos permite visualizar e analisar intuitivamente dados de sensores em tempo real e históricos.
Ao usar a placa Portenta C33 e o Arduino IoT Cloud, você pode transformar dados brutos do sensor em insights significativos. Seja lendo as informações de corrente RMS e potência aparente, alterando as configurações do transformador de corrente em tempo real ou adaptando-se aos requisitos exclusivos do local, esta aplicação oferece um sistema robusto e versátil para lidar com essas tarefas.
Uma das principais conclusões desta aplicação é seu potencial para aplicação em vários cenários do mundo real. Integrando capacidades de IoT e Cloud, podemos monitorar e gerenciar efetivamente o uso de energia, levando a um consumo de energia mais eficiente e contribuindo para um futuro sustentável.
Arduino Portenta C33: Próximos Passos
Agora que você aprendeu a implantar uma Portenta C33 com transformador de corrente SCT013-000, usando a atuação remota sob demanda e a visualização de dados em tempo real da plataforma Arduino Cloud, você poderá expandir ainda mais a aplicação adicionando novos equipamentos de medição com características semelhantes. Você também pode implantar vários sensores conectados a placas diferentes, criando um cluster para coletar medições de energia de todos os pontos de interesse em uma instalação elétrica.
Este post é uma tradução do artigo escrito por José Bagur e Taddy Chung. O artigo original pode ser encontrado aqui.