Bom dia  

estou  montando um medidor de consumo de energia. 

mas não esta saindo  a informação que eu quero. 

gostaria que ele fisesse a leitura da corrente e com o valor da tensão ja pre determinado, o arduino me desse o valor da potencia e da energia consumida, multiplicando  a energia pelo valor da energia em dinheiro. e me desse esse valor acumulativo. 

porem não estou  conseguindo  fazer isso. 

alguem pode me ajudar. 

segue abaixo minha programação.

esta bem carregada de informações por que usei varias referencias para tentar fazer isso. quem puder me ajudar eu agradeço. 

#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 vlreais;
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));
vlreais = kwhTotal * 0.35;

Serial.print("Watts: ");
Serial.println(Irms*127.0); // potencia aparente
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: ");
Serial.print(vlreais, 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);
}
}

Exibições: 8193

Responder esta

Respostas a este tópico

Iago, bom dia.

Esta parte:  * (timems/1000.0));, usa a variavel "timems" que em comandos anteriores calculou o tempo que passou desde a ultima medida.

Como o resultado é em função do tempo. kwhTotal --> Kwh --->  Kilo Watt hora.

Rui

 

mas o 1000 que ele ta dividindo  é em função de que ? 

Bom dia Rui estou tentando fazer um medidor de energia com esse código que vc escreveu mais a potência que consigo medir esta quase o dobro da real acho que e a relação de transformação do sensor de corrente o que eu estou usando e o SCT-013 de 100A:50mA você pode me ajudar com essa duvida muito obrigado e bom dia

Oi Iago, boa tarde.

A variavel "timems" guarda o valor em ms (milisegundos), o criador do codigo dividiu por 1000 para calcular em microsegundos.

Rui

Olá Iago,

Se resolveu o problema e considera que este assunto esta solucionado, não esqueça de mudar o titulo atual, colocando a palavra RESOLVIDO antes do titulo atual, desta forma ajudara a outros com problemas similares e também passar a ser considerado uma fonte de consulta solucionada.

Obrigado.

Grande abraço!

Alguem possui o esquema de montagem do circuito para o programa do medidor de energia??? 

Também gostaria do esquema

O código postado está correto? E o esquema de ligação poderia nos passar?

Obrigado.

Aviso aos navegantes,

Este projeto é do autor do tópico, Iago, eu e o colega Rui Viana apenas colaboramos para que o code dele funciona-se, eu não tenho o esquema, o Rui também não, o Iago é que deveria ter, seguem links do meu canal sobre este tópico na época.


https://www.youtube.com/watch?v=2e4hF6uT5Po

https://www.youtube.com/watch?v=aS5GyNodlGc

Abs.

Galera, creio que esse projeto deve ter sido baseado nesse outro projeto :

http://openenergymonitor.org/emon/

https://github.com/openenergymonitor/EmonLib

Olá a todos, estou usando este código para monitorar o consumo de energia, e eu estou lutando com uma variável para adicionar um botão para apagar EEPROM e assim que eu começar do zero novamente ....

Se alguém tiver alguma idéia que eu agradeceria muito ....

Atenciosamente ....

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2018   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço