#include <WiFi.h>
#include <WiFiClient.h>
#include "secret.h"
#include <OneWire.h>
#include "DHT.h"
#include <ThingSpeak.h>
char ssid[] = SECRET_SSID; // network SSID
char pass[] = SECRET_PASS; // ynetwork password
WiFiClient client;
unsigned long myChannelNumber = SECRET_CH_ID; // ThingSpeak channel ID
const char * myWriteAPIKey = SECRET_WRITE_APIKEY; // ThingSpeak API key
#define SOILPIN_1 5 // Analog pin connected to the first soil moisture sensor
#define SOILPIN_2 18 // Analog pin connected to the second soil moisture sensor
#define wet_THRESHOLD 18
#define dry_THRESHOLD 24
int soil_moisture1 = 0;
int soil_moisture2 = 0;
#define TRIGPIN 14 // Digital pin connected to the JSN-SR04M-2 Sensor trigger
#define ECHOPIN 27 // Digital pin connected to the JSN-SR04M-2 Sensor echo
int water_level_cm;
float duration, distance;
#define PUMP_PIN 25 // Digital pin connected to the relay module for the water pump
#define VALVE_PIN 26 // Digital pin connected to the relay module for the valve
#define DHTPIN 33 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
OneWire ds(4); // Analog Pin connected to the DS18B20 Sensors
byte data[9];
byte DS_1[8]={0x28,0x5A,0xBD ,0x56 ,0xB5 ,0x01 ,0x3C, 0xDD}; // Rom Adress of the first DS18B20
byte DS_2[8]{0x28 ,0x5D ,0x6A ,0x56 ,0xB5 ,0x01 ,0x3C, 0x57}; // Rom Adress of the Second DS18B20
float get_Temp(byte addr[]);
void setup()
{
Serial.begin(115200);
WiFi.begin(SECRET_SSID, SECRET_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
dht.begin();
pinMode(SOILPIN_1, INPUT); // Initialize first soil moisture sensor pin
pinMode(SOILPIN_2, INPUT); // Initialize second soil moisture sensor pin
pinMode(TRIGPIN, OUTPUT); // Initialize JSN-SR04M-2 trigger pin
pinMode(ECHOPIN, INPUT); // Initialize JSN-SR04M-2 echo pin
pinMode(PUMP_PIN, OUTPUT); // Initialize water pump relay pin
pinMode(VALVE_PIN, OUTPUT); // Initialize valve relay pin
}
void loop()
{
float temperature_1 = get_Temp(DS_1);
float temperature_2 = get_Temp(DS_2);
Serial.print("DS_1: ");
Serial.print(temperature_1);
Serial.print(" DS_2: ");
Serial.println(temperature_2);
float humidity = dht.readHumidity();
if (isnan(humidity)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
Serial.print(F("DHT Humidity: "));
Serial.print(humidity);
Serial.print(F("%"));
soil_moisture1 = analogRead(SOILPIN_1); // read the analog value from sensor 1
soil_moisture1 = map(soil_moisture1, 0, 4095, 0, 100);
soil_moisture2 = analogRead(SOILPIN_1); // read the analog value from sensor 2
soil_moisture2 = map(soil_moisture2, 0, 4095, 0, 100);
Serial.print("Soil moisture 1: ");
Serial.print(soil_moisture1);
Serial.println("%");
Serial.print("Soil moisture 2: ");
Serial.print(soil_moisture2);
Serial.println("%");
water_level_cm = getDistance();
condition();
if (WiFi.status() == WL_CONNECTED) {
delay(1000);
Serial.println("Connected to WiFi...");
// Update ThingSpeak channel with sensor data
ThingSpeak.setField(1, soil_moisture1);
ThingSpeak.setField(2, soil_moisture2);
ThingSpeak.setField(3, temperature_1);
ThingSpeak.setField(4, temperature_2);
ThingSpeak.setField(5, humidity);
ThingSpeak.setField(6, water_level_cm);
// write to the ThingSpeak channel
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if(x == 200){
Serial.println("Channel update successful.");
}
else{
Serial.println("Problem updating channel. HTTP error code " + String(x));
}
}
}