This is a device that helps me taking care of my plant especially when I’m not at home.



sketch for some other ideas

Earlier in the process I had several ideas like detecting the pressure on my feet so  it could help me walking more ‘correctly’ or have something reminding me for not look at the computer screen for too long and later I realized assistive device is to help me but not necessary involving with my body. After ‘observe’ my daily life, one thing I realize I’m doing bad is taking care of my plant.

I have idea that build a automatic watering machine initially, but many people have done similiar thing and I’ll need something that suits my need particularly. My plant is always sitting on my window sill, it’s getting some sunlight through window but not water, so I had the idea that possibly could help it get some rain water without me watering it.

Moving is the most important thing for this device, so I start working with stepper motor which is better than other motor like DC motor and servo motor in moving heavy things

soil moisture is the next thing I tested and it turned out pretty easy to work with

keypad is a little bit ‘tricky’ beacuse of the amount of pins it needs(8 of them, each for a row or column), there are always some keys that is not functional or responding with delay

prototype sketch to show what it looks like (I thought I’ll need 2 motors to get it moving initilly but it turned out that I will need only one motor with an anchor point and a belt)

After all parts are functional I made a little box trying to hide all the wires inside but I underestimated the volume of whole thing




I get many helpful feedbacks from crit.

“Why not have 2 moisture sensors, one to sense soil moisture and one to sense rain which could automate the machine?”

I really like this idea and this would free me from checking the weather and push the keypad.  Sensitiveness of moisture sensor to rain drops need to be tested.  And also there might be some restrictions applied to it such as, shut down during night because it might make noise etc. The other general concern about this device is how practical it is in reality since windows are usually closed during winter.

“I think the machanic design can be modified to tailor the behind window need so that you can still close the window and e.t.c”.

I don’t have a good answer for that yet, becuase all this things needs physical connection and how that would go through the window will be a problem so probably a special kind of window would need to be designed along with it. A more practical solution to it is instead of getting rainwater, it would follow the sun and get enough light, watering part would need to be done by other way such as collecting rain water.

Generally, I’m happy with the outcome of this project I learned a lot and with this many parts of it I made them all function. One thing I would encounter from the beginning if I can start over is to the physical moving part, I always assume that moving physically thing will be easy as long as I get the motor working and I was wrong.

If I get the chance to build the other iteration I would definitely have 2 moisture sensors and I would probably design a simple protytpe for that window that would tailor the need  of this machine.

Technical information

Breadboard connection

//Project: Walk the plant
//Yingyang Zhou
//This project is for helping me taking care of my plant by telling me soil moisture and get rainwater as the time I set. It has 3 main part: soil moisture sensor, keypad and stepper motor.

//soil mositure
int greenLEDPin = 9; // healthy status
int redLEDPin = 10; // dry status
int val = 0;
int soilPin = A0; 
int soilPower = 8;// using analogue pin instead of 5 volts to prevent corrosion

#include <Keypad.h>
const byte ROWS = 4; 
const byte COLS = 4; 
char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
byte rowPins[ROWS] = {7, 6, 5, 4}; 
byte colPins[COLS] = {3, 2, 1, 0}; 
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

#include <AccelStepper.h>
const int STEP_PIN = A2; 
const int DIR_PIN = A1;
AccelStepper myMotor(1, STEP_PIN, DIR_PIN);
int pos = 800;
int place = 0;

void setup() {
  pinMode(greenLEDPin, OUTPUT);
  pinMode(redLEDPin, OUTPUT);
  pinMode(soilPower, OUTPUT);
  digitalWrite(soilPower, LOW);


int readSoil(){

    digitalWrite(soilPower, HIGH);
    val = analogRead(soilPin);
    digitalWrite(soilPower, LOW);
    return val;

void loop() {

  int hourNow = 2; // because I can't get a real time clock, I'll fake the time in this project.
  int customKey = customKeypad.getKey();
  int customKeyInt = customKey-48; //translating char to int number
//  Serial.print(char* monthStr(byte month));
  if (customKey){
  val= readSoil();
//  Serial.print("Soil Moisture = "); Serial.println(val);

  if (val < 100){
    digitalWrite(redLEDPin, HIGH);
  else {
    digitalWrite(redLEDPin, LOW);
    digitalWrite(greenLEDPin, HIGH);
  if (customKeyInt == hourNow){
    place += 1000;
    while (myMotor.distanceToGo() != 0) {
    myMotor.run(); //to make sure motor is running all the time before get to the destination
  if (hourNow == customKeyInt+1){ // hourNow will ideally change to 3 in reality but because it stays at 2 in this project I'll need to press 1 on keypad to retract the plant
    place -= 1000;
    while (myMotor.distanceToGo()!=0){