#include <DHT.h>
// ================= PIN DEFINITIONS =================
#define SOIL_PIN 34
#define RAIN_PIN 32
#define LDR_PIN 35
#define DHT_PIN 4
#define DHT_TYPE DHT22
#define PIR_PIN 27
#define TRIG_PIN 5
#define ECHO_PIN 18
#define BUZZER_PIN 25
#define PUMP_LED_PIN 26
// ================= DHT22 =================
DHT dht(DHT_PIN, DHT_TYPE);
// ================= SETUP =================
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(PIR_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(PUMP_LED_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(PUMP_LED_PIN, LOW);
Serial.println();
Serial.println("================================");
Serial.println(" SMART AGRICULTURE SYSTEM");
Serial.println("================================");
}
// ================= ULTRASONIC =================
float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration == 0) {
return -1;
}
return duration * 0.0343 / 2;
}
// ================= IRRIGATION SCHEDULE =================
void irrigationSchedule(float temperature,
int soilMoisture,
int rainLevel) {
Serial.println();
Serial.println("---------- IRRIGATION SCHEDULE ----------");
if (rainLevel >= 50) {
Serial.println("IRRIGATION : POSTPONED");
Serial.println("RECOMMENDED TIME: AFTER RAIN");
Serial.println("REASON : Rain detected");
}
else if (soilMoisture < 40 && temperature > 35) {
Serial.println("IRRIGATION : REQUIRED");
Serial.println("RECOMMENDED TIME: EARLY MORNING / EVENING");
Serial.println("REASON : Soil is dry and temperature is high");
}
else if (soilMoisture < 40) {
Serial.println("IRRIGATION : REQUIRED");
Serial.println("RECOMMENDED TIME: MORNING");
Serial.println("REASON : Soil moisture is low");
}
else {
Serial.println("IRRIGATION : NOT REQUIRED");
Serial.println("RECOMMENDED TIME: NOT REQUIRED");
Serial.println("REASON : Soil moisture is sufficient");
}
Serial.println("-----------------------------------------");
}
// ================= CROP RECOMMENDATION =================
void cropRecommendation(float temperature,
float humidity,
int soilMoisture,
int rainLevel) {
Serial.println();
Serial.println("---------- CROP RECOMMENDATION ----------");
if (rainLevel < 30 &&
soilMoisture < 40 &&
temperature > 30) {
Serial.println("FIELD CONDITION : HOT & DRY");
Serial.println("RECOMMENDED CROP: MAIZE / GROUNDNUT");
}
else if (rainLevel >= 60 &&
soilMoisture >= 60 &&
temperature >= 20 &&
temperature <= 35) {
Serial.println("FIELD CONDITION : WET");
Serial.println("RECOMMENDED CROP: RICE");
}
else if (temperature >= 20 &&
temperature <= 30 &&
soilMoisture >= 40 &&
soilMoisture <= 70) {
Serial.println("FIELD CONDITION : MODERATE");
Serial.println("RECOMMENDED CROP: VEGETABLES / PULSES");
}
else {
Serial.println("FIELD CONDITION : VARIABLE");
Serial.println("RECOMMENDED CROP: CHECK LOCAL CONDITIONS");
}
Serial.println("-----------------------------------------");
}
// ================= PEST / DISEASE RISK =================
void pestDiseaseRisk(float temperature,
float humidity,
int soilMoisture,
int rainLevel) {
Serial.println();
Serial.println("---------- PEST / DISEASE RISK ----------");
// High humidity + wet conditions
if (humidity >= 80 &&
soilMoisture >= 70 &&
rainLevel >= 60) {
Serial.println("RISK LEVEL : HIGH");
Serial.println("RISK TYPE : FUNGAL DISEASE RISK");
Serial.println("ACTION : INSPECT CROPS AND IMPROVE AIR CIRCULATION");
}
// Moderate humidity + wet field
else if (humidity >= 65 &&
soilMoisture >= 60) {
Serial.println("RISK LEVEL : MEDIUM");
Serial.println("RISK TYPE : PEST / DISEASE RISK");
Serial.println("ACTION : INCREASE CROP MONITORING");
}
// Hot and dry condition
else if (temperature > 35 &&
humidity < 40 &&
soilMoisture < 40) {
Serial.println("RISK LEVEL : MEDIUM");
Serial.println("RISK TYPE : HEAT / PEST STRESS");
Serial.println("ACTION : PROVIDE IRRIGATION AND MONITOR CROPS");
}
else {
Serial.println("RISK LEVEL : LOW");
Serial.println("RISK TYPE : NO SIGNIFICANT RISK");
Serial.println("ACTION : NORMAL CROP MONITORING");
}
Serial.println("-----------------------------------------");
}
// ================= MAIN LOOP =================
void loop() {
// ---------- DHT22 ----------
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// ---------- SOIL MOISTURE ----------
int soilRaw = analogRead(SOIL_PIN);
int soilMoisture = map(
soilRaw,
4095,
0,
0,
100
);
soilMoisture = constrain(
soilMoisture,
0,
100
);
// ---------- RAIN SENSOR ----------
int rainRaw = analogRead(RAIN_PIN);
int rainLevel = map(
rainRaw,
0,
4095,
100,
0
);
rainLevel = constrain(
rainLevel,
0,
100
);
// ---------- LDR ----------
int lightRaw = analogRead(LDR_PIN);
int lightLevel = map(
lightRaw,
0,
4095,
0,
100
);
lightLevel = constrain(
lightLevel,
0,
100
);
// ---------- PIR ----------
int motion = digitalRead(PIR_PIN);
// ---------- ULTRASONIC ----------
float distance = getDistance();
// =================================================
// FIELD DATA
// =================================================
Serial.println();
Serial.println("---------- FIELD DATA ----------");
Serial.print("Temperature : ");
if (isnan(temperature)) {
Serial.println("Sensor Error");
}
else {
Serial.print(temperature);
Serial.println(" C");
}
Serial.print("Humidity : ");
if (isnan(humidity)) {
Serial.println("Sensor Error");
}
else {
Serial.print(humidity);
Serial.println(" %");
}
Serial.print("Soil Moisture : ");
Serial.print(soilMoisture);
Serial.println(" %");
Serial.print("Rain Level : ");
Serial.print(rainLevel);
Serial.println(" %");
Serial.print("Light Level : ");
Serial.print(lightLevel);
Serial.println(" %");
if (distance > 0) {
Serial.print("Distance : ");
Serial.print(distance);
Serial.println(" cm");
}
// =================================================
// IRRIGATION DECISION
// =================================================
if (soilMoisture < 40 && rainLevel < 50) {
digitalWrite(PUMP_LED_PIN, HIGH);
Serial.println();
Serial.println("SOIL STATUS : DRY");
Serial.println("RAIN STATUS : NO SIGNIFICANT RAIN");
Serial.println("IRRIGATION : REQUIRED");
Serial.println("PUMP : ON");
Serial.println("PUMP LED : ON");
}
else {
digitalWrite(PUMP_LED_PIN, LOW);
Serial.println();
Serial.println("IRRIGATION : NOT REQUIRED");
Serial.println("PUMP : OFF");
Serial.println("PUMP LED : OFF");
}
// =================================================
// ANIMAL / INTRUSION DETECTION
// =================================================
if (motion == HIGH) {
tone(BUZZER_PIN, 2000);
Serial.println();
Serial.println("!!! INTRUSION ALERT !!!");
Serial.println("MOVEMENT : DETECTED");
Serial.println("BUZZER : ON");
}
else {
noTone(BUZZER_PIN);
Serial.println();
Serial.println("MOVEMENT : NOT DETECTED");
Serial.println("BUZZER : OFF");
}
// =================================================
// ENVIRONMENTAL ALERTS
// =================================================
if (!isnan(temperature) && temperature > 35) {
Serial.println("ALERT : HIGH TEMPERATURE");
}
if (!isnan(humidity) && humidity < 40) {
Serial.println("ALERT : LOW HUMIDITY");
}
// =================================================
// IRRIGATION RECOMMENDATION
// =================================================
if (soilMoisture < 40 && rainLevel < 50) {
Serial.println();
Serial.println("RECOMMENDATION:");
Serial.println("Irrigation should be provided.");
}
else if (rainLevel >= 50) {
Serial.println();
Serial.println("RECOMMENDATION:");
Serial.println("Rain detected. Postpone irrigation.");
}
else {
Serial.println();
Serial.println("RECOMMENDATION:");
Serial.println("Soil moisture is sufficient.");
}
// =================================================
// IRRIGATION SCHEDULE
// =================================================
if (!isnan(temperature)) {
irrigationSchedule(
temperature,
soilMoisture,
rainLevel
);
}
// =================================================
// CROP RECOMMENDATION
// =================================================
if (!isnan(temperature) && !isnan(humidity)) {
cropRecommendation(
temperature,
humidity,
soilMoisture,
rainLevel
);
}
// =================================================
// PEST / DISEASE RISK
// =================================================
if (!isnan(temperature) && !isnan(humidity)) {
pestDiseaseRisk(
temperature,
humidity,
soilMoisture,
rainLevel
);
}
Serial.println();
Serial.println("================================");
// Wait 10 seconds before next reading
delay(10000);
}