A water flow control system using a LCD display, a rotary encoder KY-040 and a YF-S201 water flow sensor. It uses DebounceIn to generate interrupts from rotary encoder signal.

Dependencies:   mbed DebounceIn TextLCD

Committer:
armochim
Date:
Mon Oct 05 12:44:55 2020 +0000
Revision:
1:766cbce5e5b7
Parent:
0:3588368c5b3c
A water flow control system using a LCD display, a KY-040 type rotary encoder and a YF-S201 water flow sensor.Uses DebounceIn to generate interrupts from rotary encoder signal

Who changed what in which revision?

UserRevisionLine numberNew contents of line
armochim 1:766cbce5e5b7 1 /* A waterflow system based on a demo program for DebounceIn
takuo 0:3588368c5b3c 2 * Takuo WATANABE
takuo 0:3588368c5b3c 3 * http://mbed.org/users/takuo/code/DebounceIn/
armochim 1:766cbce5e5b7 4 * Uses a rotary encoder Ky-040 and a YF-S201 as a water flow sensor
takuo 0:3588368c5b3c 5 */
takuo 0:3588368c5b3c 6
takuo 0:3588368c5b3c 7 #include "mbed.h"
takuo 0:3588368c5b3c 8 #include "DebounceIn.h"
armochim 1:766cbce5e5b7 9 #include "TextLCD.h"
armochim 1:766cbce5e5b7 10 DigitalOut rele(PA_12);
armochim 1:766cbce5e5b7 11 DigitalOut led(PC_13);
armochim 1:766cbce5e5b7 12 I2C i2c_lcd(PB_9,PB_8); // SDA, SCL
armochim 1:766cbce5e5b7 13 TextLCD_I2C lcd(&i2c_lcd, 0x7E, TextLCD::LCD16x2, TextLCD::HD44780); // I2C bus, PCF8574 Slaveaddress, LCD Type, Device Type
armochim 1:766cbce5e5b7 14 InterruptIn sensor(PA_15);// Interrupt pin for the water flow sensor YF-S201
armochim 1:766cbce5e5b7 15 float Calc; //The sensor gives 450 pulses per liter
armochim 1:766cbce5e5b7 16 float FlowMililiter,TotalMililiter,mil; //Variables to calculate the water flow
armochim 1:766cbce5e5b7 17 float CorrectionFactor=0.23;//to correct the volume through the sensor
armochim 1:766cbce5e5b7 18 int NbTopsFan; // To keep track os YF-S201 pulses
armochim 1:766cbce5e5b7 19 DebounceIn buttonSW(PB_6);//Roary encoder button switch
armochim 1:766cbce5e5b7 20 DebounceIn buttonA(PB_3);//CLK of sensor. Pin to generate the interrupt
armochim 1:766cbce5e5b7 21 bool flag=false; //flag used to control the program
armochim 1:766cbce5e5b7 22 volatile float virtualPosition=0;//Position of the shaft
takuo 0:3588368c5b3c 23
armochim 1:766cbce5e5b7 24
armochim 1:766cbce5e5b7 25
armochim 1:766cbce5e5b7 26 int i=0;
armochim 1:766cbce5e5b7 27
armochim 1:766cbce5e5b7 28 void lcd_initiation()
armochim 1:766cbce5e5b7 29 {
armochim 1:766cbce5e5b7 30 lcd.setMode(TextLCD::DispOn); //DispOff, DispOn
armochim 1:766cbce5e5b7 31 lcd.setBacklight(TextLCD::LightOff);//LightOff, LightOn /LightOff BackLight is on!!
armochim 1:766cbce5e5b7 32 lcd.setCursor(TextLCD::CurOff_BlkOff);//CurOff_BlkOff, CurOn_BlkOff, CurOff_BlkOn, CurOn_BlkOn
armochim 1:766cbce5e5b7 33
armochim 1:766cbce5e5b7 34 }
armochim 1:766cbce5e5b7 35
armochim 1:766cbce5e5b7 36 void setpoint()
armochim 1:766cbce5e5b7 37 {
armochim 1:766cbce5e5b7 38 lcd.cls();
armochim 1:766cbce5e5b7 39 lcd.locate(5,0);
armochim 1:766cbce5e5b7 40 lcd.printf("ZarBeer");
armochim 1:766cbce5e5b7 41 lcd.locate(0,1);
armochim 1:766cbce5e5b7 42 lcd.printf("Setpoint: %.1f",virtualPosition);
armochim 1:766cbce5e5b7 43 }
armochim 1:766cbce5e5b7 44
armochim 1:766cbce5e5b7 45
armochim 1:766cbce5e5b7 46
armochim 1:766cbce5e5b7 47 void cw() {if (!DigitalIn(PB_4)) virtualPosition+=0.5;
armochim 1:766cbce5e5b7 48 else
armochim 1:766cbce5e5b7 49 virtualPosition-=0.5;
armochim 1:766cbce5e5b7 50 if(virtualPosition>20){virtualPosition=20;}
armochim 1:766cbce5e5b7 51 if(virtualPosition<0){virtualPosition=0;}
armochim 1:766cbce5e5b7 52 setpoint();
armochim 1:766cbce5e5b7 53 }
armochim 1:766cbce5e5b7 54
armochim 1:766cbce5e5b7 55 void rpm() //This function increments on the rising edge of the hall effect sensors signal
armochim 1:766cbce5e5b7 56 {
armochim 1:766cbce5e5b7 57 NbTopsFan++;
armochim 1:766cbce5e5b7 58 }
armochim 1:766cbce5e5b7 59
armochim 1:766cbce5e5b7 60 //After define the set point the valve is open and the water is added until the setpoint.
armochim 1:766cbce5e5b7 61 void adiciona()
armochim 1:766cbce5e5b7 62 {
armochim 1:766cbce5e5b7 63 while(1) {
armochim 1:766cbce5e5b7 64 rele=1;//Open solenoid valve
armochim 1:766cbce5e5b7 65 NbTopsFan = 0; //Set NbTops to 0 ready for calculations
armochim 1:766cbce5e5b7 66
armochim 1:766cbce5e5b7 67 sensor.rise(&rpm); //Enables rising edge interrupt
armochim 1:766cbce5e5b7 68 wait_ms(1000); //Wait 1 second and count HALL pulses
armochim 1:766cbce5e5b7 69 sensor.rise(NULL); //Disable interrupt
armochim 1:766cbce5e5b7 70
armochim 1:766cbce5e5b7 71 Calc = (NbTopsFan / 7.5)*(1+CorrectionFactor); //(Pulse frequency x 60) / 7.5Q, = flow rate in L/hour
armochim 1:766cbce5e5b7 72 FlowMililiter=Calc/60;//Flow in minutes. The sensor gives Pulse Frequency/7.5 equals l/min
armochim 1:766cbce5e5b7 73 TotalMililiter+=FlowMililiter;//Add the flow to calculate the total volume that was added.
armochim 1:766cbce5e5b7 74 lcd.cls(); //Clear the LCD screen
armochim 1:766cbce5e5b7 75 lcd.locate(0,0);//
armochim 1:766cbce5e5b7 76 lcd.printf("Fl:%.2f",Calc);
armochim 1:766cbce5e5b7 77 lcd.locate(0,1);
armochim 1:766cbce5e5b7 78 lcd.printf("V:%.2f",TotalMililiter);
armochim 1:766cbce5e5b7 79 lcd.locate(8,1);
armochim 1:766cbce5e5b7 80 lcd.printf("SP: %.1f",virtualPosition);
armochim 1:766cbce5e5b7 81 if(TotalMililiter>=virtualPosition)
armochim 1:766cbce5e5b7 82 {rele=0; //Turn off solenoid valve
armochim 1:766cbce5e5b7 83 lcd.cls();
armochim 1:766cbce5e5b7 84 lcd.locate(0,1);
armochim 1:766cbce5e5b7 85 lcd.printf(" Acabou!");
armochim 1:766cbce5e5b7 86 led=0;
armochim 1:766cbce5e5b7 87 Calc=0;
armochim 1:766cbce5e5b7 88 FlowMililiter=0;
armochim 1:766cbce5e5b7 89 TotalMililiter=0;
armochim 1:766cbce5e5b7 90 virtualPosition=0;
armochim 1:766cbce5e5b7 91 wait(3);
armochim 1:766cbce5e5b7 92 return;
armochim 1:766cbce5e5b7 93 }
armochim 1:766cbce5e5b7 94
armochim 1:766cbce5e5b7 95 }
armochim 1:766cbce5e5b7 96 }
armochim 1:766cbce5e5b7 97 //Set the desired volume
armochim 1:766cbce5e5b7 98 void confirma() {
armochim 1:766cbce5e5b7 99
armochim 1:766cbce5e5b7 100 lcd.locate(0,1);
armochim 1:766cbce5e5b7 101 lcd.printf("Confirma: %.1f L", virtualPosition);
armochim 1:766cbce5e5b7 102 while(flag==true) {
armochim 1:766cbce5e5b7 103 led=1;
armochim 1:766cbce5e5b7 104 }
armochim 1:766cbce5e5b7 105 return;
armochim 1:766cbce5e5b7 106 }
armochim 1:766cbce5e5b7 107 void SW() {
armochim 1:766cbce5e5b7 108 lcd.cls();
armochim 1:766cbce5e5b7 109 if (flag==true) {flag=false;}
armochim 1:766cbce5e5b7 110 else {flag=true;}
armochim 1:766cbce5e5b7 111 }
armochim 1:766cbce5e5b7 112
takuo 0:3588368c5b3c 113
takuo 0:3588368c5b3c 114 int main() {
armochim 1:766cbce5e5b7 115 lcd_initiation();
armochim 1:766cbce5e5b7 116
armochim 1:766cbce5e5b7 117
armochim 1:766cbce5e5b7 118 buttonA.rise(cw);
armochim 1:766cbce5e5b7 119 buttonSW.fall(SW);
takuo 0:3588368c5b3c 120 while (true) {
armochim 1:766cbce5e5b7 121 if (flag==true){
armochim 1:766cbce5e5b7 122 confirma();
armochim 1:766cbce5e5b7 123 adiciona();
armochim 1:766cbce5e5b7 124
armochim 1:766cbce5e5b7 125 }
takuo 0:3588368c5b3c 126 }
takuo 0:3588368c5b3c 127 }