Automatic Watering System Using Arduino
Automatic Watering System Using Arduino
By
Gabriel Putra Pinastika
ID No. 001201600043
A Thesis
Submitted to the Faculty of Computing
President University
in partial fulfillment of the Requirements
for the Degree of Bachelor of Science
in Information Technology
May 2021
Copyright by
Gabriel Putra Pinastika
2021
i
AUTOMATIC WATERING SYSTEM WITH
MOISTURE AND WATER LEVEL DETECTOR
USING ARDUINO
By
Gabriel Putra Pinastika
ID No. 001201600043
Approved:
ii
STATEMENT OF ORIGINALITY
I also declare that this work, either in whole or in part, has not been submitted to
another university to obtain a degree.
iii
SCIENTIFIC PUBLICATION APPROVAL FOR
ACADEMIC INTEREST
for the purpose of development of science and technology, certify, and approve to
give President University a non-exclusive royalty-free right upon my final report
with the title:
………………………...............................................................................................
iv
ADVISOR APPROVAL FOR
JOURNAL/INSTITUTION’S REPOSITORY
v
SIMILARITY INDEX REPORT
vi
ABSTRACT
Agriculture industry as the world’s largest water consumer is facing crisis in this
past decades as the climate change makes weather unpredictable, competition with
real-estate sector over water and land usage, as well as decrease of manual labors
caused the lost interest in younger generation to continue working in this field. This
thesis proposed a system that can help with modernization in agriculture industries.
The automatic watering system is a perfect solution because it does not need much
attention from the user except during maintenance. This system consists of the
following parts: the prototype of the automatic watering system using Arduino, web
client that allows the user to control and monitor the prototype, and the database to
save the prototype settings and the watering information. The automatic watering
system will keep send data to the web client and the database as long as there is
sufficient internet connection nearby.
vii
DEDICATION
To my grandmother,
I’m still sad you couldn’t see me graduating university like I promised you.
To my mother, Eleonora.
To my father, Gunawan.
To my little brother.
viii
ACKNOWLEDGEMENT
Praise and gratitude, the author would like to convey to the presence of The One
Almighty God for giving the author guidance and blessings so that the author can
complete this thesis.
The thesis was prepared to fulfill one of the requirements to obtain a Bachelor’s
degree at President University. The completion of this thesis cannot be separated
from help, support and guidance from various parties. Therefore, on this occasion
the author would like to thank profusely to:
ix
6. And of course, to my parent and siblings who support me no matter what
decision I took in my life. I might have given up a long time ago if it were
not for them.
x
TABLE OF CONTENTS
ACKNOWLEDGEMENT ..................................................................................... ix
xi
2.3.1 Raspberry Pi 3 Model B ....................................................................... 27
2.4 HS-SR04 ................................................................................................. 28
2.8.1 Rancangan Bangun Sistem Kontrol Irigasi Tetes untuk Pertanian Cabai
..................................................................................................................... 32
2.8.2 Rancangan Bangun Sistem Pengairan Sawah Otomatis menggunakan
Arduino dan Android .................................................................................... 32
2.9 Comparison Overview ............................................................................ 33
xii
5.1 User Interface Design .................................................................................. 52
xiii
LIST OF TABLES
xiv
LIST OF FIGURES
xv
Figure 5. 8 User Controlled Action Source Code ................................................. 59
Figure 5. 9 Automatic Watering Scheduler Source Code ..................................... 60
Figure 5. 10 Generate New Schedule Function Source Code ............................... 61
Figure 5. 11 Watering Count Reset Source Code ................................................. 62
xvi
CHAPTER I
INTRODUCTION
But the lucrative prospect of agriculture industries does not come with its own
fair share of problem. In order to boost the growth of the plant, farmers often resort
to using chemical fertilizer and pesticide which creates waterways and groundwater
pollutions. The competition with residential area over land and/or water usage has
led to drain the natural aquifers which cause negative environmental issues in long-
term duration.
Other issues faced by the industries are low prices of agriculture product
prices caused by government policies, escalating climate change which makes
seasonal planting even harder, and labor shortages due to younger generation is opt-
out from the industry because they considered it dirty work. And as Covid-19
pandemic made the situation even worse, the industry is starting to realize that
automation is the solution to solve some of its problem.
17
This thesis develops an Automatic Plant Watering System with Moisture Sensor
by utilizing Arduino acting as the microcontroller and Raspberry Pi 3 as the server
acting as a bridge between the Arduino and the client application. And the system
is powered by Raspberry Pi, it only draws 86-watt hour (Wh) per day according to
calculation done by Alex Eames and Jeff Geerling, which translate to 2.58 kWh in
30 days. By implementing precise watering and combination of Arduino and
Raspberry Pi, this thesis aims to help solve the problem which current agricultural
sector are facing: excessive water and power usage, and decrease of manual labors.
1.3 Objectives
The primary objective of this thesis is to create an automatic watering system
by using Arduino as microcontroller in tandem with Raspberry Pi as the backend
server and web application feature to remotely manage the system. The watering
system is using moisture sensor to track the ground humidity level and weather
forecast data obtained from OpenWeather API to determine the correct time for
plant watering. The web application can be used by the user to tweak the Arduino
settings, view watering logs, view current water level in storage tank and water the
plant in advance ignoring the automatic system.
18
2. The system can show the watering logs that can be used to determine the
best watering conditions.
1.5 Methodology
The methodology used to develop this thesis is Waterfall Model. The Waterfall
Model is a project management with linear approach where the project requirements
are gathered in the beginning of the project then the project plan is created
sequentially to fulfill those project requirements. The model is named Waterfall
Model because each phases flows steadily to the next phase, just like a waterfall.
Advantages:
19
2. Manageable due to the model inability to adapt to new changes, therefore
each phase has specific output or results.
3. The stages are clearly defined, and prepared and finished one by one as the
phases cannot overlap each other.
4. Best suited for smaller project if the requirements are well documented.
5. Any changes in the system are made during the development process.
Disadvantages:
1. If the software has already finished testing phases, it’s hard to revise
something that’s not previously defined in the analysis stage.
2. The amount of risk is high thus making the model uncertain by nature.
3. Not suitable for complex projects where the requirements are expected to
frequently change.
4. Working software only available in the late development life cycle,
disabling the client ability to gives valuable feedback.
5. Once the software has fully developed, even small errors or changes may
cause a lot of problems.
20
Figure 1. 1 Phases of Waterfall Methodology
21
4. Integration and Testing
All the units developed in the implementation phase are integrated into a
one single system. Once the integrations have finished, the developer
perform another testing to ensure each unit are compatible with each other.
5. Deployment of the system
Once all the test case returns no failure, the product is ready to be deployed
or released for public usage.
6. Maintenance
As test case might not cover all possible scenario, there’s a chance for
failures when deployed therefore patches for the system are released to
update the system.
22
The system blueprints are covered during this chapter
where the system architecture and UI design is
defined. The UI design also include diagrams such as
Entity Relationship Diagram, activity diagram, and
use case diagram.
Chapter V Implementation
23
CHAPTER II
LITERATURE STUDY
2.2 Arduino
Arduino is an open-source electronics platform with easy-to-use hardware and
software principle. The inputs are read by Arduino boards: proximity sensor, touch
or gesture, even a social media message, and turn it into an output – activating a
motor, turning on an LED, post something online by sending an instruction to the
microcontroller on the boards.
Created by Ivrea Interaction Design Institute with the purpose to help students
learn electronic and programming, especially those in 3rd world country without
previous exposure or knowledge to technology. But as Arduino explodes in
popularity, Arduino is adapting to the new trends and needs, transforming itself
from simple 8-bit board to product for IoT applications, wearable, 3D printing, and
embedded environment. All Arduino boards are open-source, engaging the
creativity of the user to create something that fits their needs.
24
Based on ATmega328P microcontroller, equipped with 14 digital pins both output
and input (on which 6 can be used as PWM outputs), 6 analogs input/output, 16
MHz quartz crystal, an USB connection, a power jack, an ICSP header and a reset
button. To use Arduino is pretty simple and straightforward, simply plugged in the
board to power supply using AC-to-DC adapter, or computer using USB cable, or
battery if the board is deployed on places with no place without electricity.
2.2.1 Firmata
Firmata is a protocol to allow communication between Arduino Uno that only
accept C/C++ programming language and the host computer running other
25
programming language. The protocol is implemented on firmware level of any
microcontroller’s architecture and the software package on the host computer.
Table 2.1 provide an explanation for Arduino Uno components along with its
function.
26
2.3 Raspberry Pi
Raspberry Pi is a series of small single-board computers developed in the
United Kingdom by the Raspberry Foundation. The Raspberry Pi project originally
leaned towards the promotion of teaching basic computer science in schools and in
developing countries.
27
Input-output that can be used to connect any
2. GPIO pins
module or sensor to the board.
3. HDMI Display Port Display output to external monitor.
The main storage of Raspberry Pi, where the
4. Micro SD card slot
OS is stored.
5. Micro USB power input Powering the Raspberry Pi.
Allow transferring camera data directly into
6. CSI camera port
the board.
Allow multiple device/peripherals
7. USB Port
connection.
8. Ethernet Port Connect to internet using LAN cable.
2.4 HS-SR04
The ultrasonic distance sensor can provide non-contact measurement
functionality on range between 2cm to 400cm with a ranging accuracy that can
reach up to 3mm. Equipped with ultrasonic transmitter, a receiver and a control
unit.
28
conductors, it means that the more quantity of water the soil has means better
conductivity resulting in lower resistance, and vice-versa. Soil moisture level can
be determined by reading the sensor output – either analog or voltage output –
which varies according to the resistance.
29
Figure 2. 5 5V DC Water Pump
2.7 JavaScript
JavaScript originally started as a programming language maintained by the
ECMA Foundation that provide an ability to implement complex features on a
website ranging from dynamic content update, interactive maps, or even animating
2D/3D graphics. It’s a staple on basic web technology stack along with HTML and
CSS. But with the rise of non-browser environment such as Node.js, its application
has extended into much more complex such as machine learning or desktop
application.
2.7.1 Express.js/Node.js
Node.js is a non-browser environment running on V8 engine developed by
Google which essentially allows to run JavaScript code outside of browser
environment. It’s open-source, available on any major operating system and
maintained by OpenJS Foundation whose aims is to raise the growth of JavaScript
and web ecosystem. By using “Javascript everywhere” paradigm, Node.js is
planning to unite web application development under a single language, in contrast
30
to conventional method of using separate programming language for frontend and
backend.
2.7.2 Johnny-Five
Johnny-Five is the JavaScript robotics and IoT platform that enables developer
to write and run any Arduino projects using JavaScript. The only drawback it has
is the boards must be constantly connected to the host which run Node.js or
connected to Raspberry Pi which is capable to run Node.js.
2.7.3 React
React is one of the most popular JavaScript libraries used to develop scalable
user interfaces. By encouraging Component Driven Development which
breakdown every part of a website into a smaller code pieces called “components”,
that allows for code reusability turning debugging and managing web application
so much easier as developer did not need to scroll through a thousand lines of codes
just to fix one simple error. It also supports server-side rendering using Node.js and
mobile application using React Native.
31
2.8.1 Rancangan Bangun Sistem Kontrol Irigasi Tetes untuk Pertanian Cabai
This automatic irrigation system works by utilizing moisture sensor to detect
soil moisture of chili plant with each watering is timed with specific interval from
the previous watering time. Developed by Muholidin as the requirement for
bachelor thesis in Yogyakarta Muhammadiyah University.
32
2.9 Comparison Overview
The differences between this research and related works are explained in Table 2.3.
Irigasi Pengairan
Features This Thesis
Tetes Sawah
Prototype can detect
water and soil moisture ✓ ✓ ✓
level.
Prototype automatically
water the plant based ✓ ✓ ✓
on gathered data and settings.
Prototype can get weather
❌ ❌ ✓
forecast data.
Owner can manage the
prototype from web / mobile ❌ ✓ ✓
application
33
CHAPTER III
SYTSEM ANALYSIS
This chapter purpose is to explain the analysis from program functions and
behavior as stated in the software requirements. The application requirements and
development procedure are shown in order to identify its goal and purpose. The
content of this chapter is the following: Functional Analysis, Use Case Narrative,
Swim Lane Diagram, Functional Analysis, Development Process Analysis, System
Overview, and Hardware and Software Requirements.
• Watering Time
Consist of two types of times: the start and end time. Both are the time when
the prototype starts and finish watering the plant
• Moisture Data
Moisture data of the soil before and after the watering.
• Water Usage
Track the usage of the water during this watering period.
• Performed By
Track whether the action is done automatically by the system or by the
owner.
34
The system is using SocketIO on top of Express.js server to provide real-time
connection, with React as its frontend framework for the web application. The
owner can configure the system settings via web applications and also view the
watering data recorded in the database to gain better insight of the water amount
the plant might need. This thesis is created in order to raise awareness of excessive
water usage as well as reducing manual labor required to do simple task.
Software
No. Function
Requirements
Used as an IDE to develop the frontend and
1 Visual Studio Code
backend for the web application.
2 Microsoft Word 2016 Used as documentation tools for this thesis.
3 Tinkercad Used to design the Arduino circuits.
4 Lucid Chart Used to design the Use Case diagram.
35
5 Figma Used to design the frontend wireframe.
6 Javascript Used both as server and frontend framework.
7 MongoDB Used as the database.
8 Postman Used to test the backend REST API.
Used as an intermediate protocol to bridge
Arduino which only accept C/C++ language and
9 Firmata
the host system running other programming
languages.
Hardware
No. Function
Requirements
Used to run all the software during the
1. PC
development process.
Used as the main computer to manage the
2. Raspberry Pi 3 Model B microcontroller during deployment as well as
the server for real-time monitoring.
3. Arduino Uno Used as the microcontroller of the prototype.
Used to measure soil moisture and humidity
4. Soil Moisture Sensor
level.
5. HR-SC04 Used to measure water level in the storage tank.
Used to connect multiple components of the
6. Jumper Wires
Arduino.
Used as platform connecting the Arduino to
7. Breadboard
various modules.
8. Water Pump Used as water pump from the storage to the pot.
Power Adapter 9V-12V
9. Used to provide power to the system.
DC
36
Power Adapter and Used to provide power to Raspberry Pi 3 and
10.
USB cable Arduino
37
Table 3. 4 Real-Time Monitoring Table
38
Table 3. 5 Automatic Watering on Scheduled Time
39
Step 5.1: If current soil
moisture data is below
the threshold, the
prototype will start
watering.
Step 5.2: If the current
soil moisture data is
above the threshold, the
prototype will skip
watering.
Step 6: The prototype
will send the watering
information to the
database after successful
watering.
Post Condition The prototype will work according to real-time data.
• The prototype needs to constantly plugged in to
Business Rule
power supply and connected to the internet.
40
Step 3: The client
application emits
“manualPump” event to
the server using
WebSocket protocol.
Step 4. The server
receives the event and
order the prototype to
water the plant for the
duration defined in
configuration file.
Step 6: The prototype
will send the watering
information to the
database.
The prototype will work according to user action
Post Condition and perform action on specified total amount of
time.
• The prototype needs to constantly plugged in to
Business Rule
power supply and connected to the internet.
41
Step 3: The client
application emits
“settingsUpdate” event
to the server using
WebSocket protocol.
42
Figure 3. 2 Real-Time Data Monitoring Swim Lane Diagram
43
Figure 3. 3 Automatic Watering on Scheduled Time Swim Lane Diagram
Figure 3.3 shows the activity of automatic watering when the system has
reached the scheduled time. It starts by the system performing various check against
current sensor data and settings from database. If current sensor data is matched
with the settings, the system then order prototype to start watering using
predetermined settings and after each successful watering, the system will send the
watering log to be recorded in the database. If the check returns false, it will skip
watering and wait for the next scheduled time.
44
Figure 3. 4 Manual User Action Swim Lane Diagram
Figure 3.4 shows the activity for manual user action. By triggering the action
from client application, the system will receive the action transmitted using
WebSocket protocol and order the prototype to start watering, regardless of any
delimiters from user configuration except for the total time watering.
45
Figure 3. 5 Change Prototype Settings Swim Lane Diagram
Figure 3.5 shows the activity when the prototype settings is changed. When the
user changes the configuration from client, it will simultaneously update the
configuration stored in the database, prompting the system to reschedule based on
the updated configuration.
46
CHAPTER IV
SYSTEM DESIGN
The System Design chapter covers the user interfaces, data, components to
satisfy the system requirements.
Figure 4.1 shows the dashboard menu for the user displaying current sensor data
in real-time and the latest watering data.
47
Figure 4.2 shows the watering parameter for the owner to change – or it’ll run
using provided default settings if the owner didn’t change anything.
48
4.2 Prototype System Design
The implemented Circuit Design and Wiring Diagram of the system is
explained in this section.
49
The components that are used in the prototype shown in Figure 4.3 are the
following: Arduino Uno, HC-SR04 Ultrasonic Sensor, Soil Moisture Sensor, Relay
Module and 5V DC Pump.
50
4.3 Entity Relationship Diagram
Figure 4.5 shows the Entity Relationship Diagram (ERD) that explain the
relationship for each table in the database.
51
CHAPTER V
SYSTEM IMPLEMENTATION
52
And the automatic watering configuration can be managed using the setting
page as shown in Figure 5.2. After each successful update, the system will restart
the scheduler in order to load the new configured settings.
5.2.1 Initialization
This process explains the initialization phase of the prototype. This process
consists of loading the necessary module for the system and the board to run.
require("dotenv").config();
const { Boards, Proximity, Sensor, Pin } = require("johnny-five");
53
const raspi = require("raspi-io").RaspiIO;
const { calibrateSoilSensor, calculateWaterLevel } = require("./helper/
helper");
const schedule = require("node-schedule");
const express = require("express");
As shown in Figure 5.3, the program starts by loading necessary module from
Johnny-Five library as the means to read sensor data and control the boards. Line 2
is creating new instance of Raspberry Pi library as the system code will be run on
the Raspberry Pi. Helper functions are also imported during this period which are
used to convert sensor data to human readable language. The WebSocket server is
also declared on top of basic http server. The initialization ends by creating new
instance of Boards which takes array of objects with Raspberry Pi and Arduino Uno
as the arguments.
54
// Global state
let settings = {};
let arduinoData = {
waterLevel: 0,
humidityLevel: 0,
};
let waterData = {
startTime: null,
endTime: null,
startHumidity: 50,
endHumidity: 60,
performedBy: "",
};
The object arduinoData is used to store sensor data while both waterData and
settings object is used as reusable code that will be called after each successful
watering and new configuration update respectively. And the devices object is used
to store Arduino module to be used outside of Boards function scope shown in
Figure 5.5 such as turning on the pump on scheduled time.
boards.on("ready", function () {
// Init pump pin
devices.pump = new Pin({
pin: 4,
board: boards.byId("uno"),
});
devices.pump.high();
55
freq: 1000,
board: boards.byId("uno"),
});
After the boards is ready then the system will try to communicate with modules
defined in devices.pump, waterLevel, and humidity instances. The devices.pump
store new key-value pair to the devices global state defined in Figure 5.4. While
both waterLevel and humidity function have default arguments “data” that means
on every data change from sensor reading resulted in calling the callback function
for rewriting the sensor data back to arduinoData global state.
56
io.emit("getNextWatering", new Date(wateringJob.nextInvocation()));
}, 1000);
Figure 5. 6 Real Time Sensor Data Transfer Source Code
waterData = {
...waterData,
endHumidity: arduinoData.humidityLevel,
endTime: new Date(),
performedBy: actor,
};
57
io.emit("latestWatering");
And when endWatering function is called, it will send HIGH value to the pump
pin to turn it off. But as opposed to startWatering, this function is a bit different as
it takes two arguments: actor and wateringCount. These arguments are needed for
the system to differentiate between action performed by user and by system, and to
send new watering data to the database.
// Manual pumping
io.on("connection", (socket) => {
socket.on("pumpInit", async (data) => {
58
if (data.pumpStatus === "Pumping") {
startWatering();
setTimeout(async () => {
stopWatering("User");
}, settings.pumpTime * 1000);
}
return;
});
socket.on("settingsUpdate", () => {
generateNewSchedule()
});
});
Figure 5. 8 User Controlled Action Source Code
The process will also listen to action “settingsUpdate” which triggered on every
settings update made by the user. It will call a function shown in Figure 5.10 to
restart the scheduler using the new value.
5.2.7 Scheduler
The system has two schedulers running in parallel, each with its own purpose:
wateringJob and resetJob. The scheduler is taking advantages of node-schedule
library, which is a time-based job scheduler for any major operating system to run
any action at fixed times, dates, or interval similar to cron, a scheduler for most
Unix/Linux system.
59
weathers = {
...weathers,
name: weather[0].main,
};
setTimeout(async () => {
stopWatering("System", data);
}, settings.pumpTime * 1000);
} else if (
arduinoData.humidityLevel <= settings.wateringHumidity &&
settings.ignoreWeather === false
) {
console.log(weathers);
console.log(settings.ignoredWeathers);
if (settings.ignoredWeathers.indexOf(weathers.name) > -1) {
console.log(
"Current force cast is matched with ignored weathers in set
tings\nSkipping..."
);
} else {
startWatering();
setTimeout(async () => {
stopWatering("System", data);
}, settings.pumpTime * 1000);
}
} else if (arduinoData.humidityLevel > settings.wateringHumidity)
{
console.log("skip watering because the soil still moist");
}
} else {
console.log("skip watering");
}
} catch (err) {
console.log(err);
}
});
Figure 5. 9 Automatic Watering Scheduler Source Code
60
const generateNewSchedule = async () => {
const { data: data } = await axios.get(
`${url}/settings/60ad5a5f08b24b313cc23dea`
);
settings = {
...data,
};
61
5.2.7.2 Reset Job
The purpose of resetJob scheduler is to reset the watering count back to 0 on
every start of new day at 00:00 system time zone.
62
CHAPTER VI
SYSTEM TESTING
The test-case written in this chapter is used to ensure the completed program
meets the software requirement defined in the previous chapter. This chapter consist
of two parts which are the followings: testing scenario and environment.
1. The system and the prototype must be connected to the internet at all times.
2. The protype must be constantly connected to power supply.
63
The prototype is plugged in The web application
2. to the power supply and is displaying real- As expected.
connected to internet. time data.
In Figure 6.1 is showing the result from Table 6.1 scenario No. 1 where it
displays no value in the place of Soil Humidity and Water Level, while Figure 6.2
is showing the result from Table 6.1 scenario No. 2, where the data is updated in
real-time.
64
Figure 6. 2 Result of Real Time Monitoring Test-case No. 2
65
prototype for a long
duration without restart.
The system read and
Read and write real-time
write real-time event to
4. event to and/or from the As expected.
and/or from the client
client.
and perform accordingly.
The results for automatic watering are shown in Figure 6.4, 6.5, 6.6, and 6.7
respectively where Figure 6.4 and 6.5 shows the watering results while Figure 6.6
and 6.7 shows the system decided to skip watering because real-time data does not
match with the user configuration.
66
In Figure 6.3 shows that the system recognizes update action from user and
restarting the system to load the new configuration.
67
Figure 6. 7 Automatic Watering on Scheduled Time Result
68
CHAPTER VII
Conclusion and Further Work
7.1 Conclusion
The development of the system and the prototype in this thesis results in the
following conclusions:
1. The prototype can inspire farmer to start adapting with new technology that
doesn’t require much of manual labor, this thesis achieve this result by
putting an emphasis on schedule-based pumping with custom timer and
interval to ensure that the plant is properly watered.
2. The prototype can measure moisture and water storage level from sensor as
well as sending those data to the client in real-time.
3. The prototype can be configured manually by the user.
4. The prototype can complete its task automatically without needing user
action at scheduled time.
69
3. Multiple sensor and module. The ability to use multiple sensors will be nice
addition for user that operates large farming facility. This could also add
even more features such as sunlight detection, etc.
4. Automatic water tank fill.
5. Use AI to configure watering settings by learn the water usage based on
watering logs and plant type. Useful in large farming facility.
70
REFERENCES
Library. https://www.arduino.cc/en/reference/firmata
Model? https://economictimes.indiatimes.com/definition/waterfall-
model
https://reactjs.org/docs/getting-started.html.
(n.d.). https://github.com/firmata/arduino.
https://github.com/rwaldron/johnny-five/wiki/Getting-Started.
https://www.makerspaces.com/arduino-uno-tutorial-beginners/.
thesis]. http://thesis.umy.ac.id/datapublik/t77330.pdf
https://www.oecd.org/agriculture/topics/water-and-agriculture/.
thesis]. http://repository.ubb.ac.id/1243/
https://www.tutorialspoint.com/sdlc/sdlc_waterfall_model.htm.
71
The World Bank. (2021, May 8). Water In Agriculture.
https://www.worldbank.org/en/topic/water-in-agriculture.
72