This simple machine solves a simple problem I have in my everyday life. When I go on vacation for an extended period of time, I have no way to water my plants. I could use self-watering planters, but that takes away the joy of caring for my plants when I’m home. As a result, I built a mechanism that waters my plants in the same way I would. The Plant Waterer 3000 accomplishes this by pouring a cup of water on plants over user-set intervals. From a technical perspective, it’s just a cup full of water that tilts slowly. But to me, it’s a way of watering my plants that feels distinctly human. It’s not the best solution to the problem, but it looks interesting and it works.
 
My demo below utilizes beads instead of water due to the less than waterproof nature of the frame’s materials. Additionally, it uses a fake plant to save my real plants from being pelted with beads. The time between movements is also drastically shortened for the brevity of the demo. When in use, the delay between each movement would be on the order of days.

The code is easily reconfigurable for different timings and number of watering intervals.

#include <Servo.h>

#define MAX_COUNT 90
#define INTERVALS 3
#define DIFF MAX_COUNT/INTERVALS
#define SECTION_DELAY 3000
#define MOVE_DELAY 20

Servo servo;

void setup() {
    //Initialize the servo, and move to our starting position
    servo.attach(3);
    servo.write(MAX_COUNT);

    delay(2000);
}

uint8_t count = MAX_COUNT;

void loop() {
    //Wait between sections of our motion path
    delay(SECTION_DELAY);
  
    //If we haven't reached the end of motion path yet
    if(count > 0){
        //Then move at the speed determined by the MOVE_DELAY
        for(uint8_t pos = count; pos > (count - DIFF); pos--){
            servo.write(pos);
            Serial.println(count-DIFF);
            delay(MOVE_DELAY);
        }

        //Prepare for the next section
        count = count - DIFF;
    }

}