#include <DHT.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
// Pin Definitions
#define DHTPIN 5 // Pin connected to DATA pin of DHT22
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1
#define BUTTON_ENTER 2 // Button 1 (Enter) pin
#define BUTTON_EXIT 3 // Button 2 (Exit) pin
#define BUTTON_RESET 4 // Button 3 (Reset) pin
#define TRIG_PIN 7 // Ultrasonic Trig pin
#define ECHO_PIN 8 // Ultrasonic Echo pin
#define BUZZER_PIN 9 // Buzzer pin
#define DISTANCE_THRESHOLD 25 // Distance in cm for buzzer activation
// Create instances of the DHT sensor, OLED display, and RTC
DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
RTC_DS3231 rtc;
// Variables for tracking attendance and sensor data
int enterCount = 0;
int exitCount = 0;
int studentsInRoom = 0;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_ENTER, INPUT_PULLUP);
pinMode(BUTTON_EXIT, INPUT_PULLUP);
pinMode(BUTTON_RESET, INPUT_PULLUP);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
dht.begin();
// Initialize the OLED display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (1); // Infinite loop
}
if (!rtc.begin()) {
Serial.println(F("Couldn't find RTC"));
while (1);
}
if (rtc.lostPower()) {
Serial.println(F("RTC lost power, setting the time!"));
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("Initializing..."));
display.display();
delay(2000);
}
void loop() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
display.clearDisplay();
display.setCursor(0, 0);
display.println(F("DHT Sensor Error!"));
display.display();
return;
}
// Handle button presses
if (digitalRead(BUTTON_ENTER) == LOW) {
studentsInRoom++;
enterCount++;
delay(200);
}
if (digitalRead(BUTTON_EXIT) == LOW) {
if (studentsInRoom > 0) {
studentsInRoom--;
exitCount++;
}
delay(200);
}
if (digitalRead(BUTTON_RESET) == LOW) {
enterCount = 0;
exitCount = 0;
studentsInRoom = 0;
delay(200);
}
// Trigger the ultrasonic sensor to measure distance
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration * 0.0344 / 2;
// Activate buzzer if an object is detected within the threshold distance
if (distance < DISTANCE_THRESHOLD) {
digitalWrite(BUZZER_PIN, HIGH);
} else {
digitalWrite(BUZZER_PIN, LOW);
}
// Clear the display and print new data
display.clearDisplay();
display.setCursor(0, 0);
DateTime now = rtc.now();
display.print(F("Time: "));
display.print(now.hour());
display.print(':');
display.print(now.minute());
display.print(':');
display.print(now.second());
display.println();
display.print(F("Temp: "));
display.print(temperature, 1);
display.println(F(" C"));
display.print(F("Hum: "));
display.print(humidity, 1);
display.println(F(" %"));
display.print(F("In Room: "));
display.println(studentsInRoom);
display.print(F("Entered: "));
display.println(enterCount);
display.print(F("Exited: "));
display.println(exitCount);
display.display();
delay(2000);
}