ESP8266 Battery Voltmeter / Charge Controller ShutDown Reset Pi UPS Back Up Supply[OUT-DATED]


     
   //################################/ //####################################################################
   //##############################/   //#################################################_________ #########
   //#############################/   //=================================================//////////##########  
   //####################//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."); } }

Raspberry Pi UPS Backup Using 2 Diode Switch





Raspberry pi is powered using a 5 Volts Buck Converter. 

The Buck Converter needs an Input Voltage more than it's Output Voltage which, in this case is 5 Volts.

First i powered it up with only a 12 Volts Output from an AC-DC power-supply.

Then I used a 9.6 Volts Ni-Cd Battery which was fully charged and at a Voltage above 10 Volts.

After making sure that it works I used Two Silicon Diodes (A610)  for Switching the Buck Converter's Input from the 12 Volts, coming from the Power Supply Unit, TO the 9.6 Volts coming from the Ni-Cd Battery and without any Interruptions.So, when the AC power goes out the Buck Converter will automatically be powered by the Battery and the Switch happens almost instantly.

As shown in the picture above the Ground is common for all as Negative terminals on the Buck Converter, the 12 V Output of the AC-DC P.S.U. and the Ni-Cd Battery are all connected together. 

The Positive terminal on the 12 Volt Output from the P.S.U. connects to the Anode of the Diode 2 and the Cathode of the Diode 2 connects to the Positive terminal on the Input of the Buck Converter.  At the same time, the Positive terminal on the 9.6 V Ni-Cd Battery is connected to the Anode of the Diode 1 and the Cathode of the Diode 1 is connected to the Positive terminal on the Input of the Buck Converter. 

Both Cathode terminals of both Diodes are joined together at the Buck Converters Input. But it all works because of the way the diode works. 

Because, the 12 Volts coming from the AC-DC Power Supply, is Higher than the 9.6 Volts coming from the Battery, the current will flow from the Output of AC-DC Power Supply to the Anode of the Diode 2 and the Diode 2 will get "Forward Biased" then it will flow through the Diode 2 Cathode terminal to BOTH ,the Input of the Buck Converter and the Cathode of the Diode 1.

The Current that goes to the Input of the Buck Converter will power the Buck Converter and the Raspberry and the Current that flows to the Cathode of the Diode 1 will "Reverse Bias" the Diode 1 there-by preventing any flow of current from the Battery. 

This is only possible when the Battery Voltage is lower than the Power Supply's output voltage .

When the AC power goes out or is turned off, the Voltage from the Output of the AC-DC Power Supply will drop and as soon as it drops lower than the Battery Voltage the Diode 1 gets "Forward Biased" because now the potential is higher on it's Anode and the Current will flow from the Battery to BOTH, the Input of the Buck Converter and the Cathode of the Diode 2. 

It will power the Buck Converter and the Rpi and will "Reverse bias" the Diode 2.

All of this happens almost instantly and the Pi works without any interruptions in it's 5 Volts Input.