How to build a Smart plant monitoring system using IoT and Arduino

This tutorial describes how to build a smart plant monitoring system with Arduino that controls the plant’s health status. With a smart plant monitoring system using Arduino, it is possible to check:

  • temperature
  • humidity
  • light intensity
  • soil moisture

All these parameters have effects on plant health. The idea that stands behind this Arduino project is monitoring the plant health status using a set of sensors.

Sensors, connected to Arduino, acquire information and then such information flows to the cloud using Ubidots IoT cloud platform. Moreover,  we can connect to this Arduino smart plant monitoring system remotely using a browser. In this way, it is possible to verify the plant health remotely.

In this blog, we talked already about IoT ecosystem and you know already what it means. You should know how to use IoT cloud platforms to store and retrieve data.

Introduction to IoT Smart plant system

If you are new to IoT, it is useful, to know more about it, you read my article about What is Internet of things.
It is useful to recap briefly, Internet of things is defined as:

“The internet of things (IoT) is the network of physical objects—devices, vehicles, buildings and other items—embedded with electronics, software, sensors, and network connectivity that enables these objects to collect and exchange data. The IoT allows objects to be sensed and controlled remotely across existing network infrastructure”.

Especially relevant in an IoT project is the IoT cloud platforms that store data coming from dev boards like Arduino, Raspberry and so on. Using this data, IoT cloud platforms build charts and they have a built-in system to create some business rules on this information.
Moreover, Ubidots is an IoT cloud platform that not only stores data but enables users to create a dashboard to represent graphically the stored data.

What you will learn

In this tutorial, you will learn:

  • how to use sensors to collect environment information using Arduino
  • send data acquired to the cloud
  • how to build an Arduino dashboard to monitor the plant health

If you want to know more about how works an IoT platform you can read my Practical Guide about how to use Ubidots with Arduino to build IoT projects

Arduino plant monitoring system project overview

Now it is time to describe this Arduino smart plant monitoring system in more detail. The image below shows the project at work:

IoT project tutorial

This project uses Arduino Uno as development board and a set of sensors:

  • DHT11
  • YL-38 + YL-69
  • TEMT6000

Anyway, you can use other boards such as ESP32 or ESP8266 or Wio Terminal.

DHT11: Temperature and humidity sensor

DHT11 is a sensor to measure temperature and pressure. It is a cheap sensor and suitable for Arduino. You can use a more accurate sensor but the way to use it is the same.

YL-38 + YL-69: Soil moisture sensor

YL-38 + YL-69 is a sensor to measure the soil moisture. It has to be inserted into the plant soil.

TEMT6000: Light intensity

TEMT6000 is a sensor to measure the light intensity so that we can know how light the plant is receiving.

The wiring part is very simple as it is clear in the picture below:

Arduino smart plant monitoring system: Monitor plant health using IoT and sensors

Moreover, in the picture above, it is clear that Arduino uses an ethernet shield to connect to the network, you can use also a WIFI shield it is almost the same approach.

Acquiring sensor readings using Arduino to monitor the plant health

Now that it is time to describe how to connect sensors to Arduino. The sketch is very simple:

void loop() {
  float soilHum = analogRead(moisturePin);
  soilHum = (1023 - soilHum) * 100 /1023;
  Serial.println("Soil Humidty: " + String(soilHum));
  // Read light float
  volts = analogRead(lightPin) * 5.0 / 1024.0;
  float amps = volts /10000.0;
  float microamps = amps * 1000000;
  float lux = microamps * 2.0;
  Serial.println("Lux: " + String(lux));
  float h = dht.readHumidity();
  float temp = dht.readTemperature();
  ..
}Code language: C++ (cpp)

where the dht variable is defined as:

#define DHTTYPE DHT11
..
// DHTPIN is the pin number connected to DHT11 data output
DHT dht(DHTPIN, DHTTYPE);Code language: PHP (php)

As a result, if we load the sketch into Arduino and run it you will know the values read by sensors using the serial monitor.

Arduino cloud: Send the sensor readings to the cloud to monitor the plant health

Another step is sending the data read to the cloud. In this IoT project tutorial as IoT cloud platform, we use Ubidots. If you are new to this platform and don’t know how to use it, I suggest you read this tutorial about how to connect Arduino to Ubidots. This project defines 4 variables holding values read from the sensor. Moreover, using this variable we create the dashboard.

Ubidots variables

Once the variables are configured in Ubidots, we have the variable id:

iot platform data

Implement Arduino smart plant system

It is time to modify the Arduino sketch so that it sends the values to the Ubidots.

#include <SPI.>
#include <Ethernet.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
String tempVarId = "575475df7625423fd9da9c36";
String humVarId = "575475f1762542406cb10c43";
String lightVarId = "575475fc762542410358a0c3";
String soilVarId = "5754760576254241593d4d47";
String token = "xxxxx";
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[]="things.ubidots.com";
EthernetClient client;
IPAddress ip(192, 168, 1, 40); // Arduino IP Add
IPAddress myDns(8,8,8,8);
IPAddress myGateway(192,168,1,1);
int moisturePin = 0;
int lightPin = 3;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(9600);
  Serial.print("Starting...");
  // Net connection...
}
void loop() {
  float soilHum = analogRead(moisturePin);
  soilHum = (1023 - soilHum) * 100 /1023;
  Serial.println("Soil Humidty: " + String(soilHum));
  // Read light
  float volts = analogRead(lightPin) * 5.0 / 1024.0;
  float amps = volts /10000.0;
  float microamps = amps * 1000000;
  float lux = microamps * 2.0;
  Serial.println("Lux: " + String(lux));
  float h = dht.readHumidity();
  float temp = dht.readTemperature();
  Serial.println("Temp: " + String(temp,2));
  Serial.println("Hum: " + String(h,2));
  sendValue(temp, h, lux, soilHum);
  delay (60000);
}
void sendValue(float tempValue, float humValue, float lux, float soil)
{
  Serial.println("Sending data...");
  // if you get a connection, report back via serial:
  int bodySize = 0;
  delay(2000);
  // Post single value to single var
  String varString = "[{\"variable\": \"" + tempVarId + "\", \"value\":"
         + String(tempValue) + "}";
  // Add other variables
  Serial.println("Connecting...");
  if (client.connect(server,80)) {
   client.println("POST /api/v1.6/collections/values HTTP/1.1");
   Serial.println("POST /api/v1.6/collections/values HTTP/1.1");
   client.println("Content-Type: application/json");
   Serial.println("Content-Type: application/json");
   client.println("Content-Length: "+String(bodySize));
   Serial.println("Content-Length: "+String(bodySize));
   client.println("X-Auth-Token: "+token);
   Serial.println("X-Auth-Token: "+token);
   client.println("Host: things.ubidots.com\n");
   Serial.println("Host: things.ubidots.com\n");
   client.print(varString);
  }
  else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
   boolean sta = client.connected();
   Serial.println("Connection ["+String(sta)+"]");
   if (!client.connected()) {
     Serial.println();
     Serial.println("disconnecting.");
     client.stop();
   }
  Serial.println("Reading..");
  while (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  client.flush();
  client.stop();
}Code language: PHP (php)

In conclusion, running the sketch and accessing the Ubidots dashboard we have:

Smart plant monitoring system dashboard: Check remotely the plant health

Where to go from here? This project is useful in several scenarios whenever we have to monitor the soil and plant status. We can expand this project adding new features so that we can easily integrate it with other systems. For example, we can implement a notification system using Firebase so that we can send an alert when some parameters are out of the specified range. Moreover, we could add an Arduino API interface so that we can read the plant status parameters using external systems.

Finally, at the end of this IoT project tutorial, you gained, hopefully, the knowledge about reading data sensors. Moreover, you learned how to send sensor readings to the cloud.

    1. Azeo June 14, 2016
      • Azeo June 17, 2016
        • Francesco Azzola June 17, 2016
          • Azeo June 18, 2016
    2. Francesco Azzola June 15, 2016
    3. Bongjun Hur June 15, 2016
      • Francesco Azzola June 15, 2016
    4. Nuno Santos July 1, 2016
    5. ryan August 6, 2017
      • Francesco Azzola August 9, 2017
    6. Jacob Palmer November 9, 2017
    7. maya hamdan September 21, 2018
      • Francesco Azzola September 21, 2018
        • maya hamdan September 28, 2018
    8. qila September 26, 2018
      • Francesco Azzola September 26, 2018
    9. aqila September 27, 2018
    10. rohan October 1, 2018
      • Francesco Azzola October 1, 2018
    11. Anonymous October 31, 2018
      • Francesco Azzola October 31, 2018
    12. Ronil Lim December 11, 2018
      • Francesco Azzola December 11, 2018
    13. Pingback: Smart Watering Plants | WIZnet Museum January 8, 2019
    14. Prabhat June 13, 2019
    15. Anonymous December 20, 2019
    16. Anonymous January 14, 2020
      • Francesco Azzola January 15, 2020
    17. Vikalp Bajpai January 29, 2021
    18. Mohit April 25, 2021
      • Francesco Azzola April 26, 2021

    Add Your Comment