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
- Committer:
- armochim
- Date:
- 2020-10-05
- Revision:
- 1:766cbce5e5b7
- Parent:
- 0:3588368c5b3c
File content as of revision 1:766cbce5e5b7:
/* A waterflow system based on a demo program for DebounceIn * Takuo WATANABE * http://mbed.org/users/takuo/code/DebounceIn/ * Uses a rotary encoder Ky-040 and a YF-S201 as a water flow sensor */ #include "mbed.h" #include "DebounceIn.h" #include "TextLCD.h" DigitalOut rele(PA_12); DigitalOut led(PC_13); I2C i2c_lcd(PB_9,PB_8); // SDA, SCL TextLCD_I2C lcd(&i2c_lcd, 0x7E, TextLCD::LCD16x2, TextLCD::HD44780); // I2C bus, PCF8574 Slaveaddress, LCD Type, Device Type InterruptIn sensor(PA_15);// Interrupt pin for the water flow sensor YF-S201 float Calc; //The sensor gives 450 pulses per liter float FlowMililiter,TotalMililiter,mil; //Variables to calculate the water flow float CorrectionFactor=0.23;//to correct the volume through the sensor int NbTopsFan; // To keep track os YF-S201 pulses DebounceIn buttonSW(PB_6);//Roary encoder button switch DebounceIn buttonA(PB_3);//CLK of sensor. Pin to generate the interrupt bool flag=false; //flag used to control the program volatile float virtualPosition=0;//Position of the shaft int i=0; void lcd_initiation() { lcd.setMode(TextLCD::DispOn); //DispOff, DispOn lcd.setBacklight(TextLCD::LightOff);//LightOff, LightOn /LightOff BackLight is on!! lcd.setCursor(TextLCD::CurOff_BlkOff);//CurOff_BlkOff, CurOn_BlkOff, CurOff_BlkOn, CurOn_BlkOn } void setpoint() { lcd.cls(); lcd.locate(5,0); lcd.printf("ZarBeer"); lcd.locate(0,1); lcd.printf("Setpoint: %.1f",virtualPosition); } void cw() {if (!DigitalIn(PB_4)) virtualPosition+=0.5; else virtualPosition-=0.5; if(virtualPosition>20){virtualPosition=20;} if(virtualPosition<0){virtualPosition=0;} setpoint(); } void rpm() //This function increments on the rising edge of the hall effect sensors signal { NbTopsFan++; } //After define the set point the valve is open and the water is added until the setpoint. void adiciona() { while(1) { rele=1;//Open solenoid valve NbTopsFan = 0; //Set NbTops to 0 ready for calculations sensor.rise(&rpm); //Enables rising edge interrupt wait_ms(1000); //Wait 1 second and count HALL pulses sensor.rise(NULL); //Disable interrupt Calc = (NbTopsFan / 7.5)*(1+CorrectionFactor); //(Pulse frequency x 60) / 7.5Q, = flow rate in L/hour FlowMililiter=Calc/60;//Flow in minutes. The sensor gives Pulse Frequency/7.5 equals l/min TotalMililiter+=FlowMililiter;//Add the flow to calculate the total volume that was added. lcd.cls(); //Clear the LCD screen lcd.locate(0,0);// lcd.printf("Fl:%.2f",Calc); lcd.locate(0,1); lcd.printf("V:%.2f",TotalMililiter); lcd.locate(8,1); lcd.printf("SP: %.1f",virtualPosition); if(TotalMililiter>=virtualPosition) {rele=0; //Turn off solenoid valve lcd.cls(); lcd.locate(0,1); lcd.printf(" Acabou!"); led=0; Calc=0; FlowMililiter=0; TotalMililiter=0; virtualPosition=0; wait(3); return; } } } //Set the desired volume void confirma() { lcd.locate(0,1); lcd.printf("Confirma: %.1f L", virtualPosition); while(flag==true) { led=1; } return; } void SW() { lcd.cls(); if (flag==true) {flag=false;} else {flag=true;} } int main() { lcd_initiation(); buttonA.rise(cw); buttonSW.fall(SW); while (true) { if (flag==true){ confirma(); adiciona(); } } }