#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define ANALOG_IN_PIN A0
const float maxVoltage = 28.8;
const float minVoltage = 23.9;
float adc_voltage = 0.0;
float in_voltage = 0.0;
float R1 = 30000.0 + 412912.91;
float R2 = 7500.0;
float ref_voltage = 5.0;
int adc_value = 0;
Adafruit_SSD1306 display(128, 64, &Wire, -1);
class RGBLed {
public:
RGBLed(int redPin, int greenPin, int bluePin) :
_redpin(redPin), _greenpin(greenPin), _bluepin(bluePin) {}
void write(float red, float green, float blue) {
float mappedRed = map(red, 0.0, 1.0, 0.0, 0.39);
float mappedGreen = map(green, 0.0, 1.0, 0.7, 1.0);
float mappedBlue = map(blue, 0.0, 1.0, 0.4, 0.69);
analogWrite(_redpin, mappedRed * 255);
analogWrite(_greenpin, mappedGreen * 255);
analogWrite(_bluepin, mappedBlue * 255);
}
private:
int _redpin;
int _greenpin;
int _bluepin;
};
RGBLed myRGBled(9, 10, 11);
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Voltage:");
display.display();
}
void loop() {
adc_value = analogRead(ANALOG_IN_PIN);
adc_voltage = (adc_value * ref_voltage) / 1023.0;
in_voltage = adc_voltage / (R2 / (R1 + R2));
float percentage = map(in_voltage, minVoltage, maxVoltage, 0, 100);
if (percentage >= 70) {
myRGBled.write(0.0, 1.0, 0.0); // Green
} else if (percentage >= 40) {
myRGBled.write(1.0, 1.0, 0.0); // Yellow
} else if (percentage >= 10) {
myRGBled.write(1.0, 0.0, 0.0); // Red
} else {
for (int i = 0; i < 5; i++) {
myRGBled.write(1.0, 0.0, 0.0); // Blinking red
delay(500);
myRGBled.write(0.0, 0.0, 0.0);
delay(500);
}
}
display.setCursor(0, 10);
display.println(in_voltage, 2);
display.display();
display.setTextSize(0.5);
display.setTextColor(WHITE);
display.setCursor(100, 0);
display.print(percentage, 1);
display.print("%");
display.display();
delay(1000);
}