This project is a bi-weekly plant watering system. Things you need:
- — Arduino UNO R4 WIFI
- — DPDT 5v Relay
- — 5v Peristaltic pump
- — power bank
- — some wires
- — some small pump hose
- — some kind of container for water
Will be using the RTC.h Arduino library to set the time to trigger the pump. In this case it will be triggered on Wednesday and Sunday at 7.45 am. Take note that the timing is a rough timing with a deviation of few minutes ( weekly ) and if the Arduino losses power at any point of time, the time have to be reset again, by changing the time and day in the code (sketch) to current time. Then reload the code into Arduino to start the timing process again.
Wiring diagram for the the components:

Below is the sketch (code) and please refer to my Youtube video for the actual demo of the watering system. The video is at : https://youtu.be/T6AvhaCtJbA
We use a formula in the code to get the day of week, I try to explain the formula in the code comments. But a clearer explanation can be found in this website (https://www.almanac.com/how-find-day-week)
# include "RTC.h"
# define Output_Pin_1 7 // for relay coil Vcc
int delayTime = 15000; // 15 sec to water the plant
void setup() {
// put your setup code here, to run once:
pinMode(Output_Pin_1, OUTPUT);
Serial.begin(9600);
RTC.begin();
// Adjust the below date, it is the date you want your Arduino to start counting the date.
// If Arduino loses power and shut off, you have to reset this date to the current date or to the date that u want.
// Below date is set at 22 Sep 2024 , 10pm, SUNDAY
RTCTime startTime(22, Month::SEPTEMBER, 2024, 22, 00, 00, DayOfWeek::SUNDAY, SaveLight::SAVING_TIME_ACTIVE);
RTC.setTime(startTime);
};
void loop() {
// put your main code here, to run repeatedly:
// Get current time from RTC
RTCTime currentTime;
RTC.getTime(currentTime);
//Get the month KEY number for the calculation.
int monthMM = Month2int(currentTime.getMonth());
// switch variable
int var = monthMM ;
int key_Number = 0;
// switch statement
switch (var)
{
case 1:
Serial.print("Jan KEY number is : ");
key_Number = 1;
Serial.println(key_Number);
break;
case 2:
Serial.print("Feb KEY number is : ");
key_Number = 4;
Serial.println(key_Number);
break;
case 3:
Serial.print("Mar KEY number is : ");
key_Number = 4;
Serial.println(key_Number);
break;
case 4:
Serial.print("Apr KEY number is : ");
key_Number = 0;
Serial.println(key_Number);
break;
case 5:
Serial.print("May KEY number is : ");
key_Number = 2;
Serial.println(key_Number);
break;
case 6:
Serial.print("Jun KEY number is : ");
key_Number = 5;
Serial.println(key_Number);
break;
case 7:
Serial.print("Jul KEY number is : ");
key_Number = 0;
Serial.println(key_Number);
break;
case 8:
Serial.print("Aug KEY number is : ");
key_Number = 3;
Serial.println(key_Number);
break;
case 9:
Serial.print("Sep KEY number is : ");
key_Number = 6;
Serial.println(key_Number);
break;
case 10:
Serial.print("Oct KEY number is : ");
key_Number = 1;
Serial.println(key_Number);
break;
case 11:
Serial.print("Nov KEY number is : ");
key_Number = 4;
Serial.println(key_Number);
break;
case 12:
Serial.print("Dec KEY number is : ");
key_Number = 6;
Serial.println(key_Number);
break;
};
//Print the last 2 digit of Year, month and day of month.
int yearYY = currentTime.getYear()-2000;
int dayOfMonth = currentTime.getDayOfMonth();
Serial.println(yearYY);
Serial.println(Month2int(currentTime.getMonth()));
Serial.println(currentTime.getDayOfMonth());
// Print time, just for checking.
Serial.print(currentTime.getHour());
Serial.print(":");
Serial.print(currentTime.getMinutes());
Serial.print(":");
Serial.println(currentTime.getSeconds());
// Calculate day of week base on current time.
//Quarter of YY digit
float yearYY_divided_4_float = yearYY / 4.00f ;
int yearYY_divided_4 = (floor(yearYY_divided_4_float));
Serial.print("Last 2 digits of year / 4 , get digit b4 decimal only : ");
Serial.println(yearYY_divided_4);
// we use the below formula to get the Day of Week
//last 2 digit of year + (1/4 of last 2 digit, discard remainder) + day of month + month special(Key) number - 1(minus 1 for year between 2000 and 2099)
// Divide the sum by 7 and get the remainder
// (remainder = 1, Sunday)(remainder = 2, Monday)(remainder = 3, Tuesday)(remainder = 4, Wednesday)
// (remainder = 5, Thursday)(remainder = 6, Friday)(remainder = 0, Saturday)
int final_number_for_dow = ((yearYY) + (yearYY_divided_4) + (currentTime.getDayOfMonth()) + (key_Number) - (1)) % 7 ;
Serial.print("Remainder after division : ");
Serial.println(final_number_for_dow);
String DOW = "" ;
switch(final_number_for_dow)
{
case 1:
Serial.println("Sunday");
DOW = "Sunday";
break;
case 2:
Serial.println("Monday");
DOW = "Monday";
break;
case 3:
Serial.println("Tuesday");
DOW = "Tuesday";
break;
case 4:
Serial.println("Wednesday");
DOW = "Wednesday";
break;
case 5:
Serial.println("Thursday");
DOW = "Thursday";
break;
case 6:
Serial.println("Friday");
DOW = "Friday";
break;
case 0:
Serial.println("Saturday");
DOW = "Saturday";
break;
};
// if its Tuesday or Saturday and it's 2.30pm then 'ON' the motor for 15 seconds to water the plant.
if ((DOW == "Wednesday" || DOW == "Sunday") && (currentTime.getHour() == 14 && currentTime.getMinutes() == 30)) {
digitalWrite(Output_Pin_1, HIGH);
Serial.println("TIme to water the plant......");
delay(delayTime);
digitalWrite(Output_Pin_1, LOW);
delay(5000);
}
delay(5000);
//delay(3000);
//delay(86400);
};
