I have made some modification on the coding that I have used in my previous blogpost #11 Water sensor calibration so that the water dispenser will stop automaticly when the water level reaches the calibrated level.
BOM: PSoC6 WiFi-BT Prototyping Kit, a water pump, two 18650 battery, 18650 battery socket, 2 N-channel MOSFET, a push button, a buzzer, a red led, a green LED, 6x 10k ohm potentiometers, some jumper wires, a bread board, a water pump and hose, a 1.5L water bottle, a 500ml water bottle, bendable steel wire, a plastic tray, hot glue gun and glue sticks.
GitHub: https://github.com/wanfp97/PSoC6-Auto-Cutt-off-Water-Dispenser
Coding:
#include "cy_pdl.h" // include Peripheral Driver Library #include "cyhal.h" // include Hardware Abstraction Layer library #include "cycfg.h" // include device configurator library /******************************************************************************* * Function Prototypes ********************************************************************************/ static void button_intr_handler(void *handler_arg, cyhal_gpio_event_t event); static void wtr_sense_intr_handler(void *handler_arg, cyhal_gpio_event_t event); /******************************************************************************* * Global Variables ********************************************************************************/ volatile bool button_intr_flag = false; // Boolean type variable to store the interrupt flag volatile bool wtr_sense_intr_flag = false; // Boolean type variable to store the interrupt flag int main(void) { init_cycfg_all(); // configure pins as done in Device Configurator __enable_irq(); // enable interrupt cyhal_gpio_register_callback(button_HAL_PORT_PIN, button_intr_handler, NULL); // assigning isr handler for button cyhal_gpio_enable_event(button_HAL_PORT_PIN, CYHAL_GPIO_IRQ_RISE, 1u, true); // interrupt on rising edge (button pressed) cyhal_gpio_register_callback(wtr_sense_HAL_PORT_PIN, wtr_sense_intr_handler, NULL); // assigning isr handler for water sensor cyhal_gpio_enable_event(wtr_sense_HAL_PORT_PIN, CYHAL_GPIO_IRQ_FALL, 1u, true); // interrupt on falling edge (water level high) for (;;) { if (true == button_intr_flag) // if interrupt happens (button pressed) { button_intr_flag = false; // clear interrupt flag for further interrupt if(Cy_GPIO_ReadOut(water_pump_PORT, water_pump_NUM)==0UL) { Cy_GPIO_Write(green_PORT, green_NUM, 1UL); // green LED on Cy_GPIO_Write(water_pump_PORT, water_pump_NUM, 1UL); // on water pump } else { Cy_GPIO_Write(green_PORT, green_NUM, 0UL); // green LED off Cy_GPIO_Write(water_pump_PORT, water_pump_NUM, 0UL); // off water pump } } else; if(0UL == Cy_GPIO_Read(wtr_sense_PORT, wtr_sense_NUM)) { Cy_GPIO_Write(red_PORT, red_NUM, 1UL); // red LED on Cy_GPIO_Write(green_PORT, green_NUM, 0UL); // green LED off Cy_GPIO_Write(water_pump_PORT, water_pump_NUM, 0UL); // off water pump } else { Cy_GPIO_Write(red_PORT, red_NUM, 0UL); // red LED off } if( true == wtr_sense_intr_flag) // buzzer on for 0.5s { Cy_GPIO_Write(buzzer_PORT, buzzer_NUM, 1UL); // buzzer on cyhal_system_delay_ms(100); // delay 100 ms Cy_GPIO_Write(buzzer_PORT, buzzer_NUM, 0UL); // buzzer off wtr_sense_intr_flag = false; } } } /******************************************************************************* * Function Name: button_intr_handler ******************************************************************************** * Summary: * button GPIO interrupt handler. * * Parameters: * void *handler_arg (unused) * cyhal_gpio_irq_event_t (unused) * *******************************************************************************/ static void button_intr_handler(void *handler_arg, cyhal_gpio_irq_event_t event) { button_intr_flag = true; } /******************************************************************************* * Function Name: wtr_sense_intr_handler ******************************************************************************** * Summary: * water sensor GPIO interrupt handler. * * Parameters: * void *handler_arg (unused) * cyhal_gpio_irq_event_t (unused) * *******************************************************************************/ static void wtr_sense_intr_handler(void *handler_arg, cyhal_gpio_irq_event_t event) { wtr_sense_intr_flag = true; }
Water Dispenser operation video: