Monwabisi Magidimisi
/
EHWM
electronic water meter system
Revision 0:4965eb440b44, committed 2021-02-10
- Comitter:
- magidimisi
- Date:
- Wed Feb 10 10:18:23 2021 +0000
- Commit message:
- Electronic water meter
Changed in this revision
diff -r 000000000000 -r 4965eb440b44 Comms.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Comms.lib Wed Feb 10 10:18:23 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/Armand/code/Comms/#7d01a895b45d
diff -r 000000000000 -r 4965eb440b44 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Feb 10 10:18:23 2021 +0000 @@ -0,0 +1,335 @@ +/*########################################################################################## + +Program Name : ex1_HC06_leds +Author : Grant Phillips +Date Modified : 12/05/2016 +Compiler : ARMmbed +Tested On : STM32F4-Discovery +Discription : I used some of the program to develop mine Elecrtonic Householder Water Meter +##############################################################################################*/ +///////////////////////DECLARING LIBRIES//////////////////////////////////////////////////////// + +#include "mbed.h" +////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////DECLARING BLUETOOTH MODULE PINS////////////////////////////////////////////////////// + +Serial bt(PC_10, PC_11); //create a Serial object to connect to the HC05 Bluetooth module +// tx , rx +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////DECLARING SOLAR PANEL TRANSISTOR'S OPARATIONAL PINS/////////////////////////////////////////////////////////////////////////////////// + +DigitalOut Q1(PA_10); // Solar Panel Forward bias (Q1)transistor for the posistive leg +DigitalOut Q2(PB_3); // Solar Panel Voltage testing loop forward bias Q2 for the positive leg of the loop +DigitalOut Q3(PB_5); // Solar Panel Voltage testing loop forward bias Q3 for the negetive leg of the loop back to the Solar +DigitalOut Q4(PB_4); // Solar Panel Forward bias (Q4)transistor for the negetive leg +AnalogIn SolarVolt(PC_0); // Solar Panel supply Voltage +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////DECLARING HYDRO GENERATION TRANSISTOR'S OPARATIONAL PINS/////////////////////////////////////////// + +DigitalOut Q5(PB_13); //Hydro Generator Forward bias Q5 transistor for the posistive leg +DigitalOut Q6(PB_14); //Hydro Generator Voltage testing loop bias Q6 for the positive leg of the loop +DigitalOut Q7(PB_15); //Hydro Generator Voltage testing loop bias Q7 for the negetive leg of the loop back to the hydro +DigitalOut Q8(PB_2); //Hydro Generator Forward bias Q8 transistor nfor the egetive leg +AnalogIn HydroVolt(PC_1); //Hydro Generator supply Voltage +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////DECLARING FAN TRANSISTOR'S PIN/////////////////////////////////////////// + +DigitalOut Q9(PC_6); // Forward bias to keep the fan on +//////////////////////////////////////////////////////////////////////////////// + +///////////////////////////DECLARING WATER VALVE TRANSISTOR'S PIN////////////// + +DigitalOut Q10(PC_8); // Forward bias to keep the valve open +///////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////DECLARING BATTERY TRANSISTOR'S OPARATIONAL PINS///////////////////////////////////////////////// + +DigitalOut Q11(PB_8); // Battery Voltage testing loop bias Q11 for the positive leg of the loop +DigitalOut Q12(PC_9); // Battery Voltage testing loop biasing Q12 for the negative leg of the loop down to nuetral of the load +AnalogIn BatVolt(PA_4); // Battery Panel supply Voltage +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////DECLARING WATER METER TRANSISTOR'S OPARATIONAL PIN/////////////////////////////////// + +AnalogIn Met(PA_1); // Water meter +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +////////DECLARING WATER SENSOR TRANSISTOR'S OPARATIONAL PIN/////////////////////////////// +AnalogIn Sen(PA_0); //Water Sensor +////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////DECLARING WATER METER VARABLE////////////////////////////////// + +double METER; // Water Meter varable that posses a the current Kiloliter value + +////////////////////////////////////////////////////////////////////////////////////////// + + +////////////IT'S A SUB PROGRAM THAT CLOSES THE WATER VALVE///////////// +void ClosedValve() + { + Q10 = 0; + } +//////////////////////////////////////////////////////////////////// + +///////////////////////IT'S A SUB PROGRAM THAT OPENS THE WATER VALVE//////////////////////// +void OpenValve () + { + Q10 = 1; + } +//////////////////////////////////////////////////////////////////////// + +/////////////////IT'S A SUB PROGRAM THAT COMPARES THE WATER METER AND THE WATER SENSOR VALUES THAT ARE EQUAL/////////////// +void Water_Valve () + { + while (1) + { + if (Met.read_u16() != Sen.read_u16()) + { + ClosedValve(); + wait (0.2); + } + else + { + OpenValve (); + } + } + } +/////////////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////NORMAL OPARATIONS SUB PROGRAM WHICH BIAS THE TRANSISTORS////////////////// + +void Normal() // When every thing is running normal +{ + Q1 = 1; + Q2 = 0; + Q3 = 0; + Q4 = 1; + Q5 = 1; + Q6 = 0; + Q7 = 0; + Q8 = 1; + Q9 = 1; + Water_Valve (); + Q11 = 0; + Q12 = 0; +} +//////////////////////////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////IT'S A SUB PROGRAM OF THE WATER SENSOR OPARATION//////////////////////////////////////////////////////////////// +void Water_Sensor() +{ + +uint16_t senval; //Declare variable to store the water analog value after conversion - 16-bit +uint32_t senval_sum; //Declare variable to store the water analog value sum in loop - 32-bit +double senkvolt; //Declare 64-bit floating point data type to store water analog killovoltage value + + while(1) + { + //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), + senval = Sen.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) + senval_sum = senval_sum + senval; //Add every analog reading to the sum variable + + //calculate the voltage from the 16-bit value + senkvolt = ((double)senval_sum* 0.00158) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double + // 1 Volt = 1.58 litres then one kilolitres is 1580 acording to kyleconvert.com + wait (0.2); + } +} +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////IT'S A SUB PROGRAM OF THE WATER METER OPARATION/////////////////////////////////////////////////////////////// +void Water_Readings() +{ + +uint16_t watval; //Declare variable to store the water analog value after conversion - 16-bit +uint32_t watval_sum; //Declare variable to store the water analog value sum in loop - 32-bit +double watkvolt; //Declare 64-bit floating point data type to store water analog killovoltage value + +while(1) + { + //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), + watval = Met.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) + watval_sum = watval_sum + watval; //Add every analog reading to the sum variable + + //calculate the voltage from the 16-bit value + watkvolt = ((double)watval_sum * 0.00158) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double + // 1 Volt = 1.58 litres then one kilolitres is 1580 acording to kyleconvert.com + METER = watkvolt; + bt.printf(" %2.3f Volts \n", watkvolt); + wait (0.2); + Normal (); + } +} +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////IT'S A SUB PROGRAM THAT TEST THE SOLAR PANNEL'S VOLTAGE VALUE///////////////////////////////////////////// + +void Test_Solar() //The loop to test the Solar Panel's voltage +{ + Q1 = 0; + Q2 = 1; + Q3 = 1; + Q4 = 0; + Q5 = 1; + Q6 = 0; + Q7 = 0; + Q8 = 1; + Q9 = 1; + + Q11 = 0; + Q12 = 0; + + uint16_t solval; //Declare variable to store analog value after conversion - 16-bit + double solvolt; //Declare 64-bit floating point data type to store analog voltage value + + while (1) + + { + //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), + solval = SolarVolt.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) + + //calculate the voltage from the 16-bit value + solvolt = ((double)solval*5.9613) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double + //5.9613 convert the voltage value to equeal the supply + bt.printf("%2.3f Volts \n", solvolt); + wait (5); + Normal (); + } +} +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////IT'S A SUB PROGRAM THAT TEST THE HYDRO GENERATOR'S VOLTAGE VALUE/////////////////////////////////////////////// + +void Test_Hydro() // the loop to test the Hydro Generator's voltage +{ + Q1 = 1; + Q2 = 0; + Q3 = 0; + Q4 = 1; + Q5 = 0; + Q6 = 1; + Q7 = 1; + Q8 = 0; + Q9 = 1; + + Q11 = 0; + Q12 = 0; + + uint16_t hydval; //Declare variable to store analog value after conversion - 16-bit + double hydvolt; //Declare 64-bit floating point data type to store analog voltage value + + while (1) + + { + //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), + hydval = HydroVolt.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) + + //calculate the voltage from the 16-bit value + hydvolt = ((double)hydval * 5.9613) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double + //5.9613 convert the voltage value to equeal the supply + bt.printf("%2.3f Volts \n", hydvolt); + wait (5); + Normal(); + } +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////IT'S A SUB PROGRAM THAT TEST THE 12 VOLTS BATTERY'S VOLTAGE VALUE///////////////////////////////////////////// +void Test_Battery() // The loop to test the battery's voltage +{ + Q1 = 0; + Q2 = 0; + Q3 = 0; + Q4 = 0; + Q5 = 0; + Q6 = 0; + Q7 = 0; + Q8 = 0; + + Q9 = 0; + Q11 = 1; + Q12 = 1; + +uint16_t battval; //Declare variable to store analog value after conversion - 16-bit +double battvolt; //Declare 64-bit floating point data type to store analog voltage value +while (1) + { + //read the 16-bit value from the analog pin, The STM32F4-Trainer only supports 12-bit A/D (0 - 4095), + battval = BatVolt.read_u16(); //but the read_u16 function converts it to a 16-bit value (0 - 65535) + + //calculate the voltage from the 16-bit value + battvolt = ((double)battval * 5.9613) / 65535.0 * 3.3; //cast analogval to a double data type for formula to store result as double + // 5.9613 convert the voltage value to equeal the supply + bt.printf(" %2.3f Volts \n", battvolt); + wait (5); + Normal (); + } +} +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +////////////////////////////DECLARATION OF INCOME MESSAGE AS A CHARACTORS THAT COMES FROM THE PHONE APP////////////////////////////////////// + +char btmsg[50]; //incoming message string +int btmsg_counter = 0; //character position counter in the message string +int new_btmsg = 0; //flag to indicate if a new complete message was received +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +////////////////////////////////IT'S A SUB PROGRAM THAT INTERRUPT THE ROUTINE WHEN A NEW CHARACTER ARRIVES///////////////////////////////////////////// +void btinterrupt() +{ + char c; // declare the c as a charactor + + c = bt.getc(); //read the incoming character + if(c == '\n') //if it is the terminating character + { + if(btmsg[btmsg_counter - 1] == '\r') + btmsg[btmsg_counter - 1] = '\0'; + else + btmsg[btmsg_counter] = '\0'; + new_btmsg = 1; //enable the new message flag to indicate a COMPLETE message was received + btmsg_counter = 0; //clear the message string + } + else + { + btmsg[btmsg_counter] = c; //add the character to the message string + btmsg_counter++; //move to the next character in the string + } +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////THE MAIN PROGRAM WHERE IT WILL CALL ALL THE SUB PROGRAM////////////////////////////////////////////// +int main() { + bt.attach(&btinterrupt); //if a new character arrives, call the interrupt service routine + + while(1) { + Normal (); + Water_Readings (); + Water_Valve (); + if(new_btmsg) { //check if there is a new message + if(strcmp(btmsg, "SolarON") == 0) //message for SolarOn is ON + Test_Solar(); + else if(strcmp(btmsg, "HydrON") == 0) //message for HydroOn is ON + Test_Hydro() ; + else if(strcmp(btmsg, "BatteryON") == 0) //message for BatteryON is ON + Test_Battery(); + else if(strcmp(btmsg, "WaterON") == 0) //message for WaterOn is ON + bt.printf("%2.3f Kl \n",METER); + else if(strcmp(btmsg, "ValveOPEN") == 0) //message for for ValveOpen is ON + OpenValve(); + else if(strcmp(btmsg, "ValveClosed") == 0) //message for for ValveClosed is ON + ClosedValve(); + else + bt.printf("Incorrect command\n"); //Reply incorrect command + + new_btmsg=0; //clear message flag + } + } +} +/////////////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file
diff -r 000000000000 -r 4965eb440b44 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Feb 10 10:18:23 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file