Capa do post blog arduino portenta c33: Implementação de Medição de Energia em Tempo Real

Implementação de Medição de Energia em Tempo Real com Arduino Portenta C33 Deixe um comentário

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.

Imagem do Circuito da Portenta C33

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:

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:

Diagrama Conexões Elétricas

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:

cabo AC passando entre o transformador de corrente

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.

gif corrente induzida

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 primário (IP)

Corrente de pico no enrolamento secundário (IS):

Corrente de pico no enrolamento secundário (IS)

Resistor de carga ideal (RBurden):

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:

Animação 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.

Dashboard do Arduino Cloud

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.

Faça seu comentário

Acesse sua conta e participe