#include "DHT.h"
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define DHTPIN 6
#define DHTTYPE DHT22
#define SOIL_MOISTURE_SDA 3
#define SOIL_MOISTURE_SCL A0
#define RELAY_PIN 13
#define RAIN_SENSOR_PIN 2
// Motor A connections
int enA = 5;
int in1 = 9;
int in2 = 10;
// Motor B connections
int enB = 6;
int in3 = 11;
int in4 = 12;
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
Serial.begin(9600);
pinMode(RELAY_PIN, OUTPUT);
pinMode(RAIN_SENSOR_PIN, INPUT_PULLUP);
lcd.begin(16, 2);
digitalWrite(RELAY_PIN, HIGH);
delay(1000);
digitalWrite(RELAY_PIN, LOW);
delay(1000);
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Turn off motors - Initial state
stopMotor();
Serial.println("SETUP DONE");
lcd.println("SETUP DONE");
dht.begin();
}
void loop()
{
updateDHT22Data();
updateSoilMoisture();
controlRelay();
printSensorData();
// Check for rain
if (digitalRead(RAIN_SENSOR_PIN) == LOW) // Rain detected
{
forward();
delay(1000); // Move forward for 1 second
stopMotor();
}
else
{
backward();
delay(1000); // Move backward for 1 second
stopMotor();
}
delay(2000);
}
void updateDHT22Data()
{
delay(2000);
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(t) || isnan(f))
{
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
Serial.print(F("% Temperature: "));
Serial.print(t);
lcd.print(F("Temp: "));
lcd.print(t);
}
void printSensorData()
{
int sensorData1 = analogRead(SOIL_MOISTURE_SDA);
int sensorData2 = analogRead(SOIL_MOISTURE_SCL);
Serial.print(" Sensor Data 1: ");
Serial.print(sensorData1);
Serial.print(" | ");
Serial.print("Sensor Data 2: ");
Serial.print(sensorData2);
Serial.println();
}
void controlRelay()
{
int moisture = analogRead(SOIL_MOISTURE_SDA);
if (moisture > 400)
{
digitalWrite(RELAY_PIN, HIGH);
lcd.print("| relay pin high |");
Serial.print("| relay pin high |");
}
else
{
digitalWrite(RELAY_PIN, LOW);
}
}
void updateSoilMoisture()
{
int relayState = digitalRead(RELAY_PIN);
lcd.setCursor(0, 1);
lcd.print("Sensor: ");
Serial.print("| Moisture sensor: ");
if (relayState == HIGH)
{
lcd.print("Off");
Serial.print("Off");
}
else
{
lcd.print("On ");
Serial.print("On");
}
}
void forward()
{
analogWrite(enA, 255);
analogWrite(enB, 255);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in4, HIGH);
digitalWrite(in3, LOW);
}
void backward()
{
analogWrite(enA, 255);
analogWrite(enB, 255);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in4, LOW);
digitalWrite(in3, HIGH);
}
void stopMotor()
{
analogWrite(enA, 0);
analogWrite(enB, 0);
}