#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "ACS712.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define BATTERY_PIN A0
#define BATTERY_PIN2 A2
#define BATTERY_PIN3 A6
ACS712 ACS(A1, 5.0, 1023, 66);
ACS712 ACS2(A3, 5.0, 1023, 66);
ACS712 ACS3(A7, 5.0, 1023, 66);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
int previousBatteryLevel = 0;
int previousBatteryLevel2 = 0;
int previousBatteryLevel3 = 0;
int batteryLevel;
int batteryLevel2;
int batteryLevel3;
int batteryPercentage;
int batteryPercentage2;
int batteryPercentage3;
float mA;
float mA2;
float mA3;
float maxv;
float minv;
float minvc;
float batchg;
float batchg2;
float batchg3;
const int blinkInterval = 100;
//bool isCelsius = true;
bool isBlinkVisible = true;
unsigned long lastBlinkMillis = 0;
void setup() {
Serial.begin(115200);
pinMode(BATTERY_PIN, INPUT);
pinMode(BATTERY_PIN2, INPUT);
pinMode(BATTERY_PIN3, INPUT);
pinMode(13, INPUT_PULLUP); //select li-ion/nimh
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
ACS.autoMidPoint();
ACS2.autoMidPoint();
ACS3.autoMidPoint();
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(2000);
display.clearDisplay(); // Clear the display on startup
display.display(); // Show the cleared display
}
void loop()
{
// lithium charger
if(digitalRead(13)==0)
{
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
display.clearDisplay(); // Clear the display before updating
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(15, 0);
display.setTextSize(1);
display.print("lithium Battery");
display.drawRect(0, 11, 128, 53, SSD1306_WHITE);
display.drawLine(43, 11, 43, 64, SSD1306_WHITE);
display.drawLine(85, 11, 85, 64, SSD1306_WHITE);
maxv=4.2;
minv=2.5;
minvc=0.2;
batchg=0.1;
int maxvanalog= ((1023/5)*maxv);
int minvanalog= ((1023/5)*minv);
batteryLevel = analogRead(BATTERY_PIN);
batteryPercentage = map(batteryLevel, minvanalog, maxvanalog, 0, 100);
float voltage1 = batteryLevel/204.6;
display.setCursor(4, 45);
display.setTextSize(.5);
display.print(voltage1);
display.print("V");
mA = ACS.mA_DC()/1000;
display.setCursor(4, 55);
display.print(mA);
display.print("A");
if (mA>=batchg)
{
digitalWrite(8, HIGH);
if (millis() - lastBlinkMillis >= blinkInterval)
{
isBlinkVisible = !isBlinkVisible;
lastBlinkMillis = millis();
}
if (isBlinkVisible)
{
digitalWrite(8, HIGH);
}
else
{
digitalWrite(8, LOW);
}
}
else
{
digitalWrite(8, LOW);
}
if ((voltage1 >=minvc) && (voltage1<= maxv))
{
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
}
else
{
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
}
int batteryHeight = map(batteryPercentage, 0, 100, 0, 18);
int batteryX = SCREEN_WIDTH - 113;
int batteryY = 20;
int batteryWidth = 13;
int batteryTopHeight = 2;
int batteryBottomHeight = 20;
display.drawRect(batteryX, batteryY + batteryTopHeight, batteryWidth, batteryBottomHeight, SSD1306_WHITE);
int batteryFillHeight = map(batteryPercentage, 0, 100, 0, batteryBottomHeight);
batteryFillHeight = min(batteryFillHeight, batteryBottomHeight);
display.fillRect(batteryX + 1, batteryY + batteryTopHeight + (batteryBottomHeight - batteryFillHeight), batteryWidth - 2, batteryFillHeight, SSD1306_WHITE);
if (batteryPercentage<0)
{
display.setCursor(15, 13);
display.print(String("0") + "%");
}
else
{
if (batteryPercentage>100)
{
display.setCursor(15, 13);
display.print(String("100") + "%");
}
else
{
if (batteryPercentage<101)
{
display.setCursor(15, 13);
display.print(String(batteryPercentage) + "%");
}
else
{
display.setCursor(15, 13);
display.print(String("0") + "%");
}
}
}
batteryLevel2 = analogRead(BATTERY_PIN2);
batteryPercentage2 = map(batteryLevel2, minvanalog, maxvanalog, 0, 100);
float voltage2 = batteryLevel2/204.6;
display.setCursor(48, 45);
display.print(voltage2);
display.print(" V");
mA2 = ACS2.mA_DC()/1000;
display.setCursor(48, 55);
display.print(mA2);
display.print(" A");
if (mA2>=batchg)
{
digitalWrite(5, HIGH);
if (millis() - lastBlinkMillis >= blinkInterval)
{
isBlinkVisible = !isBlinkVisible;
lastBlinkMillis = millis();
}
if (isBlinkVisible)
{
digitalWrite(5, HIGH);
}
else
{
digitalWrite(5, LOW);
}
}
else
{
digitalWrite(5, LOW);
}
if ((voltage2 >=minvc) && (voltage2<= maxv))
{
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
}
else
{
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
}
int batteryHeight2 = map(batteryPercentage2, 0, 100, 0, 18);
int batteryX2 = SCREEN_WIDTH - 70;
int batteryY2 = 20;
int batteryWidth2 = 13;
int batteryTopHeight2 = 2;
int batteryBottomHeight2 = 20;
display.drawRect(batteryX2, batteryY2 + batteryTopHeight2, batteryWidth2, batteryBottomHeight2, SSD1306_WHITE);
int batteryFillHeight2 = map(batteryPercentage2, 0, 100, 0, batteryBottomHeight2);
batteryFillHeight2 = min(batteryFillHeight2, batteryBottomHeight2);
display.fillRect(batteryX2 + 1, batteryY2 + batteryTopHeight2 + (batteryBottomHeight2 - batteryFillHeight2), batteryWidth2 - 2, batteryFillHeight2, SSD1306_WHITE);
if (batteryPercentage2<0)
{
display.setCursor(58, 13);
display.print(String("0") + "%");
}
else
{
if (batteryPercentage2>100)
{
display.setCursor(58, 13);
display.print(String("100") + "%");
}
else
{
if (batteryPercentage2<101)
{
display.setCursor(58, 13);
display.print(String(batteryPercentage2) + "%");
}
else
{
display.setCursor(58, 13);
display.print(String("0") + "%");
}
}
}
batteryLevel3 = analogRead(BATTERY_PIN3);
batteryPercentage3 = map(batteryLevel3, minvanalog, maxvanalog, 0, 100);
float voltage3 = batteryLevel3/204.6;
display.setCursor(90, 45);
display.print(voltage3);
display.print(" V");
mA3 = ACS3.mA_DC()/1000;
display.setCursor(90, 55);
display.print(mA3);
display.print(" A");
if (mA3>=batchg)
{
digitalWrite(2, HIGH);
if (millis() - lastBlinkMillis >= blinkInterval)
{
isBlinkVisible = !isBlinkVisible;
lastBlinkMillis = millis();
}
if (isBlinkVisible)
{
digitalWrite(2, HIGH);
}
else
{
digitalWrite(2, LOW);
}
}
else
{
digitalWrite(2, LOW);
}
if ((voltage3 >=minvc) && (voltage3<= maxv))
{
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
else
{
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
}
int batteryHeight3 = map(batteryPercentage3, 0, 100, 0, 18);
int batteryX3 = SCREEN_WIDTH - 27;
int batteryY3 = 20;
int batteryWidth3 = 13;
int batteryTopHeight3 = 2;
int batteryBottomHeight3 = 20;
display.drawRect(batteryX3, batteryY3 + batteryTopHeight3, batteryWidth3, batteryBottomHeight3, SSD1306_WHITE);
int batteryFillHeight3 = map(batteryPercentage3, 0, 100, 0, batteryBottomHeight3);
batteryFillHeight3 = min(batteryFillHeight3, batteryBottomHeight3);
display.fillRect(batteryX3 + 1, batteryY3 + batteryTopHeight3 + (batteryBottomHeight3 - batteryFillHeight3), batteryWidth3 - 2, batteryFillHeight3, SSD1306_WHITE);
if (batteryPercentage3<0)
{
display.setCursor(100, 13);
display.print(String("0") + "%");
}
else{
if (batteryPercentage3>100)
{
display.setCursor(100, 13);
display.print(String("100") + "%");
}
else
{
if (batteryPercentage3<101)
{
display.setCursor(100, 13);
display.print(String(batteryPercentage3) + "%");
}
else
{
display.setCursor(100, 13);
display.print(String("0") + "%");
}
}
}
display.display(); // Show the updated display
previousBatteryLevel = batteryLevel;
delay(2000);
}
// Nimh code
else
{
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
display.clearDisplay(); // Clear the display before updating
display.setTextColor(WHITE);
display.setCursor(25, 0);
display.setTextSize(1);
display.print("NiMH Battery");
display.drawRect(0, 11, 128, 53, SSD1306_WHITE);
display.drawLine(43, 11, 43, 64, SSD1306_WHITE);
display.drawLine(85, 11, 85, 64, SSD1306_WHITE);
maxv=1.5;
minv=0.8;
minvc=0.2;
batchg=0.1;
int maxvanalog= ((1023/5)*maxv);
int minvanalog= ((1023/5)*minv);
batteryLevel = analogRead(BATTERY_PIN);
batteryPercentage = map(batteryLevel, minvanalog, maxvanalog, 0, 100);
float voltage1 = batteryLevel/204.6;
display.setCursor(4, 45);
display.setTextSize(.5);
display.print(voltage1);
display.print(" V");
mA = ACS.mA_DC()/1000;
display.setCursor(4, 55);
display.print(mA);
display.print(" A");
if (mA>=batchg)
{
digitalWrite(8, HIGH);
if (millis() - lastBlinkMillis >= blinkInterval)
{
isBlinkVisible = !isBlinkVisible;
lastBlinkMillis = millis();
}
if (isBlinkVisible)
{
digitalWrite(8, HIGH);
}
else
{
digitalWrite(8, LOW);
}
}
else
{
digitalWrite(8, LOW);
}
if ((voltage1 >=minvc) && (voltage1<= maxv))
{
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
}
else
{
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
}
int batteryHeight = map(batteryPercentage, 0, 100, 0, 18);
int batteryX = SCREEN_WIDTH - 113;
int batteryY = 20;
int batteryWidth = 13;
int batteryTopHeight = 2;
int batteryBottomHeight = 20;
display.drawRect(batteryX, batteryY + batteryTopHeight, batteryWidth, batteryBottomHeight, SSD1306_WHITE);
int batteryFillHeight = map(batteryPercentage, 0, 100, 0, batteryBottomHeight);
batteryFillHeight = min(batteryFillHeight, batteryBottomHeight);
display.fillRect(batteryX + 1, batteryY + batteryTopHeight + (batteryBottomHeight - batteryFillHeight), batteryWidth - 2, batteryFillHeight, SSD1306_WHITE);
if (batteryPercentage<0)
{
display.setCursor(15, 13);
display.print(String("0") + "%");
}
else
{
if (batteryPercentage>100)
{
display.setCursor(15, 13);
display.print(String("100") + "%");
}
else
{
if (batteryPercentage<101)
{
display.setCursor(15, 13);
display.print(String(batteryPercentage) + "%");
}
else
{
display.setCursor(15, 13);
display.print(String("0") + "%");
}
}
}
batteryLevel2 = analogRead(BATTERY_PIN2);
batteryPercentage2 = map(batteryLevel2, minvanalog, maxvanalog, 0, 100);
float voltage2 = batteryLevel2/204.6;
display.setCursor(48, 45);
display.print(voltage2);
display.print(" V");
mA2 = ACS2.mA_DC()/1000;
display.setCursor(48, 55);
display.print(mA2);
display.print(" A");
if (mA2>=batchg)
{
digitalWrite(5, HIGH);
if (millis() - lastBlinkMillis >= blinkInterval)
{
isBlinkVisible = !isBlinkVisible;
lastBlinkMillis = millis();
}
if (isBlinkVisible)
{
digitalWrite(5, HIGH);
}
else
{
digitalWrite(5, LOW);
}
}
else
{
digitalWrite(5, LOW);
}
if ((voltage2 >=minvc) && (voltage2<= maxv))
{
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
}
else
{
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
}
int batteryHeight2 = map(batteryPercentage2, 0, 100, 0, 18);
int batteryX2 = SCREEN_WIDTH - 70;
int batteryY2 = 20;
int batteryWidth2 = 13;
int batteryTopHeight2 = 2;
int batteryBottomHeight2 = 20;
display.drawRect(batteryX2, batteryY2 + batteryTopHeight2, batteryWidth2, batteryBottomHeight2, SSD1306_WHITE);
int batteryFillHeight2 = map(batteryPercentage2, 0, 100, 0, batteryBottomHeight2);
batteryFillHeight2 = min(batteryFillHeight2, batteryBottomHeight2);
display.fillRect(batteryX2 + 1, batteryY2 + batteryTopHeight2 + (batteryBottomHeight2 - batteryFillHeight2), batteryWidth2 - 2, batteryFillHeight2, SSD1306_WHITE);
if (batteryPercentage2<0)
{
display.setCursor(58, 13);
display.print(String("0") + "%");
}
else
{
if (batteryPercentage2>100)
{
display.setCursor(58, 13);
display.print(String("100") + "%");
}
else
{
if (batteryPercentage2<101)
{
display.setCursor(58, 13);
display.print(String(batteryPercentage2) + "%");
}
else
{
display.setCursor(58, 13);
display.print(String("0") + "%");
}
}
}
batteryLevel3 = analogRead(BATTERY_PIN3);
batteryPercentage3 = map(batteryLevel3, minvanalog, maxvanalog, 0, 100);
float voltage3 = batteryLevel3/204.6;
display.setCursor(90, 45);
display.print(voltage3);
display.print(" V");
mA3 = ACS3.mA_DC()/1000;
display.setCursor(90, 55);
display.print(mA3);
display.print(" A");
if (mA3>=batchg)
{
digitalWrite(2, HIGH);
if (millis() - lastBlinkMillis >= blinkInterval)
{
isBlinkVisible = !isBlinkVisible;
lastBlinkMillis = millis();
}
if (isBlinkVisible)
{
digitalWrite(2, HIGH);
}
else
{
digitalWrite(2, LOW);
}
}
else
{
digitalWrite(2, LOW);
}
if ((voltage3 >=minvc) && (voltage3<= maxv))
{
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
else
{
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
}
int batteryHeight3 = map(batteryPercentage3, 0, 100, 0, 18);
int batteryX3 = SCREEN_WIDTH - 27;
int batteryY3 = 20;
int batteryWidth3 = 13;
int batteryTopHeight3 = 2;
int batteryBottomHeight3 = 20;
display.drawRect(batteryX3, batteryY3 + batteryTopHeight3, batteryWidth3, batteryBottomHeight3, SSD1306_WHITE);
int batteryFillHeight3 = map(batteryPercentage3, 0, 100, 0, batteryBottomHeight3);
batteryFillHeight3 = min(batteryFillHeight3, batteryBottomHeight3);
display.fillRect(batteryX3 + 1, batteryY3 + batteryTopHeight3 + (batteryBottomHeight3 - batteryFillHeight3), batteryWidth3 - 2, batteryFillHeight3, SSD1306_WHITE);
if (batteryPercentage3<0)
{
display.setCursor(100, 13);
display.print(String("0") + "%");
}
else{
if (batteryPercentage3>100)
{
display.setCursor(100, 13);
display.print(String("100") + "%");
}
else
{
if (batteryPercentage3<101)
{
display.setCursor(100, 13);
display.print(String(batteryPercentage3) + "%");
}
else
{
display.setCursor(100, 13);
display.print(String("0") + "%");
}
}
}
display.display(); // Show the updated display
previousBatteryLevel = batteryLevel;
delay(2000);
}
}