#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
// DHT22 setup
#define DHTPIN 4 // GPIO pin connected to DHT22 data
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Soil Moisture Sensor
#define SOIL_PIN 34 // Analog pin
// Relay pins
#define FAN_RELAY 26
#define PUMP_RELAY 27
// LED pin
#define LED_PIN 2
// LCD setup (I2C address might be 0x27 or 0x3F)
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
// Initialize sensors
dht.begin();
// LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Smart Farming");
// Relay and LED pins
pinMode(FAN_RELAY, OUTPUT);
pinMode(PUMP_RELAY, OUTPUT);
pinMode(LED_PIN, OUTPUT);
// Default OFF
digitalWrite(FAN_RELAY, HIGH); // relay module is active LOW
digitalWrite(PUMP_RELAY, HIGH);
digitalWrite(LED_PIN, LOW);
delay(2000);
}
void loop() {
// Read sensors
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int soilValue = analogRead(SOIL_PIN);
int soilPercent = map(soilValue, 4095, 0, 0, 100); // Convert to percentage
// Print to serial
Serial.print("Temp: "); Serial.print(temp); Serial.println("C");
Serial.print("Humidity: "); Serial.print(hum); Serial.println("%");
Serial.print("Soil: "); Serial.print(soilPercent); Serial.println("%");
// Display on LCD
lcd.clear();
lcd.setCursor(0,0);
lcd.print("T:");
lcd.print(temp,1);
lcd.print("C H:");
lcd.print(hum,0);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("Soil:");
lcd.print(soilPercent);
lcd.print("%");
// Control FAN (based on temperature)
if (temp > 30) {
digitalWrite(FAN_RELAY, LOW); // Turn ON
} else {
digitalWrite(FAN_RELAY, HIGH); // Turn OFF
}
// Control PUMP (based on soil moisture)
if (soilPercent < 40) { // Dry soil
digitalWrite(PUMP_RELAY, LOW); // Turn ON
digitalWrite(LED_PIN, HIGH); // LED ON when watering
} else {
digitalWrite(PUMP_RELAY, HIGH); // Turn OFF
digitalWrite(LED_PIN, LOW);
}
delay(2000); // update every 2 sec
}
FAN
PUMP