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
main.cpp@1:766cbce5e5b7, 2020-10-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |