#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <Adafruit_BMP280.h>
#include <LiquidCrystal_I2C.h>
// Pin Definitions
#define DHTPIN 9 // DHT22 data pin
#define RAIN_SENSOR_PIN 17 // Rain sensor
#define LED_NORMAL 18 // Normal condition LED
#define LED_WARNING 28 // Warning condition LED
#define LED_CRITICAL 20 // Critical condition LED
// DHT Setup
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// BMP280 Setup
Adafruit_BMP280 bmp; // I2C interface
// LCD Setup
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adjust the I2C address if necessary
void setup() {
Serial.begin(115200);
// Initialize DHT
dht.begin();
// Initialize BMP280
if (!bmp.begin(0x76)) { // Adjust the address if necessary
Serial.println("Could not find BMP280 sensor!");
while (1);
}
// Initialize LCD
lcd.begin(16, 2); // Set the LCD size (16 columns, 2 rows)
lcd.backlight(); // Turn on the backlight
lcd.setCursor(0, 0);
lcd.print("Weather Monitor");
delay(2000); // Initial display delay
// Set up GPIO
pinMode(RAIN_SENSOR_PIN, INPUT);
pinMode(LED_NORMAL, OUTPUT);
pinMode(LED_WARNING, OUTPUT);
pinMode(LED_CRITICAL, OUTPUT);
}
void loop() {
// Test LCD display with static text first
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Testing LCD...");
delay(2000);
// Read temperature and humidity from DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Read pressure from BMP280
float pressure = bmp.readPressure() / 100.0F; // Convert to hPa
// Read rain sensor
int rainValue = digitalRead(RAIN_SENSOR_PIN);
bool isRaining = (rainValue == LOW); // Assuming LOW means raining
// LED logic based on temperature
if (temperature < 15) {
digitalWrite(LED_CRITICAL, HIGH);
digitalWrite(LED_WARNING, LOW);
digitalWrite(LED_NORMAL, LOW);
} else if (temperature >= 15 && temperature < 25) {
digitalWrite(LED_WARNING, HIGH);
digitalWrite(LED_CRITICAL, LOW);
digitalWrite(LED_NORMAL, LOW);
} else {
digitalWrite(LED_NORMAL, HIGH);
digitalWrite(LED_WARNING, LOW);
digitalWrite(LED_CRITICAL, LOW);
}
// Display data on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperature, 1);
lcd.print("C H:");
lcd.print(humidity, 1);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("P:");
lcd.print(pressure, 1);
lcd.print("hPa R:");
lcd.print(isRaining ? "Y" : "N");
// Print to Serial Monitor
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" C, Humidity: ");
Serial.print(humidity);
Serial.print("%, Pressure: ");
Serial.print(pressure);
Serial.print(" hPa, Raining: ");
Serial.println(isRaining ? "Yes" : "No");
delay(2000); // Update every 2 seconds
}