The "Hi Thirsty Plant!" device connected to two plants. The hand is placed above the sensor, indicating how to trigger the water pump.
This plant watering device named "Hi thirsty plant" is designed to water the plants whenever my hand is over the sensor when the switch is off. When the switch is turned on, it activates the auto-watering mode which waters the plant every 3 days.
Overall photo for proportion and scale. The plant watering device is around 10 inch tall and 6 inch wide.
Water tank cover. Remove to add water or check water level.
Device in usage. Water is being pumped through the motor.
Internal electric components of the device.
The switch snaps into a slot on the top part of the 3D print.
(Narration is included in the video)
This is my initial sketch of how my plant watering system would look like and a simple block diagram that indicates the inputs and outputs. In this sketch, I envisioned myself remotely pressing the button to trigger the water. For the sensor, I envisioned it as a motion detector.
This is my updated sketch, with the sensor being a proximity sensor and the remote control being changed to an auto-watering system. A toggle switch is added so that the modes can be switched.
This is a picture of me attempting to fit all my electric components for the first time, after receiving the initial 3D print. The wires were tangled and it was hard to figure out the best placement of everything.
This is the first 3D print that I received, which has a really bad quality fillet due to the orientation I printed it. However, it gave me the chance to test whether my switch and my sensor fit into the slots or not. Eventually I printed it again with some adjustments in the dimensions of the slots and a flip in orientation.
This is the bottom part of my housing, I added a bottom layer for more water storage space.
This is the top part of my housing, which consists a hole for filling water, and slots for the switch and the sensor.
This is the cap for the water tank, preventing evaporation. It has a little handle that is shaped in a water droplet.
I started prototyping by figuring out how the electric components work since that could provide me a better understanding of the size and form of the housing. Afterwards, I used SolidWorks to model my housing and I found it challenging because of limited experience in modeling. Tolerance is a big component that I had to keep in mind since my housing involves interlocking mechanisms. Lots of calculations went in my brain and a lot of double checking. It took me a while to figure out how I could enable myself to pour water in directly without having to take the housing apart. I was uncertain about how waterproof the 3D prints would be but gladly it was just fine with 3 layers of wall.
During the in-class critic, Sukie mentioned that "It would be so fun if with the hand over the device it provides some other kind of interaction", which is something that I've never thought of! I think it would be really interesting to have a watering sound track being played to indicate the water flowing or a LED shinning blue. Rion said "I wonder if there would be a way to “hide” the tubes", and I agree that it would make the design much cleaner if I were able to hide the tube. Maybe I could've printed a 3D print cover or have some flexible material wrapped around the tube.
Overall, I'm really happy with the final outcome of the project, which I have already started using during my daily life. It satisfies my goal of being able to conveniently water my plant without detaching from my plant completely, and it also ensures that my plants are watered when I'm away from home. I learned a lot about 3D modeling and 3D printing through the project, especially considerations like tolerance and 3D printing settings. I learned that I actually enjoy connecting the electric components a lot, and that it was really satisfying to see it pumping the water. I realized that I chose circular form without too much experimentation with other forms, and the main reason I had in mind was that the twist-lock mechanism wasn't going to work for rectangular shapes. However, there's many other mechanisms that I could've used such as using screws, which could've allowed me to play around with a different form. If I were to have more time, I would build housings for the Arduino boards and breadboards to make maintenance easier, instead of having the wires messy within the housing. Through the final critic, I got inspired to switch the input around -- instead of holding my hand in front of the sensor for 1.5 seconds, I can have the input to be "make a funny face" or even "do a little dance". In the future, when I collect more plants, I could extend the tubes and split them so that I can water all of them at once. If I have the capacity, I could rebuild the housing to have a transparent side so that I can see the water level like a kettle.
block diagram for "Hi thirsty plant"
Electric schematic for "Hi thirsty plant"
/*
Project Title: "Hi Thirsty Plant!"
Designer: May Zhang
Description: When the rocket switch is off, the pump runs every 15 seconds (this is just for demostration, in real life, it runs every 3 days) for 7 seconds. When the rocket swtich is on, the pump runs for 7 seoncds everytime my hand is placed above the sensor (0-15mm) for 1.5 seconds.
pin mapping
Pin Role Description
A0 Input (Analog) Sensor Pin: Attached to the output of an IR proximity sensor (Range: 340 to 1023).
2 Input (Pullup) Switch Pin: Likely a manual override or a limit switch to trigger/stop the system.
3 Output (PWM) PWM A Pin: Controls the speed of the motor/pump via Pulse Width Modulation.
4 Output (Digital) AIN1 Pin: Direction control 1 for the motor driver (e.g., L298N or TB6612FNG)."
5 Output (Digital) AIN2 Pin: Direction control 2 for the motor driver.
Credits: thanks for Gemini's help with writing the code
*/
// --- Pin Definitions ---
const int sensorPin = A0;
const int switchPin = 2;
const int pwmAPin = 3;
const int ain1Pin = 4;
const int ain2Pin = 5;
// --- Settings ---
const int pumpDuration = 7000; // Run pump for 7 seconds
const unsigned long timerInterval = 15000; // gap is 15 seconds
const int distLow = 340; // Hand present threshold
const int distHigh = 1023; // Maxed out for very close range (0-15mm)
const int confirmTime = 1500; // Now 1.5 seconds
// --- Variables ---
unsigned long lastTimerWater = 0;
unsigned long sensorMatchStartTime = 0;
bool isMatching = false;
void setup() {
Serial.begin(9600);
pinMode(pwmAPin, OUTPUT);
pinMode(ain1Pin, OUTPUT);
pinMode(ain2Pin, OUTPUT);
pinMode(switchPin, INPUT_PULLUP);
Serial.println("System Online. 1.5s Trigger Active.");
}
void loop() {
unsigned long currentMillis = millis();
bool timerModeActive = (digitalRead(switchPin) == LOW);
if (timerModeActive) {
isMatching = false;
if (currentMillis - lastTimerWater >= timerInterval) {
lastTimerWater = currentMillis;
triggerPump();
}
} else {
lastTimerWater = currentMillis;
int sensorValue = analogRead(sensorPin);
if (sensorValue >= distLow && sensorValue <= distHigh) {
if (!isMatching) {
sensorMatchStartTime = currentMillis;
isMatching = true;
Serial.println("Target detected... Hold for 1.5s");
}
// Trigger precisely after 1.5 seconds
if (currentMillis - sensorMatchStartTime >= confirmTime) {
Serial.println("Confirmed! Pumping now.");
triggerPump();
isMatching = false;
// REMOVED: delay(3000) was here, causing the "huge delay"
}
} else {
// Small buffer to prevent flickering resets
if (sensorValue < (distLow - 20)) {
isMatching = false;
}
}
}
}
void triggerPump() {
digitalWrite(ain1Pin, HIGH);
digitalWrite(ain2Pin, LOW);
analogWrite(pwmAPin, 255);
delay(pumpDuration); // Pump runs for 7 seconds
digitalWrite(ain1Pin, LOW);
digitalWrite(ain2Pin, LOW);
analogWrite(pwmAPin, 0);
Serial.println("Pump sequence complete.");
}