#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Initialize the LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Define analog pins for voltage and current inputs
const int mainsVoltagePin = A0;
const int outputVoltagePin = A1;
const int batteryVoltagePin = A2;
const int mainsCurrentPin = A3; // Add a current sensor
const int loadCurrentPin = A7; // Add a current sensor for load
const int batteryCurrentPin = A6; // Add a current sensor for battery
// Voltage divider and current sensor constants (example values)
const float mainsVoltageDividerRatio = 40.0; // Adjust based on your divider
const float outputVoltageDividerRatio = 10.0; // Adjust based on your divider
const float batteryVoltageDividerRatio = 2.0; // Adjust based on your divider
const float currentSensorSensitivity = 0.185; // Sensitivity for ACS712-5A in V/A
// Time interval for automatic sliding
unsigned long previousMillis = 0;
const long interval = 8000; // 8 seconds
int displayState = 0; // 0: Mains, 1: Output, 2: Battery
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Inverter Monitor");
delay(2000);
lcd.clear();
}
void loop() {
unsigned long currentMillis = millis();
// Continuously update the displayed values in real-time
updateValues();
// Slide to the next display after the interval
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
displayState = (displayState + 1) % 3; // Cycle through 0, 1, 2
}
}
void updateValues() {
switch (displayState) {
case 0:
displayMains();
break;
case 1:
displayOutput();
break;
case 2:
displayBattery();
break;
}
}
void displayMains() {
// Read and calculate mains voltage
float mainsVoltage = analogRead(mainsVoltagePin) * (5.0 / 1023.0) * mainsVoltageDividerRatio;
// Read and calculate mains current
float mainsCurrent = (analogRead(mainsCurrentPin) * (5.0 / 1023.0) - 2.5) / currentSensorSensitivity;
// Calculate mains power in watts
float mainsPower = mainsVoltage * mainsCurrent;
// Display mains ON/OFF status and voltage, current, power
lcd.setCursor(0, 0);
if (mainsVoltage > 180) { // Assuming 200V as a threshold for mains being ON
lcd.print("Mains ON ");
} else {
lcd.print("Mains OFF ");
}
lcd.setCursor(0, 1);
lcd.print("Voltage: ");
lcd.print(mainsVoltage);
lcd.print("V ");
lcd.setCursor(0, 2);
lcd.print("Current: ");
lcd.print(mainsCurrent);
lcd.print("A ");
lcd.setCursor(0, 3);
lcd.print("Power: ");
lcd.print(mainsPower);
lcd.print("W ");
}
void displayOutput() {
// Read and calculate output voltage
float outputVoltage = analogRead(outputVoltagePin) * (5.0 / 1023.0) * outputVoltageDividerRatio;
// Read and calculate load current
float loadCurrent = (analogRead(loadCurrentPin) * (5.0 / 1023.0) - 2.5) / currentSensorSensitivity;
// Calculate output power in watts
float outputPower = outputVoltage * loadCurrent;
// Display output voltage, load current, and power
lcd.setCursor(0, 0);
lcd.print("Output Status ");
lcd.setCursor(0, 1);
lcd.print("Voltage: ");
lcd.print(outputVoltage);
lcd.print("V ");
lcd.setCursor(0, 2);
lcd.print("Load: ");
lcd.print(loadCurrent);
lcd.print("A ");
lcd.setCursor(0, 3);
lcd.print("Power: ");
lcd.print(outputPower);
lcd.print("W ");
}
void displayBattery() {
// Read and calculate battery voltage
float batteryVoltage = analogRead(batteryVoltagePin) * (10.0 / 1023.0) * batteryVoltageDividerRatio;
// Read and calculate battery current
float batteryCurrent = (analogRead(batteryCurrentPin) * (5.0 / 1023.0) - 2.5) / currentSensorSensitivity;
// Estimate battery percentage
float batteryPercentage = (batteryVoltage - 10.5) / (12.6 - 10.5) * 100; // Adjust these values as per your battery's full and empty voltages
// Estimate backup time in hours and minutes
float backupTimeHours = estimateBackupTime(batteryVoltage, batteryCurrent);
int backupTimeMinutes = int((backupTimeHours - int(backupTimeHours)) * 60);
// Display battery status
lcd.setCursor(0, 0);
if (analogRead(mainsVoltagePin) * (5.0 / 1023.0) * mainsVoltageDividerRatio > 180) {
lcd.print("Charging ON ");
} else {
lcd.print("Inverter ON ");
}
lcd.setCursor(0, 1);
lcd.print("Voltage: ");
lcd.print(batteryVoltage);
lcd.print("V ");
lcd.setCursor(0, 2);
lcd.print("Battery: ");
lcd.print(batteryPercentage);
lcd.print("% ");
lcd.setCursor(0, 3);
lcd.print("Backup: ");
lcd.print(int(backupTimeHours));
lcd.print(":");
if (backupTimeMinutes < 10) lcd.print("0");
lcd.print(backupTimeMinutes);
lcd.print("hr ");
}
float estimateBackupTime(float batteryVoltage, float batteryCurrent) {
// Placeholder function to estimate backup time based on battery voltage and current
// You would need to calculate this based on your battery's discharge profile and load
float batteryCapacity = 150; // Example battery capacity in Ah
float remainingCapacity = (batteryVoltage - 10.5) * (batteryCapacity / 10); // Adjust formula as needed
return remainingCapacity / batteryCurrent; // Returns time in hours
}