// Link library needed
#include <RTClib.h>
#include <Adafruit_Sensor.h> //For DHT22 Sensor
#include <DHT.h>
#include <DHT_U.h>
#include <LiquidCrystal_I2C.h> //LCD Display
// Declare Pins & Variable
#define SW_In_Pin 13
#define DataPin 20 // Pins for Sensor Input
#define DHTPIN DataPin
#define DHTTYPE DHT22
#define LEDPin 17 // Pin for temperature warning Led
#define LED_Out_Pin 11 // Pin for Light system
#define BuzzerPin 16 // Pin for temperature warning buzzer
DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 rtc; //declare rtc object
LiquidCrystal_I2C lcd(0x27,20,4); //set lcd to I2c . 20 column , 4 rows
char Light[15];
char weather[10];
int sensorVal;
const int ANALOG_READ_PIN = 2;
float Temperature;
float Humidity;
char daysOfWeek[7][12] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
void setup() {
Serial.begin(115200);
// SETUP PIN MODES
pinMode(SW_In_Pin, INPUT);
pinMode(DataPin, INPUT);
pinMode(BuzzerPin, OUTPUT);
pinMode(LEDPin, OUTPUT);
pinMode(LED_Out_Pin, OUTPUT);
// SETUP DHT22
dht.begin();
// SETUP RTC MODULE
if (! rtc.begin()) {
Serial.println("RTC module is NOT found");
Serial.flush();
while (1);
}
// Set the time zone offset to +8 hours
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)) + TimeSpan(8 * 3600));
// automatically sets the RTC to the date & time on PC this sketch was compiled
// manually sets the RTC with an explicit date & time, for example to set
// January 21, 2021 at 3am you would call:
// rtc.adjust(DateTime(2021, 1, 21, 3, 0, 0));
}
void loop() {
// Data print out of DHT22
Temperature = dht.readTemperature();
Humidity = dht.readHumidity();
Serial.print("Temperature = ");
Serial.print(Temperature);
Serial.print(" °C ");
Serial.print(" Humidity = ");
Serial.print(Humidity);
Serial.println(" % ");
// Initial promote for temperature
if (Temperature <= 0) {
strcpy(weather, "Frozen!");
} else if (Temperature <= 15) {
strcpy(weather, "Cold!");
} else if (Temperature <= 35) {
strcpy(weather, "Warm");
} else if (Temperature <= 45) {
strcpy(weather, "Hot!");
} else if (Temperature > 45) {
strcpy(weather, "Alert!!");
}
// Warning system for High or Low temperature
if (Temperature >= 45) {
if(digitalRead(SW_In_Pin) == 0){ //Stop the warning system if bottom click
Serial.println("Warning! Temperature is too high!");
digitalWrite(LEDPin, HIGH); // Activate warning LED
digitalWrite(BuzzerPin, HIGH); // Activate buzzer
delay(200);
digitalWrite(LEDPin, LOW);
digitalWrite(BuzzerPin, LOW);
delay(5);
}
} else if (Temperature <= -10) {
if(digitalRead(SW_In_Pin) == 0){
Serial.println("Warning! Temperature is low!");
digitalWrite(LEDPin, HIGH); // Activate warning LED
delay(200);
digitalWrite(LEDPin, LOW);
delay(5);
}
} else{
digitalWrite(LEDPin, LOW); // Deactivate warning LED
digitalWrite(BuzzerPin, LOW); // Deactivate buzzer
delay(5);
}
//Read and print the light sensor pin value
sensorVal = analogRead(ANALOG_READ_PIN);
Serial.print("Lux: ");
Serial.print(sensorVal);
Serial.print(" Current situation: ");
Serial.println(Light);
// Determine light condition based on sensor value
if (sensorVal > 7813){ //<1LM
strcpy(Light, "starga.");
} else if (sensorVal > 6862){ //<10LM
strcpy(Light, "Dark");
} else if (sensorVal > 5062){ //<25LM
strcpy(Light, "dim");
} else if (sensorVal > 1360){ //<50LM
strcpy(Light, "Light");
} else if (sensorVal <= 1360){ //<1000LM
strcpy(Light, "glare");
}
if(sensorVal > 5062){
digitalWrite(LED_Out_Pin, HIGH); // Activate Street light
} else {
digitalWrite(LED_Out_Pin, LOW);
}
// Data print out of RTC_DS1307
DateTime now = rtc.now();
Serial.print("ESP32 RTC Date Time: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.println(now.second(), DEC);
Serial.println("=====================================================");
//lcd printout
lcd.init(); // initalize
lcd.backlight(); // background colour
// Temperature
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.setCursor(5,0);
lcd.print(Temperature);
lcd.setCursor(10,0);
lcd.print((char)223); // Printing the temperature symbol
lcd.setCursor(11,0);
lcd.print("C");
lcd.setCursor(13,0);
lcd.print(weather);
// Humidity
lcd.setCursor(0, 1);
lcd.print("Humidity:");
lcd.setCursor(9, 1);
lcd.print(Humidity);
lcd.setCursor(14, 1);
lcd.print("%"); // Printing the humidity symbol
// Day
lcd.setCursor(0, 2);
lcd.print(now.day());
lcd.setCursor(2, 2);
lcd.print("/");
lcd.print(now.month());
lcd.setCursor(5,2);
lcd.print("/");
lcd.setCursor(6,2);
lcd.print(now.year());
lcd.setCursor(11,2);
lcd.print(daysOfWeek[now.dayOfTheWeek()]);
// Time
lcd.setCursor(0,3);
lcd.print(now.hour());
lcd.setCursor(2,3);
lcd.print(":");
lcd.setCursor(3,3);
lcd.print(now.minute());
lcd.setCursor(5,3);
lcd.print(":");
lcd.setCursor(6,3);
lcd.print(now.second());
//Light
lcd.setCursor(9,3);
lcd.print("Lm:");
lcd.print(Light);
}