Problem
Recently I got a rose plant from one of my friends who got married. I have been having plants of all sorts at my home but as any busy guy I forget to water the plants. This is a problem I thought I need to address using technology.
Solution
After doing some research I got to know about a Platform called ThingsBoard which allows Devices to connect to a central server using HTTP, MQTT, CoAP protocols and send telemetry to visualize everything in a Dashboard. I quickly downloaded it, used my Ethernet Shield, DHT11 sensor and YL-69 Soil Moisture sensor which I had lying around to check the possibility of integrating everything together.
Implementation
I just connected YL-69 Soil Moisture sensor to Arduno Analog Pin A1 to read the sensor data and Digital Pin 7 to power it if and when required. I connected Digital Pin 6 to read the sensor data from DHT11 sensor. Finally I followed the ThingsBoard Installation guide [1] and Getting Started guide [2] to setup ThingsBoard server in my laptop.
Finally wrote the following Arduino Sketch to use Ethernet Shield to connect to the network and ThingsBoard via MQTT protocol to send data.
Arduino sketch can be found below;
Data was sent in following format.
{"temperature":29.00, "humidity":30.00, "moisture":10, "active": false}
And was visualized in Dashboard Widgets like below;
You can see a Demo below where the Blue Color Soil Moisture sensor reading go up and down based on inserting and removal of the YL-69 sensor probe and Temperature and Humidity going up when I exhale hot air into the DHT11 sensor.
Future Work
Future work would be to add ESP8266 wireless connectivity to the entire thing and using ThingsBoard rule to fire and send an email when soil moisture level goes down below a threshold.
References
Recently I got a rose plant from one of my friends who got married. I have been having plants of all sorts at my home but as any busy guy I forget to water the plants. This is a problem I thought I need to address using technology.
Solution
After doing some research I got to know about a Platform called ThingsBoard which allows Devices to connect to a central server using HTTP, MQTT, CoAP protocols and send telemetry to visualize everything in a Dashboard. I quickly downloaded it, used my Ethernet Shield, DHT11 sensor and YL-69 Soil Moisture sensor which I had lying around to check the possibility of integrating everything together.
Implementation
I just connected YL-69 Soil Moisture sensor to Arduno Analog Pin A1 to read the sensor data and Digital Pin 7 to power it if and when required. I connected Digital Pin 6 to read the sensor data from DHT11 sensor. Finally I followed the ThingsBoard Installation guide [1] and Getting Started guide [2] to setup ThingsBoard server in my laptop.
Finally wrote the following Arduino Sketch to use Ethernet Shield to connect to the network and ThingsBoard via MQTT protocol to send data.
Arduino sketch can be found below;
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SPI.h> | |
#include <Ethernet.h> | |
#include <PubSubClient.h> | |
#include <dht.h> | |
// Update these with values suitable for your network. | |
byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; | |
IPAddress ip(192, 168, 1, 5); | |
IPAddress server(192, 168, 1, 2); | |
// YL-39 + YL-69 humidity sensor | |
byte humidity_sensor_pin = A1; | |
byte humidity_sensor_vcc = 7; | |
#define DHT11_PIN 6 | |
#define AUTH_TOKEN "1a3XZV0Tc17lkA7DkdKO" // ThingsBoard Device Auth Token | |
dht DHT; | |
void callback(char* topic, byte* payload, unsigned int length) { | |
Serial.print("Message arrived ["); | |
Serial.print(topic); | |
Serial.print("] "); | |
for (int i=0;i<length;i++) { | |
Serial.print((char)payload[i]); | |
} | |
Serial.println(); | |
} | |
EthernetClient ethClient; | |
PubSubClient client(ethClient); | |
void reconnect() { | |
// Loop until we're reconnected | |
while (!client.connected()) { | |
Serial.print("Attempting MQTT connection..."); | |
// Attempt to connect | |
if (client.connect("arduinoClient", AUTH_TOKEN, NULL)) { | |
Serial.println("connected"); | |
// Once connected, publish an announcement... | |
client.publish("v1/devices/me/attributes","{\"firmware_version\":\"1.0.0\", \"serial_number\":\"ThingsBoardClient-001\"}"); | |
// ... and resubscribe | |
//client.subscribe("inTopic"); | |
} else { | |
Serial.print("failed, rc="); | |
Serial.print(client.state()); | |
Serial.println(" try again in 5 seconds"); | |
// Wait 5 seconds before retrying | |
delay(5000); | |
} | |
} | |
} | |
void setup() | |
{ | |
Serial.begin(57600); | |
// Init the humidity sensor board | |
pinMode(humidity_sensor_vcc, OUTPUT); | |
digitalWrite(humidity_sensor_vcc, LOW); | |
client.setServer(server, 1883); | |
client.setCallback(callback); | |
Ethernet.begin(mac, ip); | |
// Allow the hardware to sort itself out | |
delay(1500); | |
} | |
int read_humidity_sensor() { | |
digitalWrite(humidity_sensor_vcc, HIGH); | |
delay(500); | |
int value = analogRead(humidity_sensor_pin); | |
digitalWrite(humidity_sensor_vcc, LOW); | |
return 1023 - value; | |
} | |
void loop() | |
{ | |
if (!client.connected()) { | |
reconnect(); | |
} | |
int chk = DHT.read11(DHT11_PIN); | |
switch (chk) | |
{ | |
case DHTLIB_OK: | |
Serial.print("OK,\t"); | |
break; | |
case DHTLIB_ERROR_CHECKSUM: | |
Serial.print("Checksum error,\t"); | |
break; | |
case DHTLIB_ERROR_TIMEOUT: | |
Serial.print("Time out error,\t"); | |
break; | |
case DHTLIB_ERROR_CONNECT: | |
Serial.print("Connect error,\t"); | |
break; | |
case DHTLIB_ERROR_ACK_L: | |
Serial.print("Ack Low error,\t"); | |
break; | |
case DHTLIB_ERROR_ACK_H: | |
Serial.print("Ack High error,\t"); | |
break; | |
default: | |
Serial.print("Unknown error,\t"); | |
break; | |
} | |
String json = "{\"temperature\":"+String(DHT.temperature, 2)+", \"humidity\":"+String(DHT.humidity, 2)+", \"moisture\":"+read_humidity_sensor()+", \"active\": false}"; | |
char buf[json.length()+1]; | |
json.toCharArray(buf, json.length()+1); | |
client.publish("v1/devices/me/telemetry", buf); | |
Serial.print("Data Sent : "); | |
Serial.println(buf); | |
delay(5000); | |
client.loop(); | |
} |
Data was sent in following format.
{"temperature":29.00, "humidity":30.00, "moisture":10, "active": false}
And was visualized in Dashboard Widgets like below;
You can see a Demo below where the Blue Color Soil Moisture sensor reading go up and down based on inserting and removal of the YL-69 sensor probe and Temperature and Humidity going up when I exhale hot air into the DHT11 sensor.
Future Work
Future work would be to add ESP8266 wireless connectivity to the entire thing and using ThingsBoard rule to fire and send an email when soil moisture level goes down below a threshold.
References
- https://thingsboard.io/docs/user-guide/install/windows/
- https://thingsboard.io/docs/getting-started-guides/helloworld/
- https://create.arduino.cc/projecthub/nekhbet/using-the-yl-39-yl-69-soil-humidity-sensor-with-arduino-968268
- https://playground.arduino.cc/Main/DHT11Lib
- https://www.techtalks.lk/blog/2018/2/thingsboard-mqtt-arduino-part-1