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.
Revision 1:ed2bd7349828, committed 2017-04-20
- Comitter:
- Ozmos
- Date:
- Thu Apr 20 13:28:42 2017 +0000
- Parent:
- 0:aa0900f930e8
- Commit message:
- 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
Changed in this revision
--- /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
--- a/N5110.lib Thu Apr 06 03:40:54 2017 +0000 +++ b/N5110.lib Thu Apr 20 13:28:42 2017 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/eencae/code/N5110/#0d8d90936b4c +http://mbed.org/users/eencae/code/N5110/#c2598020fcac
--- a/gate1.cpp Thu Apr 06 03:40:54 2017 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,251 +0,0 @@
-#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';
-unsigned char bGate = 'B';
-
- 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)//-------------------------------------------------------------------------
- {
- 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)
- {
- 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