#include <LiquidCrystal.h>
#include <DHT.h>
int rs = D2;
int en = D3;
int d4 = D4;
int d5 = D5;
int d6 = D6;
int d7 = D7;
int soilMoisturePin = A0;
int ledPin = D8;
int moistureValue = 0;
#define DHTPIN D10
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define PIR_PIN D9
#define BUZZER_PIN D11
#define TRIG_PIN D12
#define ECHO_PIN D13
int ldrPin = A1;
int nitrogenPin = A2;
int phosphorousPin = A3;
int potassiumPin = A4;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
unsigned long previousMillis = 0;
const long buzzerDuration = 20000;
bool buzzerActive = false;
// Separate LED pins
#define RED_LED_PIN D14
#define GREEN_LED_PIN D15
void setup() {
lcd.begin(16, 2);
lcd.print("Soil Moisture:");
Serial.begin(9600);
dht.begin();
pinMode(ledPin, OUTPUT);
pinMode(PIR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Set LED pins as output
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
}
void loop() {
moistureValue = analogRead(soilMoisturePin);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
int ldrValue = analogRead(ldrPin);
int nitrogenValue = analogRead(nitrogenPin);
int phosphorousValue = analogRead(phosphorousPin);
int potassiumValue = analogRead(potassiumPin);
long duration, distance;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = (duration / 2) * 0.0343;
Serial.print("Soil Moisture: ");
Serial.println(moistureValue);
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("LDR Value: ");
Serial.println(ldrValue);
Serial.print("Nitrogen: ");
Serial.println(nitrogenValue);
Serial.print("Phosphorous: ");
Serial.println(phosphorousValue);
Serial.print("Potassium: ");
Serial.println(potassiumValue);
Serial.print("Distance: ");
Serial.println(distance);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SM: ");
lcd.print(moistureValue);
lcd.setCursor(0, 1);
lcd.print("T: ");
lcd.print(temperature, 1);
lcd.print("C D: ");
lcd.print(distance);
if (moistureValue < 130) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
int pirState = digitalRead(PIR_PIN);
if (pirState == HIGH && !buzzerActive) {
Serial.println("Motion detected!");
digitalWrite(BUZZER_PIN, HIGH);
Serial.println("Buzzer ON");
buzzerActive = true;
previousMillis = millis();
}
if (buzzerActive && (millis() - previousMillis >= buzzerDuration)) {
digitalWrite(BUZZER_PIN, LOW);
Serial.println("Buzzer OFF");
buzzerActive = false;
}
int npkCombined = nitrogenValue + phosphorousValue + potassiumValue;
if (npkCombined < 500) {
digitalWrite(RED_LED_PIN, HIGH);
} else {
digitalWrite(RED_LED_PIN, LOW);
}
if (ldrValue + npkCombined + moistureValue > 150 && distance < 100 ) {
digitalWrite(GREEN_LED_PIN, HIGH);
} else {
digitalWrite(GREEN_LED_PIN, LOW);
}
delay(2000);
}