// Very simple Arduino Lithium-ion battery capacity
#include <LiquidCrystal_I2C.h>
#define LED 13
#define rele 8
#define resistor 24
LiquidCrystal_I2C lcd(0x27,16,2);
float capacity=0, value,voltage,current, time=0;
int min;
void measure (void) {
value= analogRead(0);
voltage=value/1024*5.0;
current = voltage/resistor;
capacity=capacity+current/3600;
time++;
Serial.print("Voltage= ");
Serial.print(voltage);
Serial.print("V Current= ");
Serial.print(current);
Serial.print("A Capacity= ");
Serial.print(capacity);
Serial.print("Ah ");
Serial.print("Discharging time= ");
Serial.print(time);
Serial.print("s ");
Serial.print("\n");
}
boolean x=false;
ISR(TIMER1_OVF_vect) {
TCNT1=0x0BDC;
x=!x;
measure();
};
void setup() {
pinMode(LED, OUTPUT);
TIMSK1=0x01; // enabled global and timer overflow interrupt;
TCCR1A = 0x00; // normal operation page 148 (mode0);
TCNT1=0x0BDC; // set initial value to remove time error (16bit counter register)
TCCR1B = 0x04; // start timer/ set clock
Serial.begin(115200);
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("V= Ah=");
lcd.setCursor(0,1);
lcd.print("A= T=");
pinMode(rele, OUTPUT);
};
void loop () {
digitalWrite(LED, x);
// lcd.print("volt=");
lcd.setCursor(2,0);
lcd.print(voltage);
lcd.setCursor(10,0);
lcd.print(capacity);
lcd.setCursor(2,1);
lcd.print(current);
min=time/60;
lcd.setCursor(9,1);
lcd.print(min);
if (voltage>=2.5) digitalWrite(rele, HIGH);
if (voltage<=2.5) digitalWrite(rele, LOW);
};