#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
char battvoltage[7]; //Store voltage value in string
char battpercent[7]; //Store percentage value in string
float battV = 0; //battery voltage Read A0
float bpc = 0; //battery percentage Read A1
int batC = 0; //battery percentage
int t1 = 700; //refresh rate
byte Battcap[8] = {B11110, B00010, B00011, B00001, B00001, B00011, B00010, B11110};
byte Battwall[8] = {B11111, B00000, B00000, B00000, B00000, B00000, B00000, B11111};
byte Batthalf[8] = {B11111, B11100, B11100, B11100, B11100, B11100, B11100, B11111};
byte Battfull[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111}; //Battery Icon Characters
byte Battcapfull[8] = {B11110, B11110, B11111, B11111, B11111, B11111, B11110, B11110};
byte Battcaphalf[8] = {B11110, B11010, B11011, B11001, B11001, B11011, B11010, B11110};
byte Battbot[8] = {B11111, B10000, B10000, B10000, B10000, B10000, B10000, B11111};
void setup()
{
lcd.init();
lcd.backlight();
lcd.clear();
lcd.createChar(1, Battcap);
lcd.createChar(2, Battwall);
lcd.createChar(3, Batthalf);
lcd.createChar(4, Battfull); //Create Batt Icon Images
lcd.createChar(5, Battcapfull);
lcd.createChar(6, Battcaphalf);
lcd.createChar(7, Battbot);
pinMode(A0,INPUT); //we will use analog pin 0 to read voltage from 1s li-ion battery
pinMode(A1,INPUT); //we will use analog pin 1 for percentage reference
//Connect A0 & A1 to battery positive terminal
}
void loop()
{
lcd_update();
delay (t1);
}
void lcd_update()
{
battV = (analogRead(A0)*5.00)/1024; //figure out the battery voltage (make sure arduino 5V pin are set to exactly 5.00V on your step-up module)
bpc = analogRead (A1); //figure out analog value for current batt voltage to display in percent
batC = map(bpc, 613, 840, 0,100); //Convert voltage analog value to percent value
if(batC > 100)batC=100; //Set the max treshold of 100%
if(batC < 0)batC=0; //Set the min treshold of 0%
//To avoid percentage reading going higer than 100% eg: 101% or lower like -1%
dtostrf(battV, 2,2, battvoltage); //Convert float voltage value to string
dtostrf(batC, 3,0, battpercent); //Convert float percentage value to string
lcd.setCursor(5,0); //Display the title on top left
lcd.print ("Vo:");
lcd.setCursor(8,0); //Display the voltage on top right
lcd.print (battvoltage);
lcd.print ("v");
if (batC < 12) //Displaying the battery icon bar based on batter percentage on bottom left
{
lcd.setCursor(5,1);
lcd.write(7);
lcd.write(2);
lcd.write(2);
lcd.write(1);
}
if (batC == 12)
{
lcd.setCursor(5,1);
lcd.write(3);
lcd.write(2);
lcd.write(2);
lcd.write(1);
}
if (batC > 12)
{
lcd.setCursor(5,1);
lcd.write(3);
lcd.write(2);
lcd.write(2);
lcd.write(1);
}
if (batC == 25)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(2);
lcd.write(2);
lcd.write(1);
}
if (batC > 25)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(2);
lcd.write(2);
lcd.write(1);
}
if (batC == 36)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(3);
lcd.write(2);
lcd.write(1);
}
if (batC > 36)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(3);
lcd.write(2);
lcd.write(1);
}
if (batC == 50)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(4);
lcd.write(2);
lcd.write(1);
}
if (batC > 50)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(4);
lcd.write(2);
lcd.write(1);
}
if (batC == 60)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(4);
lcd.write(3);
lcd.write(1);
}
if (batC > 60)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(4);
lcd.write(3);
lcd.write(1);
}
if (batC == 75)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(4);
lcd.write(4);
lcd.write(1);
}
if (batC > 75)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(4);
lcd.write(4);
lcd.write(1);
}
if (batC == 84)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(4);
lcd.write(4);
lcd.write(6);
}
if (batC > 84)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(4);
lcd.write(4);
lcd.write(6);
}
if (batC == 97)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(4);
lcd.write(4);
lcd.write(5);
}
if (batC > 97)
{
lcd.setCursor(5,1);
lcd.write(4);
lcd.write(4);
lcd.write(4);
lcd.write(5);
}
lcd.setCursor(9,1); //Display the percentage on bottom right
lcd.print(battpercent);
lcd.print("%");
}