Você já imaginou poder ver o quanto gasta de eletricidade que passa pelos fios da sua casa? Com o sensor ACS712 e um Arduino, isso fica tão simples quanto medir temperatura! Neste guia, você criará um medidor inteligente que mostra:
Importante: Escolha o modelo correto do ACS712 para sua aplicação (5A, 20A ou 30A).
Esquemático

No exemplo usamos um motor como referência de aparelho, mas você pode escolher qualquer aparelho, apenas siga o limite seguro de tensão e corrente do módulo.
Vamos instalar uma biblioteca para facilitar o desenvolvimento do código:
Como na imagem acima busque na IDE do arduino a aba de bibliotecas e pesquise por “acs712”, depois verifique a biblioteca fornecida por Rob Tillaart e precione o botão de instalar.
Atenção as variáveis de tensão e custo de KWh elas devem ser alteradas conforme o fornecido pela concessionária elétrica de sua região, procure em sua conta de luz esses valores.
#include <ACS712.h>
// -------------------------------------------------------------------------------------//
// CONFIGURAÇÕES DO SISTEMA (Ajuste aqui) //
// -------------------------------------------------------------------------------------//
const float TENSAO_REDE = 127.0; // Tensão da sua rede (127V ou 220V)
const float CUSTO_KWH = 0.90; // Custo da sua tarifa de energia por kWh (R$)
// Configurações de projeção (personalizáveis)
const int HORAS_POR_DIA = 8; // Horas de uso diário para projeção
const int DIAS_POR_MES = 30; // Dias de uso mensal para projeção
// FILTRO DE RUÍDO - IMPORTANTE!
const float LIMITE_MINIMO_CORRENTE = 0.100; // Corrente mínima para considerar (100mA)
const int NUMERO_AMOSTRAS = 8; // Amostras para média
// -------------------------------------------------------------------------------------//
// VARIÁVEIS GLOBAIS //
// -------------------------------------------------------------------------------------//
float kWh_Total = 0; // Consumo total acumulado em kWh
float gasto_Real_Total = 0; // Gasto total acumulado em R$
unsigned long tempoAnterior = 0; // Armazena o tempo da última leitura
bool sistema_Ativo = false; // Flag para controle do estado de medição
// Inicializa o sensor ACS712 (20A no pino A0, tensão de 5V, resolução de 1023, referência da biblioteca)
// Para 5A use 185 mV
// Para 20A use 100 mV
// Para 30A use 66 mV
ACS712 sensor(A0, 5.0, 1023, 100);
// -------------------------------------------------------------------------------------//
// FUNÇÕES //
// -------------------------------------------------------------------------------------//
// Função para filtrar ruído
float filtrarCorrente(float corrente) {
return (corrente < LIMITE_MINIMO_CORRENTE) ? 0.0 : corrente;
}
// Função para fazer média de várias leituras
float lerCorrenteMedia() {
float soma = 0;
int leituras_validas = 0;
for (int i = 0; i < NUMERO_AMOSTRAS; i++) {
// Converte de mA para A e usa o valor absoluto
float leitura = abs(sensor.mA_AC_sampling() / 1000.0);
leitura = filtrarCorrente(leitura);
soma += leitura;
if (leitura > 0) {
leituras_validas++;
}
delay(80); // Pequena pausa entre leituras para estabilização
}
float media = soma / NUMERO_AMOSTRAS;
// Se menos da metade das leituras foram válidas, considera ruído
if (leituras_validas < (NUMERO_AMOSTRAS / 2)) {
return 0.0;
}
return media;
}
// -------------------------------------------------------------------------------------//
// SETUP //
// -------------------------------------------------------------------------------------//
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("Calibrando sensor...");
sensor.autoMidPoint();
Serial.println("=================================");
Serial.println(" MEDIDOR DE CORRENTE ATIVO ");
Serial.println("=================================");
Serial.print("Limite mínimo: ");
Serial.print(LIMITE_MINIMO_CORRENTE * 1000);
Serial.println(" mA");
Serial.print("MidPoint: ");
Serial.println(sensor.getMidPoint());
Serial.println("=================================");
Serial.println();
tempoAnterior = millis();
}
// -------------------------------------------------------------------------------------//
// LOOP //
// -------------------------------------------------------------------------------------//
void loop() {
// Medição da corrente com filtro
float Irms = lerCorrenteMedia();
// Cálculo da potência instantânea
float potencia_W = Irms * TENSAO_REDE;
// Cálculo do consumo e gasto acumulado
unsigned long tempoAtual = millis();
// Calcula o tempo decorrido desde a última medição
float delta_Segundos = (tempoAtual - tempoAnterior) / 1000.0;
// Se houver uma corrente detectada, calcula o consumo
if (Irms > 0) {
float consumo_Instantaneo_Wh = (potencia_W * delta_Segundos) / 3600.0;
float gasto_Instantaneo_Reais = (consumo_Instantaneo_Wh / 1000.0) * CUSTO_KWH;
kWh_Total += consumo_Instantaneo_Wh / 1000.0; // Adiciona ao total em kWh
gasto_Real_Total += gasto_Instantaneo_Reais; // Adiciona ao total em R$
}
tempoAnterior = tempoAtual;
// Exibição dos dados no monitor serial
Serial.println("=================================");
if (Irms > 0) {
// APARELHO CONECTADO - Mostra dados completos
Serial.println("APARELHO DETECTADO");
Serial.println("---------------------------------");
Serial.print("Corrente: ");
Serial.print(Irms, 3);
Serial.println(" A");
Serial.print("Potência: ");
Serial.print(potencia_W, 1);
Serial.println(" W");
Serial.println();
Serial.println("GASTO EM TEMPO REAL");
Serial.println("---------------------------------");
Serial.print("Energia acumulada: ");
Serial.print(kWh_Total, 4);
Serial.println(" kWh");
Serial.print("Custo total: R$ ");
Serial.println(gasto_Real_Total, 4);
Serial.println();
Serial.println("PROJEÇÃO DE CUSTOS");
Serial.println("---------------------------------");
// Cálculos de projeção
float custoPorHora = (potencia_W / 1000.0) * CUSTO_KWH;
float custoPorDia = custoPorHora * HORAS_POR_DIA;
float custoPorMes = custoPorDia * DIAS_POR_MES;
float consumoDiario = (potencia_W * HORAS_POR_DIA) / 1000.0;
float consumoMensal = consumoDiario * DIAS_POR_MES;
// Projeção por hora
Serial.print("Por hora: R$ ");
Serial.print(custoPorHora, 3);
Serial.print(" (");
Serial.print(potencia_W / 1000.0, 3);
Serial.println(" kWh)");
// Projeção por dia
Serial.print("Por dia: R$ ");
Serial.print(custoPorDia, 2);
Serial.print(" (");
Serial.print(consumoDiario, 2);
Serial.print(" kWh em ");
Serial.print(HORAS_POR_DIA);
Serial.println("h)");
// Projeção por mês
Serial.print("Por mês: R$ ");
Serial.print(custoPorMes, 2);
Serial.print(" (");
Serial.print(consumoMensal, 1);
Serial.print(" kWh em ");
Serial.print(DIAS_POR_MES);
Serial.println(" dias)");
} else {
// SEM CARGA - Mensagem simples
Serial.println("CONECTE UM APARELHO PARA MEDIR");
Serial.println("---------------------------------");
Serial.println("Aguardando detecção de corrente...");
Serial.print("(limite mínimo de corrente: ");
Serial.print(LIMITE_MINIMO_CORRENTE * 1000);
Serial.println(" mA)");
}
Serial.println("=================================");
Serial.println();
delay(2500); // Espera 2.5 segundos entre leituras
}Unidades de medidas
Pense na eletricidade como um rio:
Baseado nisso conseguimos fazer alguns cálculos com os dados do sensor.
Determinamos a corrente elétrica (A) do aparelho com o sensor e a biblioteca. Por exemplo, vamos usar um ferro de passar que consome 8,7 A. Calculamos a potência (W) do aparelho usando a fórmula:
Potência (W) = Corrente (A) x Tensão (V)Considerando a tensão de 127 V, a potência do ferro é: 8,7 A × 127 V = 1105 W. Agora, para saber a energia (kWh) consumida, multiplicamos a potência pelo tempo de uso em horas e dividimos por mil para manter dentro da unidade KWh.
Energia (kWh) = [Potência (W) x Tempo (h)] / 1000Se o ferro for usado por 2 horas: [1105 W × 2 h] / 1000 = 2,21 kWh
Por fim, calculamos o custo total multiplicando a energia consumida pelo preço do kWh na sua região.
Custo = Energia (kWh) x Preço por kWhSe o preço do kWh for de R$ 0,90: 2,21 kWh × R$ 0,90 = R$ 1,99
O custo para usar o ferro de passar por duas horas é de R$ 1,99. Com esses dados conseguimos calcular o gasto por hora, dia, mês e fazer projeções do quanto seria a fatura mensal.
Seguindo todos os passos teremos algo como no vídeo:
Com essa base simplificada, você pode:
Dica Profissional: Combine com sensor de tensão para medição 100% precisa em redes instáveis!
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!