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."); } }

No comments:

Post a Comment