#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
#define LEDGreen 2
#define LEDRed 3
#define Buzzer 4
#define DHT_PIN 6
#define DHT_TYPE DHT22
#define sensorMIN 0
#define sensorMAX 512
#define Threshold 300
#define BUTTON_ON 10
#define BUTTON_OFF 11
#define echo 8
#define trig 9
DHT dht(DHT_PIN, DHT_TYPE);
int value = 0; //variable to store the sensor value
int level = 0; //variable to store the water level
bool programOn = false; // variable to store the program state
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(115200);
pinMode(Buzzer, OUTPUT);
pinMode(LEDGreen, OUTPUT);
pinMode(LEDRed, OUTPUT);
pinMode(BUTTON_ON, INPUT_PULLUP);
pinMode(BUTTON_OFF, INPUT_PULLUP);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
digitalWrite(LEDGreen, LOW);
digitalWrite(LEDRed, LOW);
dht.begin();
lcd.setCursor(6, 0);
lcd.print("Welcome");
lcd.setCursor(2, 1);
lcd.print("TEMPT. & HUMIDITY");
lcd.setCursor(5, 2);
lcd.print("ULTRASONIC");
lcd.setCursor(7, 3);
lcd.print("SENSOR");
delay(4000);
lcd.clear();
}
float readDistance() {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
int duration = pulseIn(echo, HIGH);
return duration * 0.034 / 2;
}
void loop() {
if (digitalRead(BUTTON_ON) == LOW) {
programOn = true;
lcd.clear();
}
if (digitalRead(BUTTON_OFF) == LOW) {
programOn = false;
lcd.clear();
lcd.setCursor(6, 0);
lcd.print("System Off");
}
if (programOn) {
delay(1000);
//START
noTone(Buzzer);
digitalWrite(LEDGreen, LOW);
digitalWrite(LEDRed, LOW);
value = analogRead(DHT_PIN);
digitalWrite(DHT_PIN, LOW);
delay(1000);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
float distance = readDistance();
if (temperature < 25 && humidity < 25) {
noTone(Buzzer);
digitalWrite(LEDGreen, HIGH);
digitalWrite(LEDRed, LOW);
Serial.print("ATTENTION!!! LOW TEMPERATURE");
lcd.setCursor(1, 3);
lcd.print("LOW TEMPERATURE ");
} else if (temperature > 35 || humidity > 35) {
tone(Buzzer, 1000, 500); // Play a high-pitched tone for 500 ms
digitalWrite(LEDGreen, LOW);
digitalWrite(LEDRed, HIGH);
Serial.print("ATTENTION!!! TEMPERATURE TOO HIGH. ");
lcd.setCursor(5, 3);
lcd.print("TEMP. TOO HIGH");
} else {
level = map(value, sensorMIN, sensorMAX, 0, 10); // to be 10 levels
tone(Buzzer, 500, 500); // Play a medium-pitched tone for 500 ms
}
Serial.print("TEMPERATURE DETECTED: ");
Serial.print(temperature);
Serial.print(" HUMIDITY: ");
Serial.println(humidity);
lcd.setCursor(0, 0);
lcd.print("TEMPERATURE: ");
lcd.setCursor(13, 0);
lcd.print(temperature);
lcd.setCursor(0, 1);
lcd.print("HUMIDITY : ");
lcd.setCursor(13, 1);
lcd.print(humidity);
if (distance < 50) {
digitalWrite(LEDRed, HIGH);
digitalWrite(LEDGreen, LOW);
} else {
digitalWrite(LEDRed, LOW);
digitalWrite(LEDGreen, HIGH);
}
Serial.print("Distance: ");
Serial.println(distance);
lcd.setCursor(0, 2);
lcd.print("DISTANCE: ");
lcd.setCursor(10, 2);
lcd.print(distance);
lcd.print(" cm");
} else {
noTone(Buzzer);
digitalWrite(LEDGreen, LOW);
digitalWrite(LEDRed, LOW);
}
}