#include "DHT.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
// Pin Definitions
#define POWER_PIN 32 // ESP32's pin GPIO32 that provides the power to the rain sensor
#define DO_PIN 13 // ESP32's pin GPIO13 connected to DO pin of the rain sensor
#define DHT_SENSOR_PIN 21 // ESP32 pin GPIO21 connected to DHT22 sensor
#define TRIG_PIN 23 // ESP32 pin GPIO23 connected to Ultrasonic Sensor's TRIG pin
#define ECHO_PIN 22 // ESP32 pin GPIO22 connected to Ultrasonic Sensor's ECHO pin
#define BUZZER_PIN 25 // ESP32 pin GPIO25 connected to Buzzer
#define LED_PIN 18 // ESP32 pin GPIO26 connected to LED
// create an LCD object (Hex address, # characters, # rows)
// my LCD display in on Hex address 27 and is a 16x2 version
LiquidCrystal_I2C lcd(0x27, 16, 2);
// DHT Sensor Object
DHT dht_sensor(DHT_SENSOR_PIN, DHT22);
void setup() {
// Initialize Serial Communication
Serial.begin(9600);
// Initialize the Arduino's pin as an input pin
pinMode(POWER_PIN, OUTPUT);
pinMode(DO_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
// Initialize the DHT sensor
dht_sensor.begin();
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
lcd.print("weather station");
}
void loop() {
// Read humidity and temperature from DHT sensor
float humi = dht_sensor.readHumidity();
float tempC = dht_sensor.readTemperature();
lcd.clear();
// Print temperature to Serial Monitor
Serial.print("Temperature: ");
Serial.print(tempC);
Serial.println("°C ");
// Print Temperature to LCD Monitor
lcd.setCursor(0, 0);
lcd.print("Temperature: ");
lcd.setCursor(0, 1);
lcd.print(tempC);
lcd.print("°C");
delay(2000);
lcd.clear();
// Generate 10-microsecond pulse to TRIG pin
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Measure duration of pulse from ECHO pin
long duration_us = pulseIn(ECHO_PIN, HIGH);
// Calculate the distance
float distance_cm = 0.017 * duration_us;
// Print the value to Serial Monitor
Serial.print("distance: ");
Serial.print(distance_cm);
Serial.println(" cm");
// Print the value to LCD Monitor
lcd.setCursor(0 , 0);
lcd.println("Distance: ");
lcd.setCursor(0 , 1);
lcd.print(distance_cm);
lcd.println(" cm");
delay(2000);
lcd.clear();
// Rain Sensor Part
digitalWrite(POWER_PIN, HIGH); // turn the rain sensor's power ON
delay(10); // wait 10 milliseconds
int rain_state = digitalRead(DO_PIN);
digitalWrite(POWER_PIN, LOW); // turn the rain sensor's power OFF
if (rain_state == HIGH) {
Serial.println("The rain is NOT detected");
lcd.setCursor(0, 0);
lcd.println("The rain is NOT ");
lcd.setCursor(0, 1);
lcd.println("Detected");
digitalWrite(BUZZER_PIN, LOW); // turn the buzzer OFF
digitalWrite(LED_PIN, LOW); // turn the LED OFF
} else {
Serial.println("The rain is detected");
lcd.setCursor(0, 0);
lcd.println("The rain is ");
lcd.setCursor(0, 1);
lcd.println("Detected");
digitalWrite(BUZZER_PIN, HIGH); // turn the buzzer ON
digitalWrite(LED_PIN, HIGH); // turn the LED ON
}
delay(2000); // pause for 2 seconds
lcd.clear();
}