I designed a pond filler using ESP32 logic to automatically fill a pond once it has dropped below a certain amount of water.
This project was originally made as an excuse to relearn freeRTOS, as my school projects never went beyond a couple hundred lines of C. However, it became increasingly apparent that I had to learn increasingly more topics in order to implement this project.
Origins
I had bought a solenoid valve a couple of years ago as a bright-eyed, hopeful freshman, thinking that I would be able to automate my home with a couple of weeks in school. It turns out that my ambitions were greater than my knowledge, as it took me four years to understand that just because I know how to calculate the voltage across a resistor doesn't mean that I can handle a full-stack project from start to end.
What started as an exercise in RTOS fundamentals quickly became an exercise in fluid dynamics, which then evolved into an exercise in board design as I began to lose my mind connecting dozens of grounds together on a breadboard and sanity checking multiple times.

The Process
When designing projects such as Quadconn, I thought that the hardware was easier than software; in my mind, hardware remains largely static, while software generally takes a larger amount of work because of how fast you can iterate. While working on this project, I still somewhat stand by my choice. However, I would like to amend the statement somewhat: hardware is simpler, not easier.

Testing and iteration is infinitely easier in software when compared to hardware. Originally, I wanted to add an auto-calibration feature to the pond filler, as it currently works with hard-coded ADC values that I manually tested from relatively clean water. However, just wiring another button into the circuit would mean hours of work resoldering pins and connections.
Furthermore, I have to consider the fact
