#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define PIR_PIN 2
#define SERVO_PIN 9
#define TIMER_DURATION 3000
#define RESET_INTERVAL 15000
#define PIR_WAIT_INTERVAL 15000
unsigned long timerStart;
unsigned long resetTimer;
boolean pirActive = false;
#include <Servo.h>
Servo myservo;
void setup() {
Serial.begin(9600);
pinMode(PIR_PIN, INPUT);
pinMode(SERVO_PIN, OUTPUT);
display.begin(0x3C);
display.display();
delay(2000);
display.clearDisplay();
myservo.attach(SERVO_PIN);
myservo.write(90); // Initial position
}
void loop() {
unsigned long currentMillis = millis();
// Check if the timer has expired
if (currentMillis - timerStart >= TIMER_DURATION) {
// Activate PIR sensor during the 15-second wait
if (currentMillis - resetTimer <= PIR_WAIT_INTERVAL) {
pirActive = true;
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("take");
display.display();
// Check if motion is detected by PIR sensor
if (digitalRead(PIR_PIN) == HIGH) {
myservo.write(180); // Move the servo motor 180 degrees
delay(1000); // Wait for servo movement to complete
myservo.write(90); // Return the servo to its original position
}
} else {
// Reset the timer and deactivate PIR sensor
timerStart = currentMillis;
pirActive = false;
resetTimer = currentMillis;
}
}
// Display the timer on OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
unsigned long remainingTime = TIMER_DURATION - (currentMillis - timerStart);
int seconds = remainingTime / 1000 % 60;
int minutes = remainingTime / (1000 * 60) % 60;
int hours = remainingTime / (1000 * 60 * 60) % 24;
display.print("Timer: ");
display.print(hours);
display.print(":");
display.print(minutes);
display.print(":");
display.print(seconds);
display.display();
}