Monwabisi Magidimisi
/
EHWM
electronic water meter system
main.cpp@0:4965eb440b44, 2021-02-10 (annotated)
- Committer:
- magidimisi
- Date:
- Wed Feb 10 10:18:23 2021 +0000
- Revision:
- 0:4965eb440b44
Electronic water meter
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
magidimisi | 0:4965eb440b44 | 1 | /*########################################################################################## |
magidimisi | 0:4965eb440b44 | 2 | |
magidimisi | 0:4965eb440b44 | 3 | Program Name : ex1_HC06_leds |
magidimisi | 0:4965eb440b44 | 4 | Author : Grant Phillips |
magidimisi | 0:4965eb440b44 | 5 | Date Modified : 12/05/2016 |
magidimisi | 0:4965eb440b44 | 6 | Compiler : ARMmbed |
magidimisi | 0:4965eb440b44 | 7 | Tested On : STM32F4-Discovery |
magidimisi | 0:4965eb440b44 | 8 | Discription : I used some of the program to develop mine Elecrtonic Householder Water Meter |
magidimisi | 0:4965eb440b44 | 9 | ##############################################################################################*/ |
magidimisi | 0:4965eb440b44 | 10 | ///////////////////////DECLARING LIBRIES//////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 11 | |
magidimisi | 0:4965eb440b44 | 12 | #include "mbed.h" |
magidimisi | 0:4965eb440b44 | 13 | ////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 14 | |
magidimisi | 0:4965eb440b44 | 15 | /////////////////////////////////DECLARING BLUETOOTH MODULE PINS////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 16 | |
magidimisi | 0:4965eb440b44 | 17 | Serial bt(PC_10, PC_11); //create a Serial object to connect to the HC05 Bluetooth module |
magidimisi | 0:4965eb440b44 | 18 | // tx , rx |
magidimisi | 0:4965eb440b44 | 19 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 20 | |
magidimisi | 0:4965eb440b44 | 21 | ///////////////////////////DECLARING SOLAR PANEL TRANSISTOR'S OPARATIONAL PINS/////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 22 | |
magidimisi | 0:4965eb440b44 | 23 | DigitalOut Q1(PA_10); // Solar Panel Forward bias (Q1)transistor for the posistive leg |
magidimisi | 0:4965eb440b44 | 24 | DigitalOut Q2(PB_3); // Solar Panel Voltage testing loop forward bias Q2 for the positive leg of the loop |
magidimisi | 0:4965eb440b44 | 25 | DigitalOut Q3(PB_5); // Solar Panel Voltage testing loop forward bias Q3 for the negetive leg of the loop back to the Solar |
magidimisi | 0:4965eb440b44 | 26 | DigitalOut Q4(PB_4); // Solar Panel Forward bias (Q4)transistor for the negetive leg |
magidimisi | 0:4965eb440b44 | 27 | AnalogIn SolarVolt(PC_0); // Solar Panel supply Voltage |
magidimisi | 0:4965eb440b44 | 28 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 29 | |
magidimisi | 0:4965eb440b44 | 30 | //////////////////////////////DECLARING HYDRO GENERATION TRANSISTOR'S OPARATIONAL PINS/////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 31 | |
magidimisi | 0:4965eb440b44 | 32 | DigitalOut Q5(PB_13); //Hydro Generator Forward bias Q5 transistor for the posistive leg |
magidimisi | 0:4965eb440b44 | 33 | DigitalOut Q6(PB_14); //Hydro Generator Voltage testing loop bias Q6 for the positive leg of the loop |
magidimisi | 0:4965eb440b44 | 34 | DigitalOut Q7(PB_15); //Hydro Generator Voltage testing loop bias Q7 for the negetive leg of the loop back to the hydro |
magidimisi | 0:4965eb440b44 | 35 | DigitalOut Q8(PB_2); //Hydro Generator Forward bias Q8 transistor nfor the egetive leg |
magidimisi | 0:4965eb440b44 | 36 | AnalogIn HydroVolt(PC_1); //Hydro Generator supply Voltage |
magidimisi | 0:4965eb440b44 | 37 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 38 | |
magidimisi | 0:4965eb440b44 | 39 | //////////////////////////////DECLARING FAN TRANSISTOR'S PIN/////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 40 | |
magidimisi | 0:4965eb440b44 | 41 | DigitalOut Q9(PC_6); // Forward bias to keep the fan on |
magidimisi | 0:4965eb440b44 | 42 | //////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 43 | |
magidimisi | 0:4965eb440b44 | 44 | ///////////////////////////DECLARING WATER VALVE TRANSISTOR'S PIN////////////// |
magidimisi | 0:4965eb440b44 | 45 | |
magidimisi | 0:4965eb440b44 | 46 | DigitalOut Q10(PC_8); // Forward bias to keep the valve open |
magidimisi | 0:4965eb440b44 | 47 | ///////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 48 | |
magidimisi | 0:4965eb440b44 | 49 | //////////////////////////////DECLARING BATTERY TRANSISTOR'S OPARATIONAL PINS///////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 50 | |
magidimisi | 0:4965eb440b44 | 51 | DigitalOut Q11(PB_8); // Battery Voltage testing loop bias Q11 for the positive leg of the loop |
magidimisi | 0:4965eb440b44 | 52 | DigitalOut Q12(PC_9); // Battery Voltage testing loop biasing Q12 for the negative leg of the loop down to nuetral of the load |
magidimisi | 0:4965eb440b44 | 53 | AnalogIn BatVolt(PA_4); // Battery Panel supply Voltage |
magidimisi | 0:4965eb440b44 | 54 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 55 | |
magidimisi | 0:4965eb440b44 | 56 | /////////////////////////////DECLARING WATER METER TRANSISTOR'S OPARATIONAL PIN/////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 57 | |
magidimisi | 0:4965eb440b44 | 58 | AnalogIn Met(PA_1); // Water meter |
magidimisi | 0:4965eb440b44 | 59 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 60 | |
magidimisi | 0:4965eb440b44 | 61 | ////////DECLARING WATER SENSOR TRANSISTOR'S OPARATIONAL PIN/////////////////////////////// |
magidimisi | 0:4965eb440b44 | 62 | AnalogIn Sen(PA_0); //Water Sensor |
magidimisi | 0:4965eb440b44 | 63 | ////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 64 | |
magidimisi | 0:4965eb440b44 | 65 | /////////////////////////////DECLARING WATER METER VARABLE////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 66 | |
magidimisi | 0:4965eb440b44 | 67 | double METER; // Water Meter varable that posses a the current Kiloliter value |
magidimisi | 0:4965eb440b44 | 68 | |
magidimisi | 0:4965eb440b44 | 69 | ////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 70 | |
magidimisi | 0:4965eb440b44 | 71 | |
magidimisi | 0:4965eb440b44 | 72 | ////////////IT'S A SUB PROGRAM THAT CLOSES THE WATER VALVE///////////// |
magidimisi | 0:4965eb440b44 | 73 | void ClosedValve() |
magidimisi | 0:4965eb440b44 | 74 | { |
magidimisi | 0:4965eb440b44 | 75 | Q10 = 0; |
magidimisi | 0:4965eb440b44 | 76 | } |
magidimisi | 0:4965eb440b44 | 77 | //////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 78 | |
magidimisi | 0:4965eb440b44 | 79 | ///////////////////////IT'S A SUB PROGRAM THAT OPENS THE WATER VALVE//////////////////////// |
magidimisi | 0:4965eb440b44 | 80 | void OpenValve () |
magidimisi | 0:4965eb440b44 | 81 | { |
magidimisi | 0:4965eb440b44 | 82 | Q10 = 1; |
magidimisi | 0:4965eb440b44 | 83 | } |
magidimisi | 0:4965eb440b44 | 84 | //////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 85 | |
magidimisi | 0:4965eb440b44 | 86 | /////////////////IT'S A SUB PROGRAM THAT COMPARES THE WATER METER AND THE WATER SENSOR VALUES THAT ARE EQUAL/////////////// |
magidimisi | 0:4965eb440b44 | 87 | void Water_Valve () |
magidimisi | 0:4965eb440b44 | 88 | { |
magidimisi | 0:4965eb440b44 | 89 | while (1) |
magidimisi | 0:4965eb440b44 | 90 | { |
magidimisi | 0:4965eb440b44 | 91 | if (Met.read_u16() != Sen.read_u16()) |
magidimisi | 0:4965eb440b44 | 92 | { |
magidimisi | 0:4965eb440b44 | 93 | ClosedValve(); |
magidimisi | 0:4965eb440b44 | 94 | wait (0.2); |
magidimisi | 0:4965eb440b44 | 95 | } |
magidimisi | 0:4965eb440b44 | 96 | else |
magidimisi | 0:4965eb440b44 | 97 | { |
magidimisi | 0:4965eb440b44 | 98 | OpenValve (); |
magidimisi | 0:4965eb440b44 | 99 | } |
magidimisi | 0:4965eb440b44 | 100 | } |
magidimisi | 0:4965eb440b44 | 101 | } |
magidimisi | 0:4965eb440b44 | 102 | /////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 103 | |
magidimisi | 0:4965eb440b44 | 104 | ///////////////////////////////////NORMAL OPARATIONS SUB PROGRAM WHICH BIAS THE TRANSISTORS////////////////// |
magidimisi | 0:4965eb440b44 | 105 | |
magidimisi | 0:4965eb440b44 | 106 | void Normal() // When every thing is running normal |
magidimisi | 0:4965eb440b44 | 107 | { |
magidimisi | 0:4965eb440b44 | 108 | Q1 = 1; |
magidimisi | 0:4965eb440b44 | 109 | Q2 = 0; |
magidimisi | 0:4965eb440b44 | 110 | Q3 = 0; |
magidimisi | 0:4965eb440b44 | 111 | Q4 = 1; |
magidimisi | 0:4965eb440b44 | 112 | Q5 = 1; |
magidimisi | 0:4965eb440b44 | 113 | Q6 = 0; |
magidimisi | 0:4965eb440b44 | 114 | Q7 = 0; |
magidimisi | 0:4965eb440b44 | 115 | Q8 = 1; |
magidimisi | 0:4965eb440b44 | 116 | Q9 = 1; |
magidimisi | 0:4965eb440b44 | 117 | Water_Valve (); |
magidimisi | 0:4965eb440b44 | 118 | Q11 = 0; |
magidimisi | 0:4965eb440b44 | 119 | Q12 = 0; |
magidimisi | 0:4965eb440b44 | 120 | } |
magidimisi | 0:4965eb440b44 | 121 | //////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 122 | |
magidimisi | 0:4965eb440b44 | 123 | ////////////////////////////////IT'S A SUB PROGRAM OF THE WATER SENSOR OPARATION//////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 124 | void Water_Sensor() |
magidimisi | 0:4965eb440b44 | 125 | { |
magidimisi | 0:4965eb440b44 | 126 | |
magidimisi | 0:4965eb440b44 | 127 | uint16_t senval; //Declare variable to store the water analog value after conversion - 16-bit |
magidimisi | 0:4965eb440b44 | 128 | uint32_t senval_sum; //Declare variable to store the water analog value sum in loop - 32-bit |
magidimisi | 0:4965eb440b44 | 129 | double senkvolt; //Declare 64-bit floating point data type to store water analog killovoltage value |
magidimisi | 0:4965eb440b44 | 130 | |
magidimisi | 0:4965eb440b44 | 131 | while(1) |
magidimisi | 0:4965eb440b44 | 132 | { |
magidimisi | 0:4965eb440b44 | 133 | //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), |
magidimisi | 0:4965eb440b44 | 134 | senval = Sen.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) |
magidimisi | 0:4965eb440b44 | 135 | senval_sum = senval_sum + senval; //Add every analog reading to the sum variable |
magidimisi | 0:4965eb440b44 | 136 | |
magidimisi | 0:4965eb440b44 | 137 | //calculate the voltage from the 16-bit value |
magidimisi | 0:4965eb440b44 | 138 | senkvolt = ((double)senval_sum* 0.00158) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double |
magidimisi | 0:4965eb440b44 | 139 | // 1 Volt = 1.58 litres then one kilolitres is 1580 acording to kyleconvert.com |
magidimisi | 0:4965eb440b44 | 140 | wait (0.2); |
magidimisi | 0:4965eb440b44 | 141 | } |
magidimisi | 0:4965eb440b44 | 142 | } |
magidimisi | 0:4965eb440b44 | 143 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 144 | |
magidimisi | 0:4965eb440b44 | 145 | ////////////////////////////////IT'S A SUB PROGRAM OF THE WATER METER OPARATION/////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 146 | void Water_Readings() |
magidimisi | 0:4965eb440b44 | 147 | { |
magidimisi | 0:4965eb440b44 | 148 | |
magidimisi | 0:4965eb440b44 | 149 | uint16_t watval; //Declare variable to store the water analog value after conversion - 16-bit |
magidimisi | 0:4965eb440b44 | 150 | uint32_t watval_sum; //Declare variable to store the water analog value sum in loop - 32-bit |
magidimisi | 0:4965eb440b44 | 151 | double watkvolt; //Declare 64-bit floating point data type to store water analog killovoltage value |
magidimisi | 0:4965eb440b44 | 152 | |
magidimisi | 0:4965eb440b44 | 153 | while(1) |
magidimisi | 0:4965eb440b44 | 154 | { |
magidimisi | 0:4965eb440b44 | 155 | //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), |
magidimisi | 0:4965eb440b44 | 156 | watval = Met.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) |
magidimisi | 0:4965eb440b44 | 157 | watval_sum = watval_sum + watval; //Add every analog reading to the sum variable |
magidimisi | 0:4965eb440b44 | 158 | |
magidimisi | 0:4965eb440b44 | 159 | //calculate the voltage from the 16-bit value |
magidimisi | 0:4965eb440b44 | 160 | watkvolt = ((double)watval_sum * 0.00158) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double |
magidimisi | 0:4965eb440b44 | 161 | // 1 Volt = 1.58 litres then one kilolitres is 1580 acording to kyleconvert.com |
magidimisi | 0:4965eb440b44 | 162 | METER = watkvolt; |
magidimisi | 0:4965eb440b44 | 163 | bt.printf(" %2.3f Volts \n", watkvolt); |
magidimisi | 0:4965eb440b44 | 164 | wait (0.2); |
magidimisi | 0:4965eb440b44 | 165 | Normal (); |
magidimisi | 0:4965eb440b44 | 166 | } |
magidimisi | 0:4965eb440b44 | 167 | } |
magidimisi | 0:4965eb440b44 | 168 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 169 | |
magidimisi | 0:4965eb440b44 | 170 | /////////////////////////////////////IT'S A SUB PROGRAM THAT TEST THE SOLAR PANNEL'S VOLTAGE VALUE///////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 171 | |
magidimisi | 0:4965eb440b44 | 172 | void Test_Solar() //The loop to test the Solar Panel's voltage |
magidimisi | 0:4965eb440b44 | 173 | { |
magidimisi | 0:4965eb440b44 | 174 | Q1 = 0; |
magidimisi | 0:4965eb440b44 | 175 | Q2 = 1; |
magidimisi | 0:4965eb440b44 | 176 | Q3 = 1; |
magidimisi | 0:4965eb440b44 | 177 | Q4 = 0; |
magidimisi | 0:4965eb440b44 | 178 | Q5 = 1; |
magidimisi | 0:4965eb440b44 | 179 | Q6 = 0; |
magidimisi | 0:4965eb440b44 | 180 | Q7 = 0; |
magidimisi | 0:4965eb440b44 | 181 | Q8 = 1; |
magidimisi | 0:4965eb440b44 | 182 | Q9 = 1; |
magidimisi | 0:4965eb440b44 | 183 | |
magidimisi | 0:4965eb440b44 | 184 | Q11 = 0; |
magidimisi | 0:4965eb440b44 | 185 | Q12 = 0; |
magidimisi | 0:4965eb440b44 | 186 | |
magidimisi | 0:4965eb440b44 | 187 | uint16_t solval; //Declare variable to store analog value after conversion - 16-bit |
magidimisi | 0:4965eb440b44 | 188 | double solvolt; //Declare 64-bit floating point data type to store analog voltage value |
magidimisi | 0:4965eb440b44 | 189 | |
magidimisi | 0:4965eb440b44 | 190 | while (1) |
magidimisi | 0:4965eb440b44 | 191 | |
magidimisi | 0:4965eb440b44 | 192 | { |
magidimisi | 0:4965eb440b44 | 193 | //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), |
magidimisi | 0:4965eb440b44 | 194 | solval = SolarVolt.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) |
magidimisi | 0:4965eb440b44 | 195 | |
magidimisi | 0:4965eb440b44 | 196 | //calculate the voltage from the 16-bit value |
magidimisi | 0:4965eb440b44 | 197 | solvolt = ((double)solval*5.9613) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double |
magidimisi | 0:4965eb440b44 | 198 | //5.9613 convert the voltage value to equeal the supply |
magidimisi | 0:4965eb440b44 | 199 | bt.printf("%2.3f Volts \n", solvolt); |
magidimisi | 0:4965eb440b44 | 200 | wait (5); |
magidimisi | 0:4965eb440b44 | 201 | Normal (); |
magidimisi | 0:4965eb440b44 | 202 | } |
magidimisi | 0:4965eb440b44 | 203 | } |
magidimisi | 0:4965eb440b44 | 204 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 205 | |
magidimisi | 0:4965eb440b44 | 206 | ////////////////////////////////IT'S A SUB PROGRAM THAT TEST THE HYDRO GENERATOR'S VOLTAGE VALUE/////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 207 | |
magidimisi | 0:4965eb440b44 | 208 | void Test_Hydro() // the loop to test the Hydro Generator's voltage |
magidimisi | 0:4965eb440b44 | 209 | { |
magidimisi | 0:4965eb440b44 | 210 | Q1 = 1; |
magidimisi | 0:4965eb440b44 | 211 | Q2 = 0; |
magidimisi | 0:4965eb440b44 | 212 | Q3 = 0; |
magidimisi | 0:4965eb440b44 | 213 | Q4 = 1; |
magidimisi | 0:4965eb440b44 | 214 | Q5 = 0; |
magidimisi | 0:4965eb440b44 | 215 | Q6 = 1; |
magidimisi | 0:4965eb440b44 | 216 | Q7 = 1; |
magidimisi | 0:4965eb440b44 | 217 | Q8 = 0; |
magidimisi | 0:4965eb440b44 | 218 | Q9 = 1; |
magidimisi | 0:4965eb440b44 | 219 | |
magidimisi | 0:4965eb440b44 | 220 | Q11 = 0; |
magidimisi | 0:4965eb440b44 | 221 | Q12 = 0; |
magidimisi | 0:4965eb440b44 | 222 | |
magidimisi | 0:4965eb440b44 | 223 | uint16_t hydval; //Declare variable to store analog value after conversion - 16-bit |
magidimisi | 0:4965eb440b44 | 224 | double hydvolt; //Declare 64-bit floating point data type to store analog voltage value |
magidimisi | 0:4965eb440b44 | 225 | |
magidimisi | 0:4965eb440b44 | 226 | while (1) |
magidimisi | 0:4965eb440b44 | 227 | |
magidimisi | 0:4965eb440b44 | 228 | { |
magidimisi | 0:4965eb440b44 | 229 | //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), |
magidimisi | 0:4965eb440b44 | 230 | hydval = HydroVolt.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) |
magidimisi | 0:4965eb440b44 | 231 | |
magidimisi | 0:4965eb440b44 | 232 | //calculate the voltage from the 16-bit value |
magidimisi | 0:4965eb440b44 | 233 | hydvolt = ((double)hydval * 5.9613) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double |
magidimisi | 0:4965eb440b44 | 234 | //5.9613 convert the voltage value to equeal the supply |
magidimisi | 0:4965eb440b44 | 235 | bt.printf("%2.3f Volts \n", hydvolt); |
magidimisi | 0:4965eb440b44 | 236 | wait (5); |
magidimisi | 0:4965eb440b44 | 237 | Normal(); |
magidimisi | 0:4965eb440b44 | 238 | } |
magidimisi | 0:4965eb440b44 | 239 | } |
magidimisi | 0:4965eb440b44 | 240 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 241 | |
magidimisi | 0:4965eb440b44 | 242 | /////////////////////////////////IT'S A SUB PROGRAM THAT TEST THE 12 VOLTS BATTERY'S VOLTAGE VALUE///////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 243 | void Test_Battery() // The loop to test the battery's voltage |
magidimisi | 0:4965eb440b44 | 244 | { |
magidimisi | 0:4965eb440b44 | 245 | Q1 = 0; |
magidimisi | 0:4965eb440b44 | 246 | Q2 = 0; |
magidimisi | 0:4965eb440b44 | 247 | Q3 = 0; |
magidimisi | 0:4965eb440b44 | 248 | Q4 = 0; |
magidimisi | 0:4965eb440b44 | 249 | Q5 = 0; |
magidimisi | 0:4965eb440b44 | 250 | Q6 = 0; |
magidimisi | 0:4965eb440b44 | 251 | Q7 = 0; |
magidimisi | 0:4965eb440b44 | 252 | Q8 = 0; |
magidimisi | 0:4965eb440b44 | 253 | |
magidimisi | 0:4965eb440b44 | 254 | Q9 = 0; |
magidimisi | 0:4965eb440b44 | 255 | Q11 = 1; |
magidimisi | 0:4965eb440b44 | 256 | Q12 = 1; |
magidimisi | 0:4965eb440b44 | 257 | |
magidimisi | 0:4965eb440b44 | 258 | uint16_t battval; //Declare variable to store analog value after conversion - 16-bit |
magidimisi | 0:4965eb440b44 | 259 | double battvolt; //Declare 64-bit floating point data type to store analog voltage value |
magidimisi | 0:4965eb440b44 | 260 | while (1) |
magidimisi | 0:4965eb440b44 | 261 | { |
magidimisi | 0:4965eb440b44 | 262 | //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), |
magidimisi | 0:4965eb440b44 | 263 | battval = BatVolt.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) |
magidimisi | 0:4965eb440b44 | 264 | |
magidimisi | 0:4965eb440b44 | 265 | //calculate the voltage from the 16-bit value |
magidimisi | 0:4965eb440b44 | 266 | battvolt = ((double)battval * 5.9613) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double |
magidimisi | 0:4965eb440b44 | 267 | // 5.9613 convert the voltage value to equeal the supply |
magidimisi | 0:4965eb440b44 | 268 | bt.printf(" %2.3f Volts \n", battvolt); |
magidimisi | 0:4965eb440b44 | 269 | wait (5); |
magidimisi | 0:4965eb440b44 | 270 | Normal (); |
magidimisi | 0:4965eb440b44 | 271 | } |
magidimisi | 0:4965eb440b44 | 272 | } |
magidimisi | 0:4965eb440b44 | 273 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 274 | |
magidimisi | 0:4965eb440b44 | 275 | ////////////////////////////DECLARATION OF INCOME MESSAGE AS A CHARACTORS THAT COMES FROM THE PHONE APP////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 276 | |
magidimisi | 0:4965eb440b44 | 277 | char btmsg[50]; //incoming message string |
magidimisi | 0:4965eb440b44 | 278 | int btmsg_counter = 0; //character position counter in the message string |
magidimisi | 0:4965eb440b44 | 279 | int new_btmsg = 0; //flag to indicate if a new complete message was received |
magidimisi | 0:4965eb440b44 | 280 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 281 | |
magidimisi | 0:4965eb440b44 | 282 | |
magidimisi | 0:4965eb440b44 | 283 | |
magidimisi | 0:4965eb440b44 | 284 | ////////////////////////////////IT'S A SUB PROGRAM THAT INTERRUPT THE ROUTINE WHEN A NEW CHARACTER ARRIVES///////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 285 | void btinterrupt() |
magidimisi | 0:4965eb440b44 | 286 | { |
magidimisi | 0:4965eb440b44 | 287 | char c; // declare the c as a charactor |
magidimisi | 0:4965eb440b44 | 288 | |
magidimisi | 0:4965eb440b44 | 289 | c = bt.getc(); //read the incoming character |
magidimisi | 0:4965eb440b44 | 290 | if(c == '\n') //if it is the terminating character |
magidimisi | 0:4965eb440b44 | 291 | { |
magidimisi | 0:4965eb440b44 | 292 | if(btmsg[btmsg_counter - 1] == '\r') |
magidimisi | 0:4965eb440b44 | 293 | btmsg[btmsg_counter - 1] = '\0'; |
magidimisi | 0:4965eb440b44 | 294 | else |
magidimisi | 0:4965eb440b44 | 295 | btmsg[btmsg_counter] = '\0'; |
magidimisi | 0:4965eb440b44 | 296 | new_btmsg = 1; //enable the new message flag to indicate a COMPLETE message was received |
magidimisi | 0:4965eb440b44 | 297 | btmsg_counter = 0; //clear the message string |
magidimisi | 0:4965eb440b44 | 298 | } |
magidimisi | 0:4965eb440b44 | 299 | else |
magidimisi | 0:4965eb440b44 | 300 | { |
magidimisi | 0:4965eb440b44 | 301 | btmsg[btmsg_counter] = c; //add the character to the message string |
magidimisi | 0:4965eb440b44 | 302 | btmsg_counter++; //move to the next character in the string |
magidimisi | 0:4965eb440b44 | 303 | } |
magidimisi | 0:4965eb440b44 | 304 | } |
magidimisi | 0:4965eb440b44 | 305 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 306 | |
magidimisi | 0:4965eb440b44 | 307 | /////////////////////////////////////////THE MAIN PROGRAM WHERE IT WILL CALL ALL THE SUB PROGRAM////////////////////////////////////////////// |
magidimisi | 0:4965eb440b44 | 308 | int main() { |
magidimisi | 0:4965eb440b44 | 309 | bt.attach(&btinterrupt); //if a new character arrives, call the interrupt service routine |
magidimisi | 0:4965eb440b44 | 310 | |
magidimisi | 0:4965eb440b44 | 311 | while(1) { |
magidimisi | 0:4965eb440b44 | 312 | Normal (); |
magidimisi | 0:4965eb440b44 | 313 | Water_Readings (); |
magidimisi | 0:4965eb440b44 | 314 | Water_Valve (); |
magidimisi | 0:4965eb440b44 | 315 | if(new_btmsg) { //check if there is a new message |
magidimisi | 0:4965eb440b44 | 316 | if(strcmp(btmsg, "SolarON") == 0) //message for SolarOn is ON |
magidimisi | 0:4965eb440b44 | 317 | Test_Solar(); |
magidimisi | 0:4965eb440b44 | 318 | else if(strcmp(btmsg, "HydrON") == 0) //message for HydroOn is ON |
magidimisi | 0:4965eb440b44 | 319 | Test_Hydro() ; |
magidimisi | 0:4965eb440b44 | 320 | else if(strcmp(btmsg, "BatteryON") == 0) //message for BatteryON is ON |
magidimisi | 0:4965eb440b44 | 321 | Test_Battery(); |
magidimisi | 0:4965eb440b44 | 322 | else if(strcmp(btmsg, "WaterON") == 0) //message for WaterOn is ON |
magidimisi | 0:4965eb440b44 | 323 | bt.printf("%2.3f Kl \n",METER); |
magidimisi | 0:4965eb440b44 | 324 | else if(strcmp(btmsg, "ValveOPEN") == 0) //message for for ValveOpen is ON |
magidimisi | 0:4965eb440b44 | 325 | OpenValve(); |
magidimisi | 0:4965eb440b44 | 326 | else if(strcmp(btmsg, "ValveClosed") == 0) //message for for ValveClosed is ON |
magidimisi | 0:4965eb440b44 | 327 | ClosedValve(); |
magidimisi | 0:4965eb440b44 | 328 | else |
magidimisi | 0:4965eb440b44 | 329 | bt.printf("Incorrect command\n"); //Reply incorrect command |
magidimisi | 0:4965eb440b44 | 330 | |
magidimisi | 0:4965eb440b44 | 331 | new_btmsg=0; //clear message flag |
magidimisi | 0:4965eb440b44 | 332 | } |
magidimisi | 0:4965eb440b44 | 333 | } |
magidimisi | 0:4965eb440b44 | 334 | } |
magidimisi | 0:4965eb440b44 | 335 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////// |