Smart Garden

  Dinca Laura-Aida - SSA

Project Description

Smart Garden project aims to be a plant environment monitoring system. Thanks to a temperature and humidity sensor, we have the data on the basis of which we can implement a logic for opening the irrigation system when needed. Being a proof of concept implementation, it has not yet been used in a real garden and the condition for opening the valve is chosen for testing purposes.

Hardware

Components:

  • NodeMCU 32S
  • Raspberry pi 4
  • DHT22 - temperature and humidity sensor
  • Solenoid valve - 12V, normally closed
  • H-Bridge - model L298N, 12V
  • Resistor 10kOhm
  • Power supply adapter - 12V
  • Breadboard
  • Connection wires

Electric circuit

To ensure the control of the motor (the solenoid valve), we need a driver (H-bridge) with the role of providing the voltage and current necessary for good operation. Thus, a driver acts as a connection interface. The motors require a high level of current, while the rest of the circuit, a lower one, so it is recommended to isolate the power supply of the motors from the rest of the components.

To maintain the data line HIGH and ensure good communication between the sensor and the ESP32, I added a 10K pull-up resistor between VCC and the data line.

Software

Raspberry Pi server

This part is for creating the database and for defining its elements; in this case, an id and two integers, temperature and humidity for the values read from the sensor.

import sqlite3
import os
 
database_path = "./database.db"
 
conn = sqlite3.connect(database_path)
cursor = conn.cursor()
 
cursor.execute("""
    CREATE TABLE IF NOT EXISTS sensorData (
        id INTEGER PRIMARY KEY,
        temperature INTEGER,
        humidity INTEGER
    )
""")
 
conn.commit()
conn.close()

For displaying the latest data when making a GET request, we include the following:

<!DOCTYPE html>
 <head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">
 <title>ESP32 Weather Report</title>
 <style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}
  body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}
  p {font-size: 24px;color: #444444;margin-bottom: 10px;}
  </style>
  </head>
  <body>
  <div id=\"webpage\">
  <h1>ESP32 Weather Report</h1>
 
  <p>Temperature: {{temperature}}&deg C</p>
  <p>Humidity: {{humidity}} %</p>
 
  </div>
  </body>
  </html>

Result:

We will insert sensor data into the database when receiving a POST request. The second endpoint is for GET request and will display the latest data from the database.

from flask import Flask, send_file, request, render_template
import sqlite3
 
 
app = Flask(__name__)
database_path = "./database.db"  
 
@app.route('/insert_sensor_data', methods=['POST'])
def insert_sensor_data():
    # Connect to the database
    conn = sqlite3.connect(database_path)
    cursor = conn.cursor()
 
    data = request.get_json();
 
    humidity = data['humidity']
    temperature = data['temperature']
 
 
 
    # Save the data in the database
    cursor.execute("INSERT INTO sensorData (temperature, humidity) VALUES (?, ?)", (temperature, humidity))
 
    # Commit the changes and close the database connection
    conn.commit()
    conn.close()
 
    return "Sensor data uploaded"
 
@app.route('/latestData')
def latest_data():
    # Connect to the database
    conn = sqlite3.connect(database_path)
    cursor = conn.cursor()
 
    cursor.execute("SELECT temperature, humidity FROM sensorData WHERE id = (SELECT MAX(id) from sensorData)")
    result = cursor.fetchone()
 
    # Save the data to a temporary file
    temperature = result[0]
    humidity = result[1]
 
    # Close the database connection
    conn.close()
 
    # Send the data file in the response
    return render_template('./index.html',temperature=temperature, humidity=humidity)
 
 
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

ESP32 environment

Initializing the pin connections and DHT sensor, including the necessary libraries and the variables for connecting to the network (both ESP32 and Raspberry pi must be connected to the same WI-FI):

#include <WiFi.h>
#include <HTTPClient.h>
#include <WebServer.h>
#include "DHT.h"
 
#define DHTTYPE DHT22 
#define RELAY_PIN 16
 
const char* ssid = "";  // Enter SSID here
const char* password = "";  //Enter Password here
 
// DHT Sensor
uint8_t DHTPin = 4;
 
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);    
 
float temperature;
float humidity;
void setup() {
  Serial.begin(115200);
  delay(100);
  pinMode(DHTPin, INPUT);
  dht.begin();   
 
  pinMode(RELAY_PIN, OUTPUT);
 
  //connect to your local wi-fi network
  WiFi.begin(ssid, password);
 
 
  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");  Serial.println(WiFi.localIP());
 
}

In the loop() function, we read the values and send them using the created http client as json:

HTTPClient http;
  // Prepare the data that will be send
  temperature = dht.readTemperature();
  humidity = dht.readHumidity();
  String data = "{\"humidity\":" + String(humidity) + ",\"temperature\":" + String(temperature) + "}";
 
  // Send a POST request with JSON data
  http.begin("http://192.168.1.104:5000/insert_sensor_data");
  http.addHeader("Content-Type", "application/json");
  int httpResponseCode = http.POST(data);
 
  // Check the response code
  if (httpResponseCode > 0) {
    String response = http.getString();
    Serial.println(httpResponseCode);
    Serial.println(response);
  } else {
    Serial.print("Error sending request: ");
    Serial.println(httpResponseCode);
  }

The condition for opening the valve is defined below:

//condition for opening the valve
  if ((int(temperature) > 35) && (int(humidity) <60)) {
 
    digitalWrite(RELAY_PIN, HIGH); // open valve 20 seconds
    delay(20000);
    digitalWrite(RELAY_PIN, LOW);  // close valve
  }

References:

iothings/proiecte/2022sric/smart-garden.txt · Last modified: 2023/06/02 06:23 by laura_aida.dinca
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0