Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 /*########################################################################################## 00002 00003 Program Name : ex1_HC06_leds 00004 Author : Grant Phillips 00005 Date Modified : 12/05/2016 00006 Compiler : ARMmbed 00007 Tested On : STM32F4-Discovery 00008 Discription : I used some of the program to develop mine Elecrtonic Householder Water Meter 00009 ##############################################################################################*/ 00010 ///////////////////////DECLARING LIBRIES//////////////////////////////////////////////////////// 00011 00012 #include "mbed.h" 00013 ////////////////////////////////////////////////////////////////////////////////////////////// 00014 00015 /////////////////////////////////DECLARING BLUETOOTH MODULE PINS////////////////////////////////////////////////////// 00016 00017 Serial bt(PC_10, PC_11); //create a Serial object to connect to the HC05 Bluetooth module 00018 // tx , rx 00019 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00020 00021 ///////////////////////////DECLARING SOLAR PANEL TRANSISTOR'S OPARATIONAL PINS/////////////////////////////////////////////////////////////////////////////////// 00022 00023 DigitalOut Q1(PA_10); // Solar Panel Forward bias (Q1)transistor for the posistive leg 00024 DigitalOut Q2(PB_3); // Solar Panel Voltage testing loop forward bias Q2 for the positive leg of the loop 00025 DigitalOut Q3(PB_5); // Solar Panel Voltage testing loop forward bias Q3 for the negetive leg of the loop back to the Solar 00026 DigitalOut Q4(PB_4); // Solar Panel Forward bias (Q4)transistor for the negetive leg 00027 AnalogIn SolarVolt(PC_0); // Solar Panel supply Voltage 00028 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00029 00030 //////////////////////////////DECLARING HYDRO GENERATION TRANSISTOR'S OPARATIONAL PINS/////////////////////////////////////////// 00031 00032 DigitalOut Q5(PB_13); //Hydro Generator Forward bias Q5 transistor for the posistive leg 00033 DigitalOut Q6(PB_14); //Hydro Generator Voltage testing loop bias Q6 for the positive leg of the loop 00034 DigitalOut Q7(PB_15); //Hydro Generator Voltage testing loop bias Q7 for the negetive leg of the loop back to the hydro 00035 DigitalOut Q8(PB_2); //Hydro Generator Forward bias Q8 transistor nfor the egetive leg 00036 AnalogIn HydroVolt(PC_1); //Hydro Generator supply Voltage 00037 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00038 00039 //////////////////////////////DECLARING FAN TRANSISTOR'S PIN/////////////////////////////////////////// 00040 00041 DigitalOut Q9(PC_6); // Forward bias to keep the fan on 00042 //////////////////////////////////////////////////////////////////////////////// 00043 00044 ///////////////////////////DECLARING WATER VALVE TRANSISTOR'S PIN////////////// 00045 00046 DigitalOut Q10(PC_8); // Forward bias to keep the valve open 00047 ///////////////////////////////////////////////////////////////////////////////// 00048 00049 //////////////////////////////DECLARING BATTERY TRANSISTOR'S OPARATIONAL PINS///////////////////////////////////////////////// 00050 00051 DigitalOut Q11(PB_8); // Battery Voltage testing loop bias Q11 for the positive leg of the loop 00052 DigitalOut Q12(PC_9); // Battery Voltage testing loop biasing Q12 for the negative leg of the loop down to nuetral of the load 00053 AnalogIn BatVolt(PA_4); // Battery Panel supply Voltage 00054 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00055 00056 /////////////////////////////DECLARING WATER METER TRANSISTOR'S OPARATIONAL PIN/////////////////////////////////// 00057 00058 AnalogIn Met(PA_1); // Water meter 00059 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00060 00061 ////////DECLARING WATER SENSOR TRANSISTOR'S OPARATIONAL PIN/////////////////////////////// 00062 AnalogIn Sen(PA_0); //Water Sensor 00063 ////////////////////////////////////////////////////////////////////////////////////////// 00064 00065 /////////////////////////////DECLARING WATER METER VARABLE////////////////////////////////// 00066 00067 double METER; // Water Meter varable that posses a the current Kiloliter value 00068 00069 ////////////////////////////////////////////////////////////////////////////////////////// 00070 00071 00072 ////////////IT'S A SUB PROGRAM THAT CLOSES THE WATER VALVE///////////// 00073 void ClosedValve() 00074 { 00075 Q10 = 0; 00076 } 00077 //////////////////////////////////////////////////////////////////// 00078 00079 ///////////////////////IT'S A SUB PROGRAM THAT OPENS THE WATER VALVE//////////////////////// 00080 void OpenValve () 00081 { 00082 Q10 = 1; 00083 } 00084 //////////////////////////////////////////////////////////////////////// 00085 00086 /////////////////IT'S A SUB PROGRAM THAT COMPARES THE WATER METER AND THE WATER SENSOR VALUES THAT ARE EQUAL/////////////// 00087 void Water_Valve () 00088 { 00089 while (1) 00090 { 00091 if (Met.read_u16() != Sen.read_u16()) 00092 { 00093 ClosedValve(); 00094 wait (0.2); 00095 } 00096 else 00097 { 00098 OpenValve (); 00099 } 00100 } 00101 } 00102 /////////////////////////////////////////////////////////////////////////////////////////////// 00103 00104 ///////////////////////////////////NORMAL OPARATIONS SUB PROGRAM WHICH BIAS THE TRANSISTORS////////////////// 00105 00106 void Normal() // When every thing is running normal 00107 { 00108 Q1 = 1; 00109 Q2 = 0; 00110 Q3 = 0; 00111 Q4 = 1; 00112 Q5 = 1; 00113 Q6 = 0; 00114 Q7 = 0; 00115 Q8 = 1; 00116 Q9 = 1; 00117 Water_Valve (); 00118 Q11 = 0; 00119 Q12 = 0; 00120 } 00121 //////////////////////////////////////////////////////////////////////////////////////////////////// 00122 00123 ////////////////////////////////IT'S A SUB PROGRAM OF THE WATER SENSOR OPARATION//////////////////////////////////////////////////////////////// 00124 void Water_Sensor() 00125 { 00126 00127 uint16_t senval; //Declare variable to store the water analog value after conversion - 16-bit 00128 uint32_t senval_sum; //Declare variable to store the water analog value sum in loop - 32-bit 00129 double senkvolt; //Declare 64-bit floating point data type to store water analog killovoltage value 00130 00131 while(1) 00132 { 00133 //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), 00134 senval = Sen.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) 00135 senval_sum = senval_sum + senval; //Add every analog reading to the sum variable 00136 00137 //calculate the voltage from the 16-bit value 00138 senkvolt = ((double)senval_sum* 0.00158) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double 00139 // 1 Volt = 1.58 litres then one kilolitres is 1580 acording to kyleconvert.com 00140 wait (0.2); 00141 } 00142 } 00143 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00144 00145 ////////////////////////////////IT'S A SUB PROGRAM OF THE WATER METER OPARATION/////////////////////////////////////////////////////////////// 00146 void Water_Readings() 00147 { 00148 00149 uint16_t watval; //Declare variable to store the water analog value after conversion - 16-bit 00150 uint32_t watval_sum; //Declare variable to store the water analog value sum in loop - 32-bit 00151 double watkvolt; //Declare 64-bit floating point data type to store water analog killovoltage value 00152 00153 while(1) 00154 { 00155 //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), 00156 watval = Met.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) 00157 watval_sum = watval_sum + watval; //Add every analog reading to the sum variable 00158 00159 //calculate the voltage from the 16-bit value 00160 watkvolt = ((double)watval_sum * 0.00158) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double 00161 // 1 Volt = 1.58 litres then one kilolitres is 1580 acording to kyleconvert.com 00162 METER = watkvolt; 00163 bt.printf(" %2.3f Volts \n", watkvolt); 00164 wait (0.2); 00165 Normal (); 00166 } 00167 } 00168 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00169 00170 /////////////////////////////////////IT'S A SUB PROGRAM THAT TEST THE SOLAR PANNEL'S VOLTAGE VALUE///////////////////////////////////////////// 00171 00172 void Test_Solar() //The loop to test the Solar Panel's voltage 00173 { 00174 Q1 = 0; 00175 Q2 = 1; 00176 Q3 = 1; 00177 Q4 = 0; 00178 Q5 = 1; 00179 Q6 = 0; 00180 Q7 = 0; 00181 Q8 = 1; 00182 Q9 = 1; 00183 00184 Q11 = 0; 00185 Q12 = 0; 00186 00187 uint16_t solval; //Declare variable to store analog value after conversion - 16-bit 00188 double solvolt; //Declare 64-bit floating point data type to store analog voltage value 00189 00190 while (1) 00191 00192 { 00193 //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), 00194 solval = SolarVolt.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) 00195 00196 //calculate the voltage from the 16-bit value 00197 solvolt = ((double)solval*5.9613) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double 00198 //5.9613 convert the voltage value to equeal the supply 00199 bt.printf("%2.3f Volts \n", solvolt); 00200 wait (5); 00201 Normal (); 00202 } 00203 } 00204 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00205 00206 ////////////////////////////////IT'S A SUB PROGRAM THAT TEST THE HYDRO GENERATOR'S VOLTAGE VALUE/////////////////////////////////////////////// 00207 00208 void Test_Hydro() // the loop to test the Hydro Generator's voltage 00209 { 00210 Q1 = 1; 00211 Q2 = 0; 00212 Q3 = 0; 00213 Q4 = 1; 00214 Q5 = 0; 00215 Q6 = 1; 00216 Q7 = 1; 00217 Q8 = 0; 00218 Q9 = 1; 00219 00220 Q11 = 0; 00221 Q12 = 0; 00222 00223 uint16_t hydval; //Declare variable to store analog value after conversion - 16-bit 00224 double hydvolt; //Declare 64-bit floating point data type to store analog voltage value 00225 00226 while (1) 00227 00228 { 00229 //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), 00230 hydval = HydroVolt.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) 00231 00232 //calculate the voltage from the 16-bit value 00233 hydvolt = ((double)hydval * 5.9613) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double 00234 //5.9613 convert the voltage value to equeal the supply 00235 bt.printf("%2.3f Volts \n", hydvolt); 00236 wait (5); 00237 Normal(); 00238 } 00239 } 00240 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00241 00242 /////////////////////////////////IT'S A SUB PROGRAM THAT TEST THE 12 VOLTS BATTERY'S VOLTAGE VALUE///////////////////////////////////////////// 00243 void Test_Battery() // The loop to test the battery's voltage 00244 { 00245 Q1 = 0; 00246 Q2 = 0; 00247 Q3 = 0; 00248 Q4 = 0; 00249 Q5 = 0; 00250 Q6 = 0; 00251 Q7 = 0; 00252 Q8 = 0; 00253 00254 Q9 = 0; 00255 Q11 = 1; 00256 Q12 = 1; 00257 00258 uint16_t battval; //Declare variable to store analog value after conversion - 16-bit 00259 double battvolt; //Declare 64-bit floating point data type to store analog voltage value 00260 while (1) 00261 { 00262 //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), 00263 battval = BatVolt.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) 00264 00265 //calculate the voltage from the 16-bit value 00266 battvolt = ((double)battval * 5.9613) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double 00267 // 5.9613 convert the voltage value to equeal the supply 00268 bt.printf(" %2.3f Volts \n", battvolt); 00269 wait (5); 00270 Normal (); 00271 } 00272 } 00273 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00274 00275 ////////////////////////////DECLARATION OF INCOME MESSAGE AS A CHARACTORS THAT COMES FROM THE PHONE APP////////////////////////////////////// 00276 00277 char btmsg[50]; //incoming message string 00278 int btmsg_counter = 0; //character position counter in the message string 00279 int new_btmsg = 0; //flag to indicate if a new complete message was received 00280 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00281 00282 00283 00284 ////////////////////////////////IT'S A SUB PROGRAM THAT INTERRUPT THE ROUTINE WHEN A NEW CHARACTER ARRIVES///////////////////////////////////////////// 00285 void btinterrupt() 00286 { 00287 char c; // declare the c as a charactor 00288 00289 c = bt.getc(); //read the incoming character 00290 if(c == '\n') //if it is the terminating character 00291 { 00292 if(btmsg[btmsg_counter - 1] == '\r') 00293 btmsg[btmsg_counter - 1] = '\0'; 00294 else 00295 btmsg[btmsg_counter] = '\0'; 00296 new_btmsg = 1; //enable the new message flag to indicate a COMPLETE message was received 00297 btmsg_counter = 0; //clear the message string 00298 } 00299 else 00300 { 00301 btmsg[btmsg_counter] = c; //add the character to the message string 00302 btmsg_counter++; //move to the next character in the string 00303 } 00304 } 00305 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00306 00307 /////////////////////////////////////////THE MAIN PROGRAM WHERE IT WILL CALL ALL THE SUB PROGRAM////////////////////////////////////////////// 00308 int main() { 00309 bt.attach(&btinterrupt); //if a new character arrives, call the interrupt service routine 00310 00311 while(1) { 00312 Normal (); 00313 Water_Readings (); 00314 Water_Valve (); 00315 if(new_btmsg) { //check if there is a new message 00316 if(strcmp(btmsg, "SolarON") == 0) //message for SolarOn is ON 00317 Test_Solar(); 00318 else if(strcmp(btmsg, "HydrON") == 0) //message for HydroOn is ON 00319 Test_Hydro() ; 00320 else if(strcmp(btmsg, "BatteryON") == 0) //message for BatteryON is ON 00321 Test_Battery(); 00322 else if(strcmp(btmsg, "WaterON") == 0) //message for WaterOn is ON 00323 bt.printf("%2.3f Kl \n",METER); 00324 else if(strcmp(btmsg, "ValveOPEN") == 0) //message for for ValveOpen is ON 00325 OpenValve(); 00326 else if(strcmp(btmsg, "ValveClosed") == 0) //message for for ValveClosed is ON 00327 ClosedValve(); 00328 else 00329 bt.printf("Incorrect command\n"); //Reply incorrect command 00330 00331 new_btmsg=0; //clear message flag 00332 } 00333 } 00334 } 00335 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
Generated on Tue Feb 28 2023 07:20:41 by
1.7.2