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: 8889

Responder esta

Respostas a este tópico

Oi Iago, boa tarde.

O que voce não consegue? Ter o valor, ou ter o valor correto?

Informe mais detalhes de sua dificuldade.

Rui

Oi Iago,

o primeiro problema que encontrei foi:

o valor da variavel "realPower" é sempre 0, e portanto;

kwhTotal = kwhTotal + ((realPower/1000.0) * 1.0/3600.0 * (timems/1000.0)); sera'  sempre "KwhTotal" sem acumular.

Rui

Se o problema que o Rui aponta for corrigido, creio que todo resto vai funcionar, e o contrario também vale, não vai obter valor algum porque tudo esta fundado no valor do resultado da potencia, então tem que corrigir isso antes que tudo.

Abs.

A tensão da rede aqui em BH é 127V e não 110V.

Qual é a tensão da rede que esta medindo?

Qual sensor esta usando?

Estou usando  um sensor não invasivo de corrente. 

a minha rede aqui  é 127. 

Opa , tem que mudar o valor para 127V no seu programa !

Sensor não invasivo ? 

Se for esse  SCT-013-030 , o pessoal esta apanhando na leitura dele.

O circuito mais usado não é confiável. Veja o tópico.

http://labdegaragem.com/forum/topics/liga-o-do-sensor-de-corrente-s...

Com relação ao sensor esta tranquilo. 

ele esta medindo certo porem eu  não consigo fazer o valor do Khwh total acumular. 

Em um minuto, tudo pode mudar , he he 

Eu faria mais medições por minuto. 

Como esta fazendo a averiguação do seus teste ? 

Esta conferido com o wattimetro da sua residência ?

Iago,

Estou improvisando um teste aqui porque não tenho este sensor, veja o vídeo da simulação.

https://www.youtube.com/watch?v=kez_jLFaO6I&feature=youtu.be

Pelo que vejo tem um problema na conversão de uma variável, no seu LCD você visualiza este tipo de informação, tal como aparece para mim no Virtual Monitor?

Abs.

esta sim , a

Ok, tenho que sair agora e somente volto depois das 12, logo continuo os testes.

Abs.

Carlos, muito interessante esse seu simulador.

Qual é ele  ?

Obrigado. 

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