I Try to Build a Power Consumption meter For my e-Bike With Arduino and Blynk to find out remaining charge left in my. I Try to Calculate the Power every Quarter of a second and Add it to The BalanceWatts .
I Can Calculate Everything Except Watt Hour / 250 Microseconds
#include "SimpleTimer.h"
#include <BlynkSimpleSerialBLE.h>
#define voltPIN 6
#define ampPIN 7
char auth[] = "404212715de241cd977f7c2f98e00a10";
// i Choose float for every variable because if i choose int for any of the following it return wrong result
float adcVolt,adcAmp,Volt,Amp,Watt,wattPerQuatersecond;
float balanceWatt = 1780; // Battery Capacity at Full charge
float refVolt = 5.00;
float ampOffset = 2500;
float milliPerAmp = 66.00; // ACS712 Referece
float R1=147000; // 147k
float R2=10000; // 10k arduino output impedance match
SimpleTimer myTimer;
WidgetLCD lcd(5); // Blynk LCD Widget Initiate
void setup()
{
pinMode(voltPIN, INPUT);
pinMode(ampPIN,INPUT);
Serial.begin(9600);
Blynk.begin(Serial,auth);
lcd.clear();
myTimer.setInterval(250,calculate); // do job every Quater of a secand
}
void loop()
{
Blynk.run();
myTimer.run();
}
void calculate()
{
adcVolt = 900 ; // Tempravory Value
adcAmp = 200; // Temp value
float readVolt = ((adcVolt * refVolt) / 1024.00);
Volt = readVolt/(R2/(R1+R2));
float readAmp = (((adcAmp * 5020.00)/1024.00) - ampOffset); // INSTEAD OF 5000 I PUT 5020 (20) FOR CORRECTION IN AMPS
Amp = readAmp / milliPerAmp;
Watt = (Volt * Amp); // 1500 W
wattPerQuatersecond = (Watt / (3600.00*4)); // 0.110W/quaterSecand
balanceWatt = balanceWatt - wattPerQuatersecond;
Blynk.virtualWrite(1, Volt); //Gauge 1
Blynk.virtualWrite(2, Amp);
Blynk.virtualWrite(3, Watt);
Blynk.virtualWrite(4, balanceWatt); // Gauge 4
}
According to my Code every if my Hub motor consume 1500W then Watt per Quarter Seconds is
1500 / (3600 X 4) = 0.110W/quarterSecand
After one Minute my Battery Balance Power must increased to 1780 + (0.110460) = 1780 + 26.4 = 1806.4
But The Display Shows 1800. and Every Minute it Lag 6W . I Try to Solve this problem From the Last Week but I cannot find out my mistake. please anyone point out my problem and help me to solve. sorry for my bad English,
I Attach my code with this post
// ACS 712 Takes 200 as -27Amps (Reverse Current as Battery Get Charge From a Charger )
Forum_watt_6W_error.ino (1.73 KB)
Hi,
Welcome to the forum.
Please read the first post in any forum entitled how to use this forum.
http://forum.arduino.cc/index.php/topic,148850.0.html then look down to item #7 about how to post your code.
It will be formatted in a scrolling window that makes it easier to read.
Thanks.. Tom... 
TomGeorge:
Hi,
Welcome to the forum.
Please read the first post in any forum entitled how to use this forum.
http://forum.arduino.cc/index.php/topic,148850.0.html then look down to item #7 about how to post your code.
It will be formatted in a scrolling window that makes it easier to read.
Thanks.. Tom... 
Thanks Tom , I edit My post according to the rule you mentioned.
Hi,
I'm not sure but if
float ampOffset = 2500;
you should;
float ampOffset = 2500.0;
You have defined quite a few variables without decimal point.
Worth a try.
Where are you using " void calculate() "
Tom... 
Where are you using " void calculate() "
myTimer.setInterval(250,calculate); // do job every Quater of a secand
Tom... 
[/quote]
Problem Solved . Thankyou so much Sir, you Really Save my lots of Time . and one more thing why need to put 2500.00 instead of 2500.
I read about int and float mathematical operation that shows float of int and float is return float . then why this mistakes. me
float ampOffset = 2500.0;
You have defined quite a few variables without decimal point.
Worth a try.
I change all the integer values to float .
#include "SimpleTimer.h"
#include <BlynkSimpleSerialBLE.h>
#define voltPIN 6
#define ampPIN 7
char auth[] = "404212715de241cd977f7c2f98e00a10";
// i Choose float for every variable because if i choose int for any of the following it return wrong result
float adcVolt,adcAmp,Volt,Amp,Watt,wattPerQuatersecond;
float balanceWatt = 1780.00; // Battery Capacity at Full charge
float refVolt = 5.00;
float ampOffset = 2500.00;
float milliPerAmp = 66.00; // ACS712 Referece
float R1=147000.00; // 147k
float R2=10000.00; // 10k arduino output impedance match
SimpleTimer myTimer;
WidgetLCD lcd(5); // Blynk LCD Widget Initiate
void setup()
{
pinMode(voltPIN, INPUT);
pinMode(ampPIN,INPUT);
Serial.begin(9600);
Blynk.begin(Serial,auth);
lcd.clear();
myTimer.setInterval(250,calculate); // do job every Quater of a secand
}
void loop()
{
Blynk.run();
myTimer.run();
}
void calculate()
{
adcVolt = 900.00 ; // Tempravory Value
adcAmp = 200.00; // Temp value
float readVolt = ((adcVolt * refVolt) / 1024.00);
Volt = readVolt/(R2/(R1+R2));
float readAmp = (((adcAmp * 5020.00)/1024.00) - ampOffset); // INSTEAD OF 5000 I PUT 5020 (20) FOR CORRECTION IN AMPS
Amp = readAmp / milliPerAmp;
Watt = (Volt * Amp); // 1500 W
wattPerQuatersecond = (Watt / (3600.00*4.00)); // 0.110W/quaterSecand
balanceWatt = balanceWatt - wattPerQuatersecond;
Blynk.virtualWrite(1, Volt); //Gauge 1
Blynk.virtualWrite(2, Amp);
Blynk.virtualWrite(3, Watt);
Blynk.virtualWrite(4, balanceWatt); // Gauge 4
}
PROBLEM COMES AGAIN IF I ADD TIMER WITH ABOVE PROGRAM , WITH OUT myClock() Function it Works Perfect. Any Suggestions ?
#include "SimpleTimer.h"
#include <BlynkSimpleSerialBLE.h>
#include <DHT.h>
#include <EEPROM.h>
#define VOLTPIN 6
#define AMPPIN 7
#define DHTPIN 12
#define DHTTYPE DHT11
char auth[] = "404212715de241cd977f7c2f98e00a10";
float adcVolt,adcAmp,Volt,Amp,Watt,wattPerQuaterSecand;
float balanceWatt = 1780.00;
float refVolt = 5.00;
float ampOffset = 2500.00;
float milliPerAmp = 66.00;
float R1=147000.00;
float R2=10000.00;
float Fahrenheit = 0.00;
unsigned long timeSecands = 0;
unsigned long timeMinutes = 0;
unsigned long timeHours = 0;
SimpleTimer myTimer;
WidgetLCD lcd(5);
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
pinMode(VOLTPIN, INPUT);
pinMode(AMPPIN,INPUT);
Serial.begin(9600);
Blynk.begin(Serial,auth);
balanceWatt = EEPROMReadint(0);
lcd.clear();
myTimer.setInterval(250,calculate);
myTimer.setInterval(1000,myClock);
myTimer.setInterval(5000,boardTemp);
myTimer.setInterval(10000,updateEEPROM);
}
void loop()
{
Blynk.run();
myTimer.run();
}
void calculate()
{
unsigned int sampleVolt = 0;
unsigned int sampleAmp = 0;
for(int v=0;v<50;v++)
{
sampleVolt = sampleVolt+analogRead(VOLTPIN); //50 samples for voltage
sampleAmp = sampleAmp+analogRead(AMPPIN); //50 samples for current
}
adcVolt = sampleVolt / 50; //average voltage
adcAmp = sampleAmp / 50; //average current
float readVolt = ((adcVolt * refVolt) / 1023.00);
Volt = readVolt/(R2/(R1+R2));
float readAmp = (((adcAmp * 5000.00)/1023.00) - ampOffset); //INSTEAD OF 5000 I PUT 5020 (20) FOR CORRECTION IN AMPS
Amp = readAmp / milliPerAmp;
Watt = (Volt * Amp);
wattPerQuaterSecand = (Watt / (3600.00*4.00));
balanceWatt = balanceWatt - wattPerQuaterSecand;
Blynk.virtualWrite(1, Volt);
Blynk.virtualWrite(2, Amp);
Blynk.virtualWrite(3, Watt);
lcd.print(1,1,balanceWatt);
}
void myClock()
{
timeSecands ++;
timeMinutes = timeSecands / 60;
timeHours = timeMinutes / 60;
lcd.print(8,0,(timeHours%24)/10);
lcd.print(9,0,timeHours%4);
lcd.print(10,0,":");
lcd.print(11,0,(timeMinutes%60)/10);
lcd.print(12,0,timeMinutes%10);
lcd.print(13,0,":");
lcd.print(14,0,(timeSecands%60)/10);
lcd.print(15,0,timeSecands%10);
}
void boardTemp()
{
Fahrenheit = dht.readTemperature(true);
Blynk.virtualWrite(7, Fahrenheit);
}
void updateEEPROM()
{
EEPROMWriteint(0,balanceWatt);
Blynk.virtualWrite(4, (int)balanceWatt);
}
void EEPROMWriteint(int address, int value)
{
// Decomposition from a long to 2 bytes by using bitshift.
// One = Most significant -> Four = Least significant byte
byte two = (value & 0xFF);
byte one = ((value >> 8) & 0xFF);
// Write the 2 bytes into the eeprom memory.
EEPROM.write(address, two);
EEPROM.write(address + 1, one);
}
int EEPROMReadint(int address)
{
// Read the 2 bytes from the eeprom memory.
long two = EEPROM.read(address);
long one = EEPROM.read(address + 1);
// Return the recomposed long by using bitshift.
return ((two << 0) & 0xFF) + ((one << 8) & 0xFFFF);
}