//################################/ //####################################################################
//##############################/ //#################################################_________ #########
//#############################/ //=================================================//////////##########
//####################//Esp8266 Battery Manager ------------------ // //######@@##
//########################## WEMOS D1 MINI ##############----- // O O O //#######@@##
//###############################// for------### ===============================//<<<<<<<//########@@##
//###################//UPS Back UP Power Supply for ######################################################
//#################### RASPBERRY PI 3 / SECURITY CAMERA PROJECT ########################################
//############################/ |WWWW| /##################################################################
//###########################/ \O_O/ ####################################################################
//# CAN BE USED AS A GENERAL PURPOSE BATTERY MONITOR / CHARGING ##########################################
//############# AFTER SOME MODIFICATIONS ############# NI-CD / LEAD ACID #################################
//#################################################### NOT LI-ION ########################################
//###################
///// OUTDATED //// Watch :https://www.youtube.com/watch?v=GTEyUZAViSA
//###################
// ********************************************************************************************
// ***** IMPORTANT : rest of the details will be posted later
// ********************************************************************************************
// #########################################################################
// #### I'll improve it as i learn more
// #########################################################################
// PLEASE LIKE AND SUBSCRIBE
// MY YOUTUBE CHANNEL
// YOUTUBE.COM/CRAZYGUYOFFICIAL
// Visit Blog for Sketch Updates and more Sketches and "things"
// #########################################################################
#include <ESP8266WiFi.h>
//#################################
const char* ssid = "wubbadlubba";
const char* password ="dubdub420";
WiFiServer server(80);
//#################################
//### Charge Voltage Settings #####
//#################################
float LoadOFF = 6.50 ; // Voltage at which Load will Turn OFF
float LoadON = 10.00 ; // Voltage at which Load will Turn ON
float ChargeOFF = 12.00 ; // Cut OFF Voltage at which Charging will Turn OFF
float ChargeON = 9.60 ; // Voltage at which Charging will Turn ON
//###########################################
//### Voltage to ShutDown For Raspberry pi ##
//###########################################
float PiOFF = 7.50 ; // Voltage at which pi shutdown pin will Turn ON
// telling the Pi to ShutDown
//#############################################
//###### PINS for Sensing and Switching #######
//#############################################
byte ChrgS = 2; // D4 // Charging Switch Pin // using an NPN transistor and P-channel Mosfet
byte LoadS = 5; // D1 // Load ON / OFF Pin
byte PowerS = 4; // D2 // Power Sense to check if power is available or not
//##############################################
//### Pin for Rapberry pi Shutdown / Reset ####
//##############################################
byte StfdPin = 12 ; // D6 // Pin For signaling Pi to ShutDown // pi will use Gpio to read
byte PiStsPin = 13 ; // D7 // Pin to see Pi's status // pi will use gpio to send
byte PiRst = 14 ; // D5 // pin to reset pi using NPN transistor connected to RUN pad/pin on pi
//######################################
//### ADC pin & Resistors Values #######
//######################################
float R1 = 47000.00; // resistance of R1 (47 K)
float R2 = 6650.00; // resistance of R2 (6.65 K)
byte analInput = A0; // ADC pin
//##############################################
//#### Variables used for Voltage Calculation ##
//##############################################
float Vout = 0.00;
float Vin = 0.00;
int Val = 0;
//#################################
//### Variables for Timers ########
//#################################
unsigned long Secs = 0; // Secs Counter used to Turn OFF Charging
int Time1 = 250; // Time in Seconds after which the Charging will Turn off
// after reaching Cut off voltage
unsigned long SecsTwo = 0; // Secs Counter two used to Turn ON Load
byte Time2 = 250; // Time in Seconds after which the Load will Turn On
// after reaching Load Turn On Voltage
byte Time3 = 250; // Time in Seconds after which the Pi Will be Reset
//*******************************************************************************************
//** IMPORTANT *** For Larger Values Change Variable type to "int Time" instead of byte **
//*******************************************************************************************
//################################
bool Charging = 0 ; // don't change these values
bool LoadConnect = 0 ; // manually
bool Power = 0 ;
bool PiUp = 0 ;
//################################
//###############################################################################################
//###############################################################################################
//################ SETUP START ##################################################################
//###############################################################################################
//###############################################################################################
void setup()
{
//**** OUTPUT PINS *****
pinMode(StfdPin,OUTPUT); // Shutdown Signal Pin for Pi
pinMode(PiRst, OUTPUT); // Reset Pin for Pi
pinMode(ChrgS, OUTPUT); // Charging ON / OFF Pin
pinMode(LoadS, OUTPUT); // Load ON / OFF Pin
digitalWrite (ChrgS,HIGH); // Charging ON // npn transistor and P-channel mosfet
Charging = 1 ;
digitalWrite (StfdPin,LOW); // Keep Shutdown signal pin OFF
digitalWrite (LoadS,LOW); // Keep LOAD OFF
LoadConnect = 0 ;
digitalWrite(PiRst, LOW); // Keep Pi Reset Pin OFF
//**** INPUT PINS *****
pinMode(analInput, INPUT); // Adc analog read pin //voltage divider circuit for battery voltage
pinMode(PiStsPin, INPUT) ; // Pin for Reading Pi Status using Pi's GPIO HIGH/LOW State
pinMode(PowerS, INPUT) ; // Pin for Sensing Power from Charger / Adapter using npn transistor
// and a voltage divider circuit
Power =0;
//##### Serial & WIFI Stuff ###########
Serial.begin(115200);
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.println(".");
}
Serial.println("WiFi connected");
server.begin();
Serial.println("Waiting for the IP ..");
delay(5000);
Serial.println(WiFi.localIP());
}
//###############################################################################################
//###############################################################################################
//################ SETUP END ####################################################################
//###############################################################################################
//###############################################################################################
//##############################################################################################
//##############################################################################################
//################ Function for Voltage Calculation ############################################
//##############################################################################################
//##############################################################################################
void VoltageCalc()
{
delay(1000);
Val = analogRead(analInput); // reads Analog input using A0
delay(1000); //for maintaining the speed of the output in serial monitor
Vout = (Val * 3.40/ 1024.00); // formula for calculating voltage out from the Divider circuit
Vin = Vout / (R2 / (R1 + R2)); // formula for calculating Battery voltage
if (Vin < 0.25) // set Voltage to Zero if reading less than .50 V
{
Vin = 0.00;
}
Serial.println("################");
Serial.println("Battery Voltage: ");
Serial.println(Vin);
}
//###############################################################################################
//###############################################################################################
//################ LOOP BEGINS ##################################################################
//###############################################################################################
//###############################################################################################
void loop()
{
//delay(1000); // for maintaining the speed of the output in serial monitor
VoltageCalc(); // Calculate Battery Voltage
//##########################################
//## NO POWER ### TURN LOAD OFF ### Pi OFF #
//##########################################
if (!Power) // **** IF Power is NOT Available ****
{
digitalWrite(ChrgS,HIGH); // Turn ON Charging
Charging = 1 ;
if(LoadConnect) // and Load is Connected
{
PiUp = !digitalRead(PiStsPin); // Set Pi's Status
if(Vin <= PiOFF && PiUp) // IF Voltage is less than PiOFF // and pi is running
{
Serial.println("it has been an Honour Pi");
digitalWrite(StfdPin,HIGH); // Turn Signal Pin HIGH so, Pi can shutdown properly
}
if(Vin <= LoadOFF && !PiUp) // if Voltage is less than LoadOFF
{
Serial.println ("Turned Load OFF "); // Turn Load OFF
digitalWrite(LoadS, LOW);
LoadConnect = 0;
}
}
Secs = SecsTwo = millis()/1000; // Keep BOTH Timers Updated while no power
Power = !digitalRead(PowerS); // Check for Power Availability
}
//#################################################
//## YES POWER ## TURN CHARGING / LOAD ON / OFF ###
//#################################################
//#################################
else // **** IF Power is Available *****
{ //#################################
//#################################
//##### TURN CHARGING OFF #########
//#################################
Power = !digitalRead(PowerS); // Check for Power // the "!"/not inverts the output High means OFF Low means ON
if (Charging) // IF charging is ON
{
if(Vin >= ChargeOFF) //**** IF Voltage has Reached Cut off/ ChargeOFF Value ****
{
Serial.println ("CHARGE OFF Voltage Reached");
Serial.println ("will turn off charging after time up" );
if(millis()/1000 -Secs > Time1 ) // Seconds After which charging will turn off
{
Serial.println ("Turned Charging OFF ");
digitalWrite(ChrgS, LOW); // Turn OFF Charging
Charging = 0;
}
}
else // if charging is ON but voltage has not reached Cut OFF
{
Secs = millis()/1000; // Keep Timer1 updated
Serial.println("Battery is not fully charged yet ");
}
}
//##########################################
//######### TURN CHARGING ON ###############
//##########################################
else // Power is Available but Charging is OFF
{
if(Vin <= ChargeON ) // and if Voltage has dropped to ChargeON value
{
Serial.println ("Turned Charging ON ");
digitalWrite(ChrgS, HIGH); // Turn Charging ON
Charging = 1 ;
}
Secs = millis()/1000; // update timer 1 // keep updating it while charging is off
}
//##########################################
//######### TURN LOAD ON ###################
//##########################################
//###################################
if(!LoadConnect) // Power is Available but Load is OFF
{ //###################################
if(Vin >= LoadON) // if Voltage is above Load ON
{
if(millis()/1000 -SecsTwo > Time2 ) // Seconds After the Load ON Voltage is reached
{
Serial.println ("Turned Load ON ");
digitalWrite(LoadS, HIGH); // Turn Load ON
digitalWrite(StfdPin,LOW); // Keep Signal Pin OFF
LoadConnect = 1 ;
}
}
else
{
Serial.println("Waiting for Battery to Reach Load ON Voltage");
SecsTwo = millis()/1000; // Keep Timer Two Updated while Voltage Lower than Load ON
}
}
//#################################################
else // else if Power is Available and Load is Connected
{ //#################################################
PiUp = !digitalRead(PiStsPin); // Set Pi's Status
digitalWrite(StfdPin,LOW); // Turn Signal Pin LOW
if(!PiUp && Vin >= PiOFF) // IF Pi is NOT UP then
{
Serial.println("Pi signal ON Trying to Reset Pi");
if(millis()/1000 -SecsTwo > Time3) // Count till Time 3 // maybe it's booting up
{
Serial.println("Giving a Shock to Pi ");
digitalWrite(PiRst,HIGH); // Turn PiRst Pin ON
delay(500);
digitalWrite(PiRst,LOW); // Turn PiRst Pin OFF
SecsTwo = millis()/1000;
}
}
else // if power available and load connected and pi is up
{
SecsTwo = millis()/1000; // Keep Timer Two Updated while Load ON and PI is UP
digitalWrite(StfdPin,LOW); // keep signal pin off
Serial.println("OK ");
}
}
}
//##################################
//##### SERIAL PRINT STATUS ########
//##################################
if (Power)
{
Serial.println("POWER IS AVAILABLE");
if (Charging)
{
Serial.println ("Charging ON");
}
else
{
Serial.println ("Charging OFF");
}
}
else
{
Serial.println("NO POWER AVAILABLE");
}
if (LoadConnect)
{
Serial.println ("Load ON");
if(PiUp)
{
Serial.println("Pi is ON");
}
else
{
Serial.println("Pi Is OFF");
}
}
else
{
Serial.println ("Load OFF");
}
Serial.println("################");
//##################################
//### HTML WebPage #################
//##################################
sendHtml();
}
//####################################################################################
//##################### END OF LOOP ##################################################
//####################################################################################
//#################################
//#### Function for HTML ##########
//#################################
void sendHtml()
{
WiFiClient client = server.available();
if (client)
{
Serial.println("New client");
boolean blank_line = true;
while (client.connected())
{
if (client.available())
{
char c = client.read();
if (c == '\n' && blank_line)
{
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head><meta http-equiv='refresh' content='2'/></head><body><h1>ESP8266 Battery Manager Ver: 1.0</h1>");
client.println("<h2>AnalogIN :");
client.println(Val);
client.println("</h2>");
client.println("<h2>Vout :");
client.println(Vout);
client.println("V</h2>");
client.println("<h2>Battery Voltage :");
client.println(Vin);
client.println("V</h2>");
client.println("<br />");
client.println("<h1>Current States </h1>");
client.println("<br />");
client.println("<h3>Charging:>>> ");
if(Power)
{
if(Charging)
{
client.println("ON </h3>");
}
else
{
client.println("OFF </h3>");
}
}
else
{
client.println("NO POWER </h3>");
}
client.println("<h3>Load:>>>");
if(LoadConnect)
{
client.println("ON </h3>");
client.println("<h3>Pi Status:>>>");
if(PiUp)
{
client.println("ON </h3>");
}
else
{
client.println("OFF </h3>");
}
}
else
{
client.println("OFF </h3>");
}
client.println("<br />");
client.println("<br />");
client.println("<br />");
char LinkOne[]= "https://youtube.com/crazyguyofficial";
client.println("<h3><a href=");
client.print(LinkOne);
client.print(">CHANNEL</a></h3>");
char LinkTwo[]= "https://amkdiyprojects.blogspot.com";
client.println("<h3><a href=");
client.print(LinkTwo);
client.print(">BLOG</a></h3>");
client.println("</body></html>");
break;
}
if (c == '\n')
{
blank_line = true;
}
else if (c != '\r')
{
blank_line = false;
}
}
}
delay(1);
client.stop(); // closing the client connection
Serial.println("Client disconnected.");
}
}
Do-it-yourself,DIY,How-To,Electronics,Arduino,Esp,Raspberry-Pi,Programming,Hacking Stuff,Gardening,Photography,Hobby,Fun
ESP8266 Battery Voltmeter / Charge Controller ShutDown Reset Pi UPS Back Up Supply[OUT-DATED]
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment