//Programa : Medidor de energia elétrica com Arduino e SCT-013

//Baseado no programa exemplo da biblioteca EmonLib

//Carrega as bibliotecas
#include "EmonLib.h"
#include

EnergyMonitor emon1;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Tensao da rede eletrica
int rede = 110.0;

//Pino do sensor SCT
int pino_sct = 1;

void setup()
{
lcd.begin(16, 2);
lcd.clear();
Serial.begin(9600);
//Pino, calibracao - Cur Const= Ratio/BurdenR. 1800/62 = 29.
emon1.current(pino_sct, 29);
//Informacoes iniciais display
lcd.setCursor(0,0);
lcd.print("Corr.(A):");
lcd.setCursor(0,1);
lcd.print("Pot. (W):");
}

void loop()
{
//Calcula a corrente
double Irms = emon1.calcIrms(1480);
//Mostra o valor da corrente
Serial.print("Corrente : ");
Serial.print(Irms); // Irms
lcd.setCursor(10,0);
lcd.print(Irms);

//Calcula e mostra o valor da potencia
Serial.print(" Potencia : ");
Serial.println(Irms*rede);
lcd.setCursor(10,1);
lcd.print(" ");
lcd.setCursor(10,1);
lcd.print(Irms*rede,1);

delay(1000);
}

Bom tarde pessoal tenho esse código que peguei em um site que tava pesquisando sobre o sensor de corrente não invasivo SCT-013 20A e queria saber se alguém pode me ajudar queria saber como fazer ele medir o consumo em reais e se posso usar um Lcd de 16x2 para apresentar o consumo se alguém puder me ajudar

Exibições: 1841

Responder esta

Respostas a este tópico

Boa tarde Carlos eu peguei esse código do rui para testar ele esta apresentando o valor em reais acumulado e o valor de kwtotal mais no monitor serial e no Lcd esta apresentando o valor da potencia e da corrente vc consegue me dizer como faço para apresentar o valor em reais acumulado e o valor do kwtotal no Lcd 

// http://labdegaragem.com/forum/topics/medidor-de-consumo-de-energia-1
#include <EEPROM.h>


//Baseado no programa exemplo da biblioteca EmonLib

//Carrega as bibliotecas

#include "EmonLib.h"
#include <LiquidCrystal.h>
#include <avr/eeprom.h>

#define eeprom_read_to(dst_p, eeprom_field, dst_size) eeprom_read_block(dst_p, (void *)offsetof(__eeprom_data, eeprom_field), MIN(dst_size, sizeof((__eeprom_data*)0)->eeprom_field))
#define eeprom_read(dst, eeprom_field) eeprom_read_to(&dst, eeprom_field, sizeof(dst))
#define eeprom_write_from(src_p, eeprom_field, src_size) eeprom_write_block(src_p, (void *)offsetof(__eeprom_data, eeprom_field), MIN(src_size, sizeof((__eeprom_data*)0)->eeprom_field))
#define eeprom_write(src, eeprom_field) { typeof(src) x = src; eeprom_write_from(&x, eeprom_field, sizeof(x)); }
#define MIN(x,y) ( x > y ? y : x )


EnergyMonitor emon1;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Tensao da rede eletrica
int rede = 110.0;

//Pino do sensor SCT
int pino_sct = 1;

struct __eeprom_data {
double flash_kwhtotal;
};

//Cria variaveis globais
double kwhTotal;
double kwhTotal_Acc;
double vlreais;
double vlreais_Acc;
double realPower;
unsigned long ltmillis, tmillis, timems, previousMillis, refresh;
char charBuf[30];
void setup()
{
Serial.begin(9600);
emon1.current(pino_sct, 29); //Pino, calibracao - Cur Const= Ratio/BurdenR. 1800/62 = 29.
eeprom_read(kwhTotal, flash_kwhtotal);
previousMillis = millis();
lcd.begin(16, 2);
lcd.clear();


//Informacoes iniciais display
lcd.setCursor(0,0);
lcd.print("A:");
lcd.setCursor(0,1);
lcd.print("(W):");
}
void loop()
{
// Calcula quantidade de tempo desde a última measurment realpower.
ltmillis = tmillis;
tmillis = millis();
timems = tmillis - ltmillis;
double Irms = emon1.calcIrms(1480); // Calculate Irms

// Calcular o número de hoje de kWh consumido.
//kwhTotal = kwhTotal + ((realPower/1000.0) * 1.0/3600.0 * (timems/1000.0));

// Calcular o número de hoje de kWh consumido.
kwhTotal = (((Irms*127.0)/1000.0) * 1.0/3600.0 * (timems/1000.0));
kwhTotal_Acc = kwhTotal_Acc + kwhTotal;
vlreais = kwhTotal * 0.35;
vlreais_Acc = vlreais_Acc + vlreais;

//Serial.print("Watts: ");
//Serial.println(Irms*127.0); // potencia aparente

Serial.print("kwhTotal_Acc: ");
Serial.println(kwhTotal_Acc, 10);


lcd.setCursor(10,1);
lcd.print(" ");
lcd.setCursor(10,1);
lcd.print(Irms*rede,1);

/* Serial.print("Current: ");
Serial.print(Irms); // Irms
lcd.setCursor(10,0);
lcd.print(Irms);*/

Serial.print("vlreais_Acc: ");
//Serial.print(vlreais, 10);
Serial.println(vlreais_Acc, 10);
Serial.print("");
lcd.print(" ");
lcd.setCursor(3,0);
lcd.print(vlreais, 10);

//grava na memoria a cada 1 minuto
if ((millis() - refresh)>= 100)
refresh = millis(); //actualiza a contagem.
{
//Serial.println("Gravando na EEprom");
eeprom_write(kwhTotal, flash_kwhtotal);
previousMillis=millis();
}
//Multiplica pelo valor kilowatt hora R$ 0.35 Reais
//vlreais = kwhTotal * 0.35;
}

void printFloat(float value, int places) {
// this is used to cast digits
int digit;
float tens = 0.1;
int tenscount = 0;
int i;
float tempfloat = value;

// Se certificar de que arredondar corretamente. este poderia usar pow de <math.h>, mas não parece vale a importação
// Se esta etapa arredondamento não está aqui, o valor 54,321 imprime como 54,3209

// calcular arredondamento prazo d: 0,5 / pow (10, lugares)
float d = 0.5;
if (value < 0)
d *= -1.0;
// dividir por dez para cada casa decimal
for (i = 0; i < places; i++)
d/= 10.0;
// este pequeno disso, combinado com truncamento vai arredondar os nossos valores corretamente
tempfloat += d;

// Primeiro obter dezenas de valor para ser a grande potência de dez a menos do que o valor
// Tenscount não é necessário, mas seria útil se você queria saber depois desta quantos caracteres o número tomará

if (value < 0)
tempfloat *= -1.0;
while ((tens * 10.0) <= tempfloat) {
tens *= 10.0;
tenscount += 1;
}


// escrever o negativo, se necessário
if (value < 0)
Serial.print('-');

if (tenscount == 0)
Serial.print(0, DEC);

for (i=0; i< tenscount; i++) {
digit = (int) (tempfloat/tens);
Serial.print(digit, DEC);
tempfloat = tempfloat - ((float)digit * tens);
tens /= 10.0;
}

// se não há lugares após decimal, pare agora e retorno
if (places <= 0)
return;

// caso contrário, escreva o ponto e continuar
Serial.print('.');

// Agora, escrever cada casa decimal, deslocando um dígitos por uma, para o lugar queridos e escrever o valor truncado
for (i = 0; i < places; i++) {
tempfloat *= 10.0;
digit = (int) tempfloat;
Serial.print(digit,DEC);
// uma vez escrito, subtrair fora esse dígito
tempfloat = tempfloat - (float) digit;
delay(1000);
}
}

 

Ola Atila, tambem estou montando um medidor desse tipo, e gostaria de pedir uma ajuda sua, teria como me passar um email para a gente se comunicar, gostaria que voce me enviasse o seu esquema de montagem, pois estou com dificuldade de realizar a minha, obrigado

Até o momento estou utilizando essa montagem desse site http://blog.filipeflop.com/arduino/medidor-de-energia-eletrica-com-...  porque o lcd que eu tenho e de 16x2 que e igual o da montagem mais vou colocar um display do nokia 5110 que da para mostrar mais informações

Okkk. voce realizou essa montagem desse site e apenas colocou o codigo que esta disponivel acima ??? o do rui ?? Obrigado Desculpa o incomodo

esse código do rui se vc montar da forma que o esquema de  montagem   que e mandei vai funcionar mais não sei ainda e o código ou por causa dos componentes que eu usei as medições estão com valores diferente do real

Ola, é verdade, realizei a montagem que voce me passou e tb deu uns valores meio estranho pra mim, nao sei o que possa ta acontecendo

O problema e o sensor que estou usando que e diferente deste usado para esse código o sensor utilizado e um de 20A:1V
e o meu e de 100A:50mA e a saídas dele são diferente o meu tem uma saída de 33mA e o utilizando o código tem uma saída 1V. segue o datasheet https://nicegear.co.nz/obj/pdf/SCT-013-datasheet.pdf

Boa tarde Rui, editei o post, e postei a solução que encontrei.
Muito obrigado pela ajuda.

Att.

Átila

A partir desta página, http://openenergymonitor.org/emon/buildingblocks/ct-and-ac-power-ad... consegue-se perceber como se configuram esse tipo de sensores. Sendo assim, e se eu percebi bem, se adicionar uma resistência de 120 Ohm (penso que este valor é suficiente para os 45A), deve substituir a linha do seu código:

emon1.current(pino_sct, 29); //Pino, calibracao - Cur Const= Ratio/BurdenR. 1800/62 = 29.

por:

emon1.current(pino_sct, 16.67); //Pino, calibracao - Cur Const= Ratio/BurdenR. = (100/0,05) / 120 = 16,67.

Segue código já modificado.

Att.

Átila

Anexos

Boa tarde Àtila, tudo bem?
Estou tendo dificuldades na hora de calibrar o meu sensor SCT-013-020, meu modelo é o de 20A.
Não consegui entender essa sua mudança:
emon1.current(pino_sct, 16.67); //Pino, calibracao - Cur Const= Ratio/BurdenR. = (100/0,05) / 120 = 16,67.
Teria como me explicar?

Grata.

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2017   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço