#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Define pins for the sensors
#define DHTPIN 4 // DHT22 data pin
#define TRIG_PIN 5 // HC-SR04 trigger pin
#define ECHO_PIN 18 // HC-SR04 echo pin
// Define analog pins for the simulated NPK sensor
#define N_PIN 34 // Analog pin for Nitrogen
#define P_PIN 35 // Analog pin for Phosphorus
#define K_PIN 36 // Analog pin for Potassium
// Uncomment the type of sensor in use:
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
// Initialize DHT sensor.
DHT dht(DHTPIN, DHTTYPE);
// Speed of sound in cm/us
#define SOUND_SPEED 0.034
// Initialize LCD displays (change I2C addresses if different)
LiquidCrystal_I2C lcdDHT(0x27, 16, 2); // Address 0x27 for DHT22 display
LiquidCrystal_I2C lcdUltrasonic(0x3F, 16, 2); // Address 0x3F for Ultrasonic display
LiquidCrystal_I2C lcdNPK(0x3E, 16, 2); // Address 0x3E for NPK display
void setup() {
// Start the Serial Monitor
Serial.begin(115200);
Serial.println(F("DHT22, Ultrasonic, and NPK sensor test!"));
// Start the DHT sensor
dht.begin();
// Initialize the ultrasonic sensor pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Initialize each LCD display
lcdDHT.init();
lcdDHT.backlight();
lcdUltrasonic.init();
lcdUltrasonic.backlight();
lcdNPK.init();
lcdNPK.backlight();
// Print initial messages on LCDs
lcdDHT.setCursor(0, 0);
lcdDHT.print("DHT22: ");
lcdUltrasonic.setCursor(0, 0);
lcdUltrasonic.print("Ultrasonic: ");
lcdNPK.setCursor(0, 0);
lcdNPK.print("NPK: ");
Serial.println("Setup completed");
delay(1000); // Allow some time for the sensors to initialize
}
void loop() {
// Wait a few seconds between measurements.
delay(2000);
// Reading temperature and humidity from DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Check if any reads failed
if (isnan(humidity) || isnan(temperature)) {
Serial.println(F("Failed to read from DHT sensor!"));
lcdDHT.setCursor(7, 1);
lcdDHT.print("Error");
} else {
// Print DHT sensor results
Serial.print(F("Humidity: "));
Serial.print(humidity);
Serial.print(F("% Temperature: "));
Serial.print(temperature);
Serial.println(F("°C"));
// Display on LCD
lcdDHT.setCursor(7, 1);
lcdDHT.print(temperature, 1);
lcdDHT.print(" C");
// Check conditions
if (temperature > 38) {
Serial.println(F("High temperature! Highly drought."));
} else {
Serial.println(F("Normal weather."));
}
if (humidity < 35) {
Serial.println(F("Alert: Watering is required!"));
}
}
// Send a short pulse to trigger the ultrasonic sensor measurement
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Read the echo duration
long duration = pulseIn(ECHO_PIN, HIGH, 60000); // Timeout in 60ms
// Calculate distance in cm
float distance = (duration * SOUND_SPEED) / 2;
// Print distance
if (duration == 0) {
Serial.println(F("No echo received or out of range"));
lcdUltrasonic.setCursor(11, 1);
lcdUltrasonic.print("Error");
} else {
if (distance > 400 || distance < 2) { // Assuming sensor range 2cm to 400cm
Serial.println("Distance out of range");
lcdUltrasonic.setCursor(11, 1);
lcdUltrasonic.print("Out of Range");
} else {
Serial.print(F("Distance: "));
Serial.print(distance);
Serial.println(F(" cm"));
// Display on LCD
lcdUltrasonic.setCursor(11, 1);
lcdUltrasonic.print(distance);
lcdUltrasonic.print(" cm");
}
}
// Read simulated NPK values
int nitrogen = analogRead(N_PIN);
int phosphorus = analogRead(P_PIN);
int potassium = analogRead(K_PIN);
// Print NPK sensor results
Serial.print(F("Nitrogen (N): "));
Serial.println(nitrogen);
Serial.print(F("Phosphorus (P): "));
Serial.println(phosphorus);
Serial.print(F("Potassium (K): "));
Serial.println(potassium);
// Display on LCD
lcdNPK.setCursor(8, 0);
lcdNPK.print(nitrogen);
lcdNPK.setCursor(8, 1);
lcdNPK.print(phosphorus);
lcdNPK.setCursor(8, 2);
lcdNPK.print(potassium);
delay(1000); // Wait for a second before the next measurement
}
Loading
esp32-s2-devkitm-1
esp32-s2-devkitm-1