Soil Moisture Content Measurement Using Esp32 and Thingsio.ai Platform

Introduction: Soil Moisture Content Measurement Using Esp32 and Thingsio.ai Platform

In this tutorial I am going to explain about reading of the moisture content in the soil by using esp32 and then sending the values into the thingsio.ai IoT cloud platform.

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: COMPONENTS

Hardware Components:

1. esp32 development board

2.Soil sensor

3.Jumper Wires

Software:

1. Arduino IDE

2. Thingsio.ai

Step 2: CONNECTIONS

Soil Moisture Sensor----------------------esp32 Board

VCC---------------------------------------3V3

GND--------------------------------------GND

A0----------------------------------------VP

Step 3: CODING:

#include <WiFi.h>
#include <WiFiMulti.h>
#include<WiFiClientSecure.h>
int count=0,i,m,j,k;
int t;
int sensor_pin = A0;
int value ;
//////////////////////////////////////// ALL DECLARATIONS
for CLOUD //////////////////////////////
const char* host = "api.thingsai.io";                                 // OR host =
devapi2.thethingscloud.com
const char* post_url = "/devices/deviceData";       // OR
/api/v2/thingscloud2/_table/data_ac
const char* time_server =
"baas.thethingscloud.com";            
//this is to convert timestamp
const int httpPort = 80;
const int httpsPort = 443;
const char*  server =
"api.thingsai.io";  // Server
URL
char timestamp[10];
WiFiMulti WiFiMulti;
// Use WiFiClient class to create TCP connections
   WiFiClient client;
/////////////////////////////////////// TIMESTAMP
CALCULATION function///////////////////////////////////////
int GiveMeTimestamp()
{
  unsigned long
timeout = millis();
 // WiFiClient client;
  while
(client.available() == 0)
  {
    if (millis() -
timeout > 50000)
    {
      client.stop();
      return 0;
    }
  }
while (client.available())
      {
        String line =
client.readStringUntil('\r');                   
//indexOf() is a funtion to search for smthng , it returns -1 if not
found
        int pos =
line.indexOf("\"timestamp\"");                       //search for
"\"timestamp\"" from beginning of response got and copy all
data after that , it'll be your timestamp
        if (pos >=
0)                                                     
        {
          int j = 0;
         
for(j=0;j<10;j++)
          {
           
timestamp[j] = line[pos + 12 + j];
          }
        }
      }
}  
////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup()
{
   
Serial.begin(115200);
   
Serial.println("Reading From the Sensor ...");
   delay(2000);
    // We start by
connecting to a WiFi network
    WiFiMulti.addAP("Wifi_name",
"Wifi_Password");
    Serial.println();
    Serial.println();
   
Serial.print("Wait for WiFi... ");
   
while(WiFiMulti.run() != WL_CONNECTED) {
       
Serial.print(".");
        delay(500);
    }
   
Serial.println("");
   
Serial.println("WiFi connected");
    Serial.println("IP
address: ");
   
Serial.println(WiFi.localIP());
    delay(500);
}
void loop() 
{
{
/////////////////////////////////////// SEND THE QUERY AND
RECEIVE THE RESPONSE/////////////////////// 
       value=
analogRead(sensor_pin);
     // value =
map(value,550,0,0,100);
       
Serial.print("Mositure : ");
        
Serial.print(value);
         
Serial.println("%");
          
delay(1000);
 
Serial.print("connecting to ");
 
Serial.println(host);                          //defined upside :-
host = devapi2.thethingscloud.com or 139.59.26.117
///////////////////////////////////// TIMESTAMP CODE SNIPPET
/////////////////////////
Serial.println("inside get timestamp\n");
  if
(!client.connect(time_server, httpPort)) 
  {
    return;                                                       
//*-*-*-*-*-*-*-*-*-*
  }
 
client.println("GET /api/timestamp HTTP/1.1");                            //Whats this part
doing, i didnt get
 
client.println("Host: baas.thethingscloud.com");
 
client.println("Cache-Control: no-cache");
 
client.println("Postman-Token:
ea3c18c6-09ba-d049-ccf3-369a22a284b8");
  client.println();
GiveMeTimestamp();           
            //it'll call the
function which will get the timestamp response from the server
Serial.println("timestamp receieved");
Serial.println(timestamp);
 
Serial.println("inside ThingsCloudPost");
  String PostValue =
"{\"device_id\": 61121695918, \"slave_id\": 2";
        PostValue =
PostValue + ",\"dts\":" +timestamp;
   PostValue =
PostValue +",\"data\":{\"MOIST\":" + value
+"}"+"}";
 
Serial.println(PostValue);
/* create an instance of WiFiClientSecure */
WiFiClientSecure client;
   
Serial.println("Connect to server via port 443");
    if
(!client.connect(server, 443)){
       
Serial.println("Connection failed!");
    } else {
       
Serial.println("Connected to server!");
        /* create HTTP
request */
       
client.println("POST /devices/deviceData HTTP/1.1");
       
client.println("Host: api.thingsai.io");
       
//client.println("Connection: close");
       
client.println("Content-Type: application/json");
        client.println("cache-control:
no-cache");
       
client.println("Authorization: Bearer
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.IjVhMzBkZDFkN2QwYjNhNGQzODkwYzQ4OSI.kaY6OMj5cYlWNqC2PNTkXs9PKy6_m9tdW5AG7ajfVlY");
       
client.print("Content-Length: ");
        client.println(PostValue.length());
       
client.println();
       
client.println(PostValue);
//////////////////////////////////POSTING the data on to the
cloud is done and now get the response form cloud server//////////////////
 Serial.print("Waiting for response
");
        while
(!client.available()){
            delay(50);
//
           
Serial.print(".");
        }  
        /* if data is
available then receive and print to Terminal */
        while
(client.available()) {
            char c = client.read();
           
Serial.write(c);
        }
        /* if the
server disconnected, stop the client */
        if
(!client.connected()) {
           
Serial.println();
           
Serial.println("Server disconnected");
            client.stop();
        }
    }
Serial.println("//////////////////////    THE END    
/////////////////////");
delay(3000);
}
}

Step 4: OUTPUT:

The Output of the code is shown.

Step 5: GRAPH

This is the graphical representation of the values which are read from the sensor.

Step 6:

Here is the complete video of the project. Thank You.

Be the First to Share

    Recommendations

    • Backyard Contest

      Backyard Contest
    • Silly Hats Speed Challenge

      Silly Hats Speed Challenge
    • Finish It Already Speed Challenge

      Finish It Already Speed Challenge

    Discussions

    0
    JJ Slabbert
    JJ Slabbert

    Tip 9 months ago

    Hi, replace the resistive soil moisture sensor with a capacitive soil moisture sensor. These resistive soil moisture sensors suffer from electrolysis.