#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// Pin definitions
#define DHTPIN 2
#define DHTTYPE DHT22 // DHT 22
#define LDRPIN A0
#define PIRPIN 3
#define BUTTONPIN 13
#define LED1 5 // LED to indicate the active sensor display
#define LED2 6 // LED to indicate a specific condition (e.g., motion detected)
// Initializations
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS1307 rtc;
DHT dht(DHTPIN, DHTTYPE);
// Variables
int sensorState = 0; // Tracks the current sensor being displayed
unsigned long lastUpdate = 0;
const unsigned long updateInterval = 500; // 1 second update interval
int buzzer = 7;
void setup() {
pinMode(BUTTONPIN, INPUT_PULLUP);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(buzzer,OUTPUT);
lcd.begin(16, 2);
lcd.backlight();
dht.begin();
if (!rtc.begin() || !rtc.isrunning()) {
lcd.print("RTC error");
while (1);
}
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
updateDisplay(); // Initial display
}
void loop() {
checkButton();
updateDisplay(); // Continuous display update based on interval
checkMotion(); // Real-time motion detection
}
void checkButton() {
static bool buttonPressed = false;
if (digitalRead(BUTTONPIN) == LOW && !buttonPressed) {
delay(50); // Debounce
buttonPressed = true;
sensorState = (sensorState + 1) % 4;
updateDisplay();
}
buttonPressed = digitalRead(BUTTONPIN) == LOW;
}
void updateDisplay() {
if (millis() - lastUpdate >= updateInterval) {
lastUpdate = millis();
lcd.clear();
switch (sensorState) {
case 0: displayTemperatureHumidity(); break;
case 1: displayLightLevel(); break;
case 2: displayMotionStatus(); break;
case 3: displayTimeDate(); break;
}
}
}
unsigned char i;
void checkMotion() {
if (digitalRead(PIRPIN) == HIGH) {
digitalWrite(LED2, HIGH);
delay(50);
digitalWrite(LED2,LOW);
delay(15);
for(i=0;i<80;i++) {
digitalWrite(buzzer,HIGH);
delay(3);//wait for 1ms
digitalWrite(buzzer,LOW);
delay(4);//wait for 1ms
}
if (sensorState == 2) displayMotionStatus();
} else {
digitalWrite(LED2, LOW);
//digitalWrite(buzzer,LOW);
}
}
void displayTemperatureHumidity() {
lcd.setCursor(0, 0);
lcd.print("Temp: " + String(dht.readTemperature()) + " C");
lcd.setCursor(0, 1);
lcd.print("Humidity: " + String(dht.readHumidity()) + " %");
}
void displayLightLevel() {
lcd.setCursor(0, 0);
lcd.print("Light Level:");
lcd.setCursor(0, 1);
lcd.print(analogRead(LDRPIN));
}
void displayMotionStatus() {
lcd.setCursor(0, 0);
lcd.print("Motion: ");
lcd.setCursor(0, 1);
lcd.print(digitalRead(PIRPIN) == HIGH ? "Detected" : "None");
}
void displayTimeDate() {
DateTime now = rtc.now();
lcd.setCursor(0, 0);
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
lcd.setCursor(0, 1);
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
}