#include <DHT.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 2
#define DHTTYPE DHT22
#define TRIG_PIN 9
#define ECHO_PIN 10
#define LDR_PIN A0
#define LED_PIN_LIGHT 3
#define LED_PIN_WATER 4
#define TEMP_POT_PIN A1
#define HUMIDITY_POT_PIN A2
#define WATER_LEVEL_POT_PIN A3
DHT dht(DHTPIN, DHTTYPE);
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4);
LiquidCrystal_I2C lcd2(0x28, 16, 2);
const int containerHeight = 30;
void setup() {
Serial.begin(9600);
dht.begin();
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_PIN_LIGHT, OUTPUT);
pinMode(LED_PIN_WATER, OUTPUT);
lcd.init();
lcd.backlight();
lcd2.init();
lcd2.backlight();
}
void loop() {
DateTime now = rtc.now();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Current Time: ");
lcd.print(now.hour());
lcd.print(':');
lcd.print(now.minute());
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" *C");
lcd.setCursor(0, 2);
lcd.print("Hum: ");
lcd.print(h);
lcd.print(" %");
long duration;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration * 0.034 / 2;
int waterLevel = containerHeight - distance;
lcd2.clear();
lcd2.setCursor(0, 0);
lcd2.print("Water Level: ");
lcd2.print(waterLevel);
lcd2.print(" cm");
if (distance > 20 || distance < 5) {
digitalWrite(LED_PIN_WATER, HIGH);
} else {
digitalWrite(LED_PIN_WATER, LOW);
}
int lightLevel = analogRead(LDR_PIN);
lcd2.setCursor(0, 1);
lcd2.print("Light Level: ");
lcd2.print(lightLevel);
if (lightLevel < 300) {
digitalWrite(LED_PIN_LIGHT, HIGH);
} else {
digitalWrite(LED_PIN_LIGHT, LOW);
}
delay(1000);
}