//-------------------------------------- LCD --------------------------------------
// include the library code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
// Initialize the library with the I2C address (usually 0x27 or 0x3F)
LiquidCrystal_I2C lcd(0x27, 20, 4); // 20 columns and 4 rows
//-------------------------------------- VOLTAGE SENSORS --------------------------------------
const int Solar_Sen_Pin = A0;
const int Grid_Sen_Pin = A1;
const int Battery_Sen_Pin = A2;
int Solar_Val;
int Grid_Val;
int Battery_Val;
float Solar_Volts;
float Grid_Volts;
float Battery_Volts;
//-------------------------------------- RELAYS --------------------------------------
const int Relay_Solar = 23;
const int Relay_Grid = 25;
const int Relay_Gnd = 27;
const int Relay_Battery = 29;
const int Relay_BatteryN = 31;
const int Relay_High = 33;
const int Relay_Normal = 35;
const int Relay_Low = 37;
//-------------------------------------- BUTTONS --------------------------------------
const int Button_PH = 2;
const int Button_B40 = 3;
int ButtonState_PH;
int ButtonState_B40;
//-------------------------------------- BLUETOOTH --------------------------------------
char Blue_Val = 0; //Variable for storing Incoming_value
void setup()
{
Serial.begin(9600); // Initialize serial communications
//-------------------------------------- LCD --------------------------------------
lcd.init(); // Initialize the LCD
lcd.backlight(); // Turn on the backlight
lcd.clear(); // Clear the LCD
// set the cursor position:
lcd.setCursor(0,0);
// Print a message to the LCD.
lcd.print("SMART HYBRID");
// set the cursor position:
lcd.setCursor(0,1);
// Print a message to the LCD.
lcd.print("ENERGY MANAGEMENT");
// set the cursor position:
lcd.setCursor(0,2);
// Print a message to the LCD.
lcd.print("SYSTEM USING");
// set the cursor position:
lcd.setCursor(0,3);
// Print a message to the LCD.
lcd.print("ARDUINO");
delay(5000);
lcd.clear();
lcd.setCursor(0,0);
// Print a message to the LCD.
lcd.print("DESIGNED BY:");
lcd.setCursor(0,1);
// Print a message to the LCD.
lcd.print("NIKHIL TP");
// set the cursor position:
lcd.setCursor(0,2);
// Print a message to the LCD.
lcd.print("AND");
// set the cursor position:
lcd.setCursor(0,3);
// Print a message to the LCD.
lcd.print("VISHNU PAVITHRAN K");
delay(5000);
lcd.clear();
//-------------------------------------- VOLTAGE SENSORS --------------------------------------
pinMode(Solar_Sen_Pin,INPUT);
pinMode(Grid_Sen_Pin,INPUT);
pinMode(Battery_Sen_Pin,INPUT);
//-------------------------------------- RELAYS --------------------------------------
pinMode(Relay_Solar,OUTPUT);
pinMode(Relay_Grid,OUTPUT);
pinMode(Relay_Gnd,OUTPUT);
pinMode(Relay_Battery,OUTPUT);
pinMode(Relay_BatteryN,OUTPUT);
pinMode(Relay_High,OUTPUT);
pinMode(Relay_Normal,OUTPUT);
pinMode(Relay_Low,OUTPUT);
//initially Turn Off the Relays
digitalWrite(Relay_Solar, LOW);
digitalWrite(Relay_Grid, LOW);
digitalWrite(Relay_Gnd, LOW);
digitalWrite(Relay_Battery, LOW);
digitalWrite(Relay_BatteryN, LOW);
digitalWrite(Relay_High, LOW);
digitalWrite(Relay_Normal, LOW);
digitalWrite(Relay_Low, LOW);
//-------------------------------------- BUTTONS --------------------------------------
pinMode(Button_PH,INPUT_PULLUP);
pinMode(Button_B40,INPUT_PULLUP);
//-------------------------------------- BLUETOOTH --------------------------------------
Serial1.begin(9600);
}
void loop()
{
//-------------------------------------- BLUETOOTH --------------------------------------
if(Serial1.available() > 0)
{
Blue_Val = Serial1.read(); //Read the incoming data and store it into variable Incoming_value
Serial.println(Blue_Val); //Print Value of Incoming_value in Serial monitor
}
//-------------------------------------- VOLTAGE SENSORS --------------------------------------
//--------------- Solar Voltage --------------
// read the input on analog pin:
Solar_Val = analogRead(Solar_Sen_Pin);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
Solar_Volts = (Solar_Val * 5.0) / 1023.0;
// print out the value you read:
Serial.print("Solar_Volts = ");
Serial.print(Solar_Volts);
// lcd.setCursor(0,0);
// // Print a message to the LCD.
// lcd.print("Solar = ");
// lcd.print(Solar_Volts);
// lcd.print("V ");
//--------------- Grid Voltage --------------
// read the input on analog pin:
Grid_Val = analogRead(Grid_Sen_Pin);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
Grid_Volts = (Grid_Val * 5.0) / 1023.0;
// print out the value you read:
Serial.print(" Grid_Volts = ");
Serial.print(Grid_Volts);
// lcd.setCursor(0,3);
// // Print a message to the LCD.
// lcd.print("Grid = ");
// lcd.print(Grid_Volts);
// lcd.print("V ");
//--------------- Battery Voltage --------------
// read the input on analog pin:
Battery_Val = analogRead(Battery_Sen_Pin);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
Battery_Volts = (Battery_Val * 5.0) / 1023.0;
// print out the value you read:
Serial.print(" Battery_Volts = ");
Serial.println(Battery_Volts);
// lcd.setCursor(0,2);
// // Print a message to the LCD.
// lcd.print("Battery = ");
// lcd.print(Battery_Volts);
// lcd.print("V ");
//-------------------------------------- BUTTONS --------------------------------------
// read the state of the pushbutton value:
ButtonState_PH = digitalRead(Button_PH);
ButtonState_B40 = digitalRead(Button_B40);
//-------------------------------------- CONDITIONS --------------------------------------
//------------------------------------------------------------------
//---------------- SOLAR ON, GRID ON, BATTERY ON -------------------
//------------------------------------------------------------------
if(Solar_Volts >= 2 && Grid_Volts >= 2 && Battery_Volts >= 2)
{
lcd.setCursor(0,0);
lcd.print("SYSTEM: SOLAR ");
lcd.setCursor(0,1);
lcd.print("S: ON G: ON B: ON ");
lcd.setCursor(0,2);
lcd.print(" ");
//OFF The Grid and Battery System
digitalWrite(Relay_Grid, LOW);
digitalWrite(Relay_Battery, LOW);
digitalWrite(Relay_BatteryN, LOW);
//ON The Solar System
digitalWrite(Relay_Solar, HIGH);
digitalWrite(Relay_Gnd, HIGH);
if(Blue_Val == '1')
{
digitalWrite(Relay_High, HIGH);
}
else if(Blue_Val == '2')
{
digitalWrite(Relay_Normal, HIGH);
}
else if(Blue_Val == '3')
{
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == '9')
{
digitalWrite(Relay_High, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == 'I')
{
digitalWrite(Relay_High, LOW);
digitalWrite(Relay_Normal, LOW);
digitalWrite(Relay_Low, LOW);
}
else
{
digitalWrite(Relay_High, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_Low, HIGH);
}
}
//------------------------------------------------------------------
//---------------- SOLAR ON, GRID ON, BATTERY OFF -------------------
//------------------------------------------------------------------
if(Solar_Volts >= 2 && Grid_Volts >= 2 && Battery_Volts < 2)
{
lcd.setCursor(0,0);
lcd.print("SYSTEM: SOLAR ");
lcd.setCursor(0,1);
lcd.print("S: ON G: ON B: OFF ");
lcd.setCursor(0,2);
lcd.print(" ");
//OFF The Grid and Battery System
digitalWrite(Relay_Grid, LOW);
digitalWrite(Relay_Battery, LOW);
digitalWrite(Relay_BatteryN, LOW);
//ON The Solar System
digitalWrite(Relay_Solar, HIGH);
digitalWrite(Relay_Gnd, HIGH);
if(Blue_Val == '1')
{
digitalWrite(Relay_High, HIGH);
}
else if(Blue_Val == '2')
{
digitalWrite(Relay_Normal, HIGH);
}
else if(Blue_Val == '3')
{
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == '9')
{
digitalWrite(Relay_High, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == 'I')
{
digitalWrite(Relay_High, LOW);
digitalWrite(Relay_Normal, LOW);
digitalWrite(Relay_Low, LOW);
}
else
{
digitalWrite(Relay_High, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_Low, HIGH);
}
}
//------------------------------------------------------------------
//---------------- SOLAR OFF, GRID ON, BATTERY ON -------------------
//------------------------------------------------------------------
if(Solar_Volts < 2 && Grid_Volts >= 2 && Battery_Volts >= 2)
{
lcd.setCursor(0,0);
lcd.print("SYSTEM: GRID ");
lcd.setCursor(0,1);
lcd.print("S: OFF G: ON B: ON ");
//OFF The Solar and Battery System
digitalWrite(Relay_Solar, LOW);
digitalWrite(Relay_Battery, LOW);
digitalWrite(Relay_BatteryN, LOW);
//ON The Grid System
digitalWrite(Relay_Grid, HIGH);
digitalWrite(Relay_Gnd, HIGH);
if(ButtonState_PH == 1)
{
lcd.setCursor(0,2);
lcd.print("Peak Hours: NO ");
if(Blue_Val == '1')
{
digitalWrite(Relay_High, HIGH);
}
else if(Blue_Val == '2')
{
digitalWrite(Relay_Normal, HIGH);
}
else if(Blue_Val == '3')
{
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == '9')
{
digitalWrite(Relay_High, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == 'I')
{
digitalWrite(Relay_High, LOW);
digitalWrite(Relay_Normal, LOW);
digitalWrite(Relay_Low, LOW);
}
else
{
digitalWrite(Relay_High, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_Low, HIGH);
}
}
if(ButtonState_PH == 0)
{
lcd.setCursor(0,2);
lcd.print("Peak Hours: YES ");
if(Blue_Val == '3')
{
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == '2')
{
digitalWrite(Relay_Normal, HIGH);
}
else if(Blue_Val == '9')
{
digitalWrite(Relay_Low, HIGH);
digitalWrite(Relay_Normal, HIGH);
}
else if(Blue_Val == 'I')
{
digitalWrite(Relay_High, LOW);
digitalWrite(Relay_Normal, LOW);
digitalWrite(Relay_Low, LOW);
}
else
{
digitalWrite(Relay_Low, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_High, LOW);
}
}
}
//------------------------------------------------------------------
//---------------- SOLAR OFF, GRID ON, BATTERY OFF -------------------
//------------------------------------------------------------------
if(Solar_Volts < 2 && Grid_Volts >= 2 && Battery_Volts < 2)
{
lcd.setCursor(0,0);
lcd.print("SYSTEM: GRID ");
lcd.setCursor(0,1);
lcd.print("S: OFF G: ON B: OFF ");
//OFF The Solar and Battery System
digitalWrite(Relay_Solar, LOW);
digitalWrite(Relay_Battery, LOW);
digitalWrite(Relay_BatteryN, LOW);
//ON The Grid System
digitalWrite(Relay_Grid, HIGH);
digitalWrite(Relay_Gnd, HIGH);
if(ButtonState_PH == 1)
{
lcd.setCursor(0,2);
lcd.print("Peak Hours: NO ");
if(Blue_Val == '1')
{
digitalWrite(Relay_High, HIGH);
}
else if(Blue_Val == '2')
{
digitalWrite(Relay_Normal, HIGH);
}
else if(Blue_Val == '3')
{
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == '9')
{
digitalWrite(Relay_High, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == 'I')
{
digitalWrite(Relay_High, LOW);
digitalWrite(Relay_Normal, LOW);
digitalWrite(Relay_Low, LOW);
}
else
{
digitalWrite(Relay_High, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_Low, HIGH);
}
}
if(ButtonState_PH == 0)
{
lcd.setCursor(0,2);
lcd.print("Peak Hours: YES ");
if(Blue_Val == '3')
{
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == '2')
{
digitalWrite(Relay_Normal, HIGH);
}
else if(Blue_Val == '9')
{
digitalWrite(Relay_Low, HIGH);
digitalWrite(Relay_Normal, HIGH);
}
else if(Blue_Val == 'I')
{
digitalWrite(Relay_High, LOW);
digitalWrite(Relay_Normal, LOW);
digitalWrite(Relay_Low, LOW);
}
else
{
digitalWrite(Relay_Low, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_High, LOW);
}
}
}
//------------------------------------------------------------------
//---------------- SOLAR OFF, GRID OFF, BATTERY ON -------------------
//------------------------------------------------------------------
if(Solar_Volts < 2 && Grid_Volts < 2 && Battery_Volts >= 2)
{
lcd.setCursor(0,0);
lcd.print("SYSTEM: BATTERY ");
lcd.setCursor(0,1);
lcd.print("S: OFF G: OFF B: ON ");
//OFF The Solar and Grid System
digitalWrite(Relay_Solar, LOW);
digitalWrite(Relay_Grid, LOW);
digitalWrite(Relay_Gnd, LOW);
//ON The Battery System
digitalWrite(Relay_Battery, HIGH);
digitalWrite(Relay_BatteryN, HIGH);
if(ButtonState_B40 == 0)
{
lcd.setCursor(0,2);
lcd.print("BATTERY > 40% ");
if(Blue_Val == '3')
{
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == '2')
{
digitalWrite(Relay_Normal, HIGH);
}
else if(Blue_Val == '9')
{
digitalWrite(Relay_Low, HIGH);
digitalWrite(Relay_Normal, HIGH);
}
else if(Blue_Val == 'I')
{
digitalWrite(Relay_High, LOW);
digitalWrite(Relay_Normal, LOW);
digitalWrite(Relay_Low, LOW);
}
else
{
digitalWrite(Relay_Low, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_High, LOW);
}
}
if(ButtonState_B40 == 1)
{
lcd.setCursor(0,2);
lcd.print("BATTERY < 40% ");
if(Blue_Val == '3')
{
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == '9')
{
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == 'I')
{
digitalWrite(Relay_High, LOW);
digitalWrite(Relay_Normal, LOW);
digitalWrite(Relay_Low, LOW);
}
else
{
digitalWrite(Relay_Low, HIGH);
digitalWrite(Relay_Normal, LOW);
digitalWrite(Relay_High, LOW);
}
}
}
//------------------------------------------------------------------
//---------------- SOLAR ON, GRID OFF, BATTERY ON -------------------
//------------------------------------------------------------------
if(Solar_Volts >= 2 && Grid_Volts < 2 && Battery_Volts >= 2)
{
lcd.setCursor(0,0);
lcd.print("SYSTEM: SOLAR ");
lcd.setCursor(0,1);
lcd.print("S: ON G: OFF B: ON ");
lcd.setCursor(0,2);
lcd.print(" ");
//OFF The Grid and Battery System
digitalWrite(Relay_Grid, LOW);
digitalWrite(Relay_Battery, LOW);
digitalWrite(Relay_BatteryN, LOW);
//ON The Solar System
digitalWrite(Relay_Solar, HIGH);
digitalWrite(Relay_Gnd, HIGH);
if(Blue_Val == '1')
{
digitalWrite(Relay_High, HIGH);
}
else if(Blue_Val == '2')
{
digitalWrite(Relay_Normal, HIGH);
}
else if(Blue_Val == '3')
{
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == '9')
{
digitalWrite(Relay_High, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == 'I')
{
digitalWrite(Relay_High, LOW);
digitalWrite(Relay_Normal, LOW);
digitalWrite(Relay_Low, LOW);
}
else
{
digitalWrite(Relay_High, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_Low, HIGH);
}
}
//------------------------------------------------------------------
//---------------- SOLAR ON, GRID OFF, BATTERY OFF -------------------
//------------------------------------------------------------------
if(Solar_Volts >= 2 && Grid_Volts < 2 && Battery_Volts < 2)
{
lcd.setCursor(0,0);
lcd.print("SYSTEM: SOLAR ");
lcd.setCursor(0,1);
lcd.print("S: ON G: OFF B: OFF ");
lcd.setCursor(0,2);
lcd.print(" ");
//OFF The Grid and Battery System
digitalWrite(Relay_Grid, LOW);
digitalWrite(Relay_Battery, LOW);
digitalWrite(Relay_BatteryN, LOW);
//ON The Solar System
digitalWrite(Relay_Solar, HIGH);
digitalWrite(Relay_Gnd, HIGH);
if(Blue_Val == '1')
{
digitalWrite(Relay_High, HIGH);
}
else if(Blue_Val == '2')
{
digitalWrite(Relay_Normal, HIGH);
}
else if(Blue_Val == '3')
{
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == '9')
{
digitalWrite(Relay_High, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_Low, HIGH);
}
else if(Blue_Val == 'I')
{
digitalWrite(Relay_High, LOW);
digitalWrite(Relay_Normal, LOW);
digitalWrite(Relay_Low, LOW);
}
else
{
digitalWrite(Relay_High, HIGH);
digitalWrite(Relay_Normal, HIGH);
digitalWrite(Relay_Low, HIGH);
}
}
//------------------------------------------------------------------
//---------------- SOLAR OFF, GRID OFF, BATTERY OFF -------------------
//------------------------------------------------------------------
if(Solar_Volts < 2 && Grid_Volts < 2 && Battery_Volts < 2)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("NO SOURCE AVAILABLE ");
}
}