#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define VOLTAGE_PIN A0
#define RED_LED_PIN 2
#define GREEN_LED_PIN 3
// Define battery icon parameters
#define BATTERY_WIDTH 110
#define BATTERY_HEIGHT 26
#define BATTERY_X 0
#define BATTERY_Y 6
#define BATTERY_MARGIN 4
#define BATTERY_SEGMENT_HEIGHT 18
// Function prototype
void drawBatteryIcon(int percentage);
void setup() {
Serial.begin(9600);
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("failed"));
for(;;);
}
display.display();
delay(500);
display.clearDisplay();
}
void loop() {
int sensorValue = analogRead(VOLTAGE_PIN);
float voltage = sensorValue * (4.2 / 1023.0);
int percentage;
if (voltage <= 0) { // Lower Voltage Value
percentage = 0;
} else if (voltage >= 4.2) { // Upper Voltage Value
percentage = 100;
} else {
percentage = map(voltage * 1000, 500, 4500, 0, 100);
}
if (percentage <= 25) {
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(GREEN_LED_PIN, LOW);
} else if (percentage >= 26 && percentage <= 100) {
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, HIGH);
} else {
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
}
display.clearDisplay();
drawBatteryIcon(percentage);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setRotation(1); // Rotate text 90 degrees clockwise
display.setCursor(6,0); // Set cursor position for the percentage value
display.print(percentage);
display.print("%");
display.display();
delay(500);
}
// Function to draw battery icon with capacity bars
void drawBatteryIcon(int percentage) {
// Rotate the display content 90 degrees clockwise
display.setRotation(0);
// Draw battery outline
display.drawRect(BATTERY_X, BATTERY_Y, BATTERY_WIDTH, BATTERY_HEIGHT, SSD1306_WHITE);
// Calculate number of bars based on percentage
int numBars = map(percentage, 0, 100, 0, 10);
// Draw capacity bars
for (int i = 0; i < numBars; i++) {
int barX = BATTERY_X + BATTERY_MARGIN + i * (BATTERY_WIDTH - 2 * BATTERY_MARGIN) / 10;
int barY = BATTERY_Y + BATTERY_MARGIN;
display.fillRect(barX, barY, (BATTERY_WIDTH - 2 * BATTERY_MARGIN) / 10, BATTERY_SEGMENT_HEIGHT, SSD1306_WHITE);
}
}