#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// -------- Pin Definitions --------
#define DHTPIN 5
#define DHTTYPE DHT11
#define SOIL_PIN A0
#define LED_DRY 9
#define LED_MORE 10
#define LED_PERFECT 11
#define LED_WET 12
// -------- Soil Moisture Calibration --------
// Calibrate these values based on your sensor
#define SOIL_DRY 300 // Value when dry in air
#define SOIL_WET 850 // Value when in water
#define SOIL_PERFECT_MIN 500
#define SOIL_PERFECT_MAX 700
// -------- Objects --------
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// -------- Variables --------
int moisture = 0;
int moisturePercent = 0;
float humidity = 0;
float temperature = 0;
void setup() {
Serial.begin(9600);
// Initialize LEDs
pinMode(LED_DRY, OUTPUT);
pinMode(LED_MORE, OUTPUT);
pinMode(LED_PERFECT, OUTPUT);
pinMode(LED_WET, OUTPUT);
// Initialize LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Soil Monitor");
lcd.setCursor(0, 1);
lcd.print("Starting...");
// Initialize DHT
dht.begin();
delay(2000);
lcd.clear();
}
void loop() {
// ---- Read Sensors ----
moisture = analogRead(SOIL_PIN);
humidity = dht.readHumidity();
temperature = dht.readTemperature();
// Calculate moisture percentage
moisturePercent = map(moisture, SOIL_DRY, SOIL_WET, 0, 100);
moisturePercent = constrain(moisturePercent, 0, 100);
// ---- Check DHT Sensor ----
if (isnan(humidity) || isnan(temperature)) {
Serial.println("DHT Sensor Error!");
lcd.setCursor(0, 0);
lcd.print("Sensor Error! ");
lcd.setCursor(0, 1);
lcd.print("Check DHT ");
delay(2000);
return;
}
// ---- Serial Monitor Output ----
Serial.print("Soil: ");
Serial.print(moisture);
Serial.print(" (");
Serial.print(moisturePercent);
Serial.print("%) | Temp: ");
Serial.print(temperature);
Serial.print("C | Humidity: ");
Serial.print(humidity);
Serial.println("%");
// ---- LED Control ----
controlLEDs();
// ---- LCD Display ----
updateLCD();
delay(1000); // Update every 1 second
}
void controlLEDs() {
// Turn off all LEDs first
digitalWrite(LED_DRY, LOW);
digitalWrite(LED_MORE, LOW);
digitalWrite(LED_PERFECT, LOW);
digitalWrite(LED_WET, LOW);
// Turn on appropriate LED
if (moisture > 850) {
digitalWrite(LED_WET, HIGH);
}
else if (moisture > 500) {
digitalWrite(LED_PERFECT, HIGH);
}
else if (moisture > 300) {
digitalWrite(LED_MORE, HIGH);
}
else {
digitalWrite(LED_DRY, HIGH);
}
}
void updateLCD() {
// Line 1: Temperature and Humidity
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print((int)temperature);
lcd.print("C H:");
lcd.print((int)humidity);
lcd.print("% ");
// Line 2: Soil Moisture
lcd.setCursor(0, 1);
lcd.print("Soil:");
if (moisture > 850) {
lcd.print("Wet ");
}
else if (moisture > 500) {
lcd.print("Good ");
}
else if (moisture > 300) {
lcd.print("Dry ");
}
else {
lcd.print("VeryDry");
}
// Show percentage if space allows
lcd.setCursor(12, 1);
lcd.print(moisturePercent);
lcd.print("%");
}