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