This is my TPJ project that controls the SLA battery charging cycle with 2W 12V Solar Panel and provides real-time data for user via LCD screen and Bluetooth

Dependencies:   N5110 Terminal mbed

Automated Solar Power Harvesting System

• Controls the charging and discharging operation of power bank with solar panel as well as house hold load and informs the user via Bluetooth and Internet of Things (IoT)

• Operated by FRDM-K64F: Kinetis Development Board that has ARM Cortes-M4 processor

• Programed with Mbed online C/C++ IDE.

/media/uploads/Ozmos/whatsapp_image_2017-06-11_at_5.13.53_pm.jpeg

/media/uploads/Ozmos/alone.jpeg

Revision:
1:ed2bd7349828
Parent:
0:aa0900f930e8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main.cpp	Thu Apr 20 13:28:42 2017 +0000
@@ -0,0 +1,271 @@
+/*
+                  TPJ project 
+Automated Solar Power Harvesting System 
+
+It is created  by Ozan SANCI
+
+Description: This program controls charging operation of SLA battery(6V-4A) with 12V 2W Solar Panel and  controls:
+
+    -load On/OFF
+    -ADC real-time voltage on both solar and battery,
+    -power consumption with ACS712 Current Sensor (-5 to 5A)
+    -interfacing with user via Nokia 5110 screen as well as HC-05 Bluetooth module. 
+    -third part Android application, “Bluetooth Electronic” is used. 
+
+Additional note: The charging algorithms for the final demonstration have been changed slightly: 
+    Solar Panel and battery voltage thresholds, 6.5V, and 6.4V are changed to 6V. 
+    Because, instead of solar panel, A dc source is used since solar panel is not able to provide enough power in the Lab.  
+
+*/
+
+#include"mbed.h"
+#include "Terminal.h"
+#include "N5110.h"
+#include "string"
+
+/*********************************Pin decleration*************/
+Serial pc(USBTX, USBRX);
+Serial blue(PTC15,PTC14); 
+AnalogIn solar_voltage(A0);
+AnalogIn battery_voltage(A1);
+AnalogIn load_current(A2);
+DigitalOut solar_gate(D5);
+DigitalOut load_gate(D4);
+DigitalIn  pushBtnLeft(D3);
+DigitalIn  pushBtnRight(D2);
+DigitalOut blueLed(D0);
+/*******************************************************************/
+using std::string;
+/****************************Nokia5110 Pin Decleration*********/
+ //SCE,RST,D/C,MOSI,SCLK,LED
+N5110 lcd(PTA0,PTC2,PTC4,PTD2,PTD1,PTC3);
+/*****************************************************************/      
+#define solargate 
+#define refVolt 3300
+float solarVoltage;
+unsigned char sGate = 'A'; //Initially gate is open
+unsigned char bGate = 'B';//Initially gate is open
+
+ string gateStat= "LR255G0B0"; // INTIALLY IT IS RED, GREEN IS LR0G255B0
+float batteryVoltage;
+/********************************************************Function Prototypes************/
+
+float fnc_solarPanel(void);
+bool fnc_chargingstat(float i);
+float fnc_batteryVolt(void);
+bool fnc_loadstat(float i);
+float fnc_load_current(void);
+
+/************************************************************M A I N************************/
+int main(){
+bool loadStatus, chargingStatus,screenOne,screenTwo;
+ solarVoltage = 0.0;
+ batteryVoltage = 0.0;
+float loadCurrent = 0.0;
+float usagePower = 0.0;
+float powerLeftinW = 0.0;
+int powerLeftinH = 0.0;
+char outputs[10];//it is used for conversion from solar volt (float) to char in order to print as string. 
+char outputb[10];//it is used for conversion from battery charge(float) to char in order to print as string.
+char outputc[10];//it is used for conversion from current charge(float) to char in order to print as string. 
+char blueInput;
+int left, right;
+lcd.init();
+lcd.normalMode();
+lcd.setBrightness(1.0); 
+
+loadStatus  = false;
+chargingStatus = false;
+screenOne = true;
+screenTwo = false;
+right = 1;
+left = 0;
+blueLed = 0;
+    while(1){
+       
+       if (blue.readable()) {
+            blueLed = 1;
+           
+            blueInput = blue.getc();
+           switch(blueInput){
+               case 'B' : bGate = 'B'; break;
+               case 'b' : bGate = 'b'; break;
+               case 'A': sGate = 'A';break;
+               case 'a' : sGate = 'a'; break;
+               
+               }}
+        
+
+            
+        
+        
+        
+right = pushBtnRight.read();
+left = pushBtnLeft.read();
+if(right){screenOne = false; screenTwo = true; }
+if(left){screenOne=true;screenTwo=false;}
+if(screenOne)
+{
+
+
+lcd.clear();
+solarVoltage=fnc_solarPanel();//solar voltge 
+            sprintf(outputs,"SolarV: %.2fV",solarVoltage); 
+            lcd.printString(outputs,0,0);
+    //lcd.refresh();
+    blue.printf("*S%s*",outputs);
+   
+
+chargingStatus = fnc_chargingstat(solarVoltage); // return true if volt bigger than 6V else false and sets the gate
+    if (chargingStatus){lcd.printString("Charging: ON ",0,1);/*lcd.refresh();*/blue.printf("*LR0G255B0*");}
+        else {lcd.printString("Charging: OFF",0,1);blue.printf("*LR255G0B0*");}
+     /*lcd.refresh();*/
+batteryVoltage = fnc_batteryVolt(); // return battery volt as float
+            sprintf(outputb,"Battery: %.2fV",batteryVoltage); /*lcd.refresh();*/
+            lcd.printString(outputb,0,2);
+  /*lcd.refresh();*/    
+  blue.printf("*B%s*",outputb);  
+
+loadStatus = fnc_loadstat(batteryVoltage); // return true if volt higger than 6v else fals end sets the gate
+    if (loadStatus){lcd.printString("Status: ON  ",0,3);/*lcd.refresh();*/blue.printf("*MR0G255B0*");}
+        else {lcd.printString("Status: OFF",0,3);blue.printf("*MR255G0B0*");}
+/*lcd.refresh();*/
+fnc_load_current(); // only return current as float and power calculations are required 
+lcd.printString("Power Usage =>",0,5);
+    lcd.refresh();
+    fnc_load_current();
+loadCurrent = fnc_load_current();
+      sprintf(outputc,"Load:%.2fmA",loadCurrent); 
+            
+            blue.printf("*E%s*",outputc);
+      usagePower = loadCurrent * batteryVoltage;
+      
+      sprintf(outputc,"L-Power:%.2fmW",usagePower); 
+           
+            blue.printf("*I%s*",outputc);
+      powerLeftinW = 24 - usagePower;
+      if(batteryVoltage <= 5) powerLeftinW=0.0;
+      sprintf(outputc,"B-Power:%.1fkW",powerLeftinW);
+      blue.printf("*I%s*",outputc);
+            
+       powerLeftinH = 24 / usagePower;
+       if(batteryVoltage <= 5) powerLeftinH=0.0;
+       sprintf(outputc,"B-Hour:%dh", powerLeftinH); 
+           
+            blue.printf("*N%s*",outputc);
+       
+    wait_ms(500);
+    }//if screenone
+    
+    if(screenTwo)
+    { 
+    lcd.clear();
+   
+solarVoltage=fnc_solarPanel();//solar voltge 
+            sprintf(outputs,"SolarV: %.2fV",solarVoltage); 
+            
+    blue.printf("*S%s*",outputs);
+   
+
+chargingStatus = fnc_chargingstat(solarVoltage); // return true if volt bigger than 6V else false and sets the gate
+    if (chargingStatus){blue.printf("*LR0G255B0*");}
+        else {blue.printf("*LR255G0B0*");}
+    
+batteryVoltage = fnc_batteryVolt(); // return battery volt as float
+            sprintf(outputb,"Battery: %.2fV",batteryVoltage); 
+         
+      
+  blue.printf("*B%s*",outputb);  
+
+loadStatus = fnc_loadstat(batteryVoltage); // return true if volt higger than 6v else fals end sets the gate
+    if (loadStatus){blue.printf("*MR0G255B0*");}
+        else {blue.printf("*MR255G0B0*");}
+
+fnc_load_current(); // only return current as float and power calculations are required 
+//*******************************
+
+      loadCurrent = fnc_load_current();
+      sprintf(outputc,"Load:%.2fmA",loadCurrent); /*lcd.refresh();*/
+            lcd.printString(outputc,0,0);/*lcd.refresh();*/
+            blue.printf("*E%s*",outputc);
+      usagePower = loadCurrent * batteryVoltage;
+     
+      sprintf(outputc,"L-Power:%.2fmW",usagePower); /*lcd.refresh();*/
+            lcd.printString(outputc,0,1);/*lcd.refresh();*/
+            blue.printf("*I%s*",outputc);
+      powerLeftinW = 24 - usagePower;
+       if(batteryVoltage <= 5) powerLeftinW=0.0;
+      sprintf(outputc,"B-Power:%.1fkW",powerLeftinW); /*lcd.refresh();*/
+      
+      blue.printf("*I%s*",outputc);
+        lcd.printString(outputc,0,2);/*lcd.refresh();*/
+       powerLeftinH = 24 / usagePower;
+        if(batteryVoltage <= 5) powerLeftinH=0.0;
+       sprintf(outputc,"B-Hour:%dh", powerLeftinH); /*lcd.refresh();*/
+            lcd.printString(outputc,0,3);/*lcd.refresh();*/
+            blue.printf("*N%s*",outputc);
+       lcd.printString("",0,1);/*lcd.refresh();*/
+       lcd.printString("<= Charger",0,5);
+       lcd.refresh();
+     wait_ms(500);
+        }// if screentwo
+
+    }
+ }
+ /******************************************E N D   M A I N*************************/
+
+
+
+ /******************************************Function Definations********************/
+ 
+ float fnc_solarPanel(void)//Solar Panel Voltage at A0 in -------------------------------------------
+ {
+         float solarVolt = ((solar_voltage.read() * (refVolt/1000.0))*2.63);    
+         return solarVolt;  
+ }
+   //-------------------------------------------------------------------------------------------------------------
+     
+     
+ bool fnc_chargingstat(float i)//it returns true if voltage on solar panel is enough. 
+ {
+        if (i<6|| sGate =='a' ) 
+        {
+            solar_gate = 0; 
+            gateStat = "LR255GOBO";
+         //   blue.printf("*OR255G0B0*");
+        
+        return false;  
+        }
+        else {
+          // blue.printf("*OR0G255B0*");
+
+            gateStat= "LROG255BO";
+         solar_gate = 1; return true;}
+         
+ }
+      //------------------------------------------------------------------------------------------------------------
+ float fnc_batteryVolt(void) //Returns battery volage as float
+ {
+        batteryVoltage = ((battery_voltage.read()*(refVolt/1000.0))*3.7789);
+        return batteryVoltage;  
+ }
+       //--------------------------------------------------------------------------------------------------
+
+ bool fnc_loadstat(float i)
+ {  //bool stat; 
+         
+        if (i <6 ){ blue.printf("*OR255G0B0*");  return false;  }
+        else{  blue.printf("*OR0G255B0*"); return true;} 
+ 
+// return stat; 
+ }
+    
+ //-----------------------------------------------------------------------------------------------------------------------
+    float fnc_load_current(void)
+ {                                                
+       float loadcurrent = load_current.read();
+       return loadcurrent; 
+ }  
+ 
+ //--------------------------------------------------------------------------------------------------
+ 
\ No newline at end of file