#include <TimerOne.h>
// Pin Definitions
const int a = 22, b = 23, c = 24, d = 25, e = 26, f = 27, g = 28; // Segment pins for the first display
const int a1 = 30, b1 = 31, c1 = 32, d1 = 33, e1 = 34, f1 = 36, g1 = 35; // Segment pins for the second display
const int red = 43; // 7-Segment Display Pin
const int buzzer = 3; // Buzzer pin
const int pushbutton = 10; // Button pin
const int motionSensor = 2; // Motion sensor pin
// Global Variables
int counter = 60; // Timer countdown (start at 60 seconds)
bool isCounting = false; // Timer countdown active state
bool motionDetected = false; // Motion detected flag
bool buzzerActive = false; // Flag for buzzer status
// Timer Interrupt Function
void myTimerIsr_1() {
if (isCounting && motionDetected) {
if (counter > 0) {
counter--; // Countdown logic
} else {
Timer1.detachInterrupt(); // Stop timer when it reaches 0
buzzerActive = true; // Activate buzzer tone
}
}
}
void setup() {
// Initialize Segment Pins
pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT);
pinMode(a1, OUTPUT); pinMode(b1, OUTPUT); pinMode(c1, OUTPUT); pinMode(d1, OUTPUT); pinMode(e1, OUTPUT); pinMode(f1, OUTPUT); pinMode(g1, OUTPUT);
pinMode(red, OUTPUT); // Set up LED
pinMode(buzzer, OUTPUT); // Set up Buzzer
pinMode(pushbutton, INPUT); // Set up Button
pinMode(motionSensor, INPUT); // Set up Motion Sensor
Timer1.initialize(1000000); // Timer interrupt every 1 second
}
void loop() {
// Check Button Press to Start Countdown
if (digitalRead(pushbutton) == HIGH && !isCounting) {
isCounting = true; // Enable countdown
motionDetected = false; // Reset motion detection
counter = 60; // Reset counter to 60 seconds
digitalWrite(red, HIGH); // Turn on LED
buzzerActive = false; // Deactivate buzzer
noTone(buzzer); // Ensure buzzer is off
Timer1.attachInterrupt(myTimerIsr_1); // Start the timer interrupt
}
// Check Motion Sensor
if (digitalRead(motionSensor) == HIGH) {
motionDetected = true; // Set motion detected flag
}
// Handle Buzzer Behavior
if (buzzerActive) {
tone(buzzer, 5000); // BOOOMM
}
// Update Display
show(counter);
// Turn off LED when countdown ends
if (counter == 0) {
digitalWrite(red, LOW); // Turn off LED
}
}
// Function to Display Number on 7-Segment Displays
void show(uint16_t time) {
if (time == 0) {
seg2(0); seg1(0); // Show "00" on display
} else {
seg2(time / 10); // Display tens place
seg1(time % 10); // Display units place
}
}
// Function to Display Numbers on First 7-Segment Display
void seg1(int disp) {
switch (disp) {
case 0: digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); break;
case 1: digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break;
case 2: digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, LOW); break;
case 3: digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); break;
case 4: digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); break;
case 5: digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); break;
case 6: digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break;
case 7: digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break;
case 8: digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break;
case 9: digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); break;
default: digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break;
}
}
// Function to Display Numbers on Second 7-Segment Display
void seg2(int disp) {
switch (disp) {
case 0: digitalWrite(a1, LOW); digitalWrite(b1, LOW); digitalWrite(c1, LOW); digitalWrite(d1, LOW); digitalWrite(e1, LOW); digitalWrite(f1, LOW); digitalWrite(g1, HIGH); break;
case 1: digitalWrite(a1, HIGH); digitalWrite(b1, LOW); digitalWrite(c1, LOW); digitalWrite(d1, HIGH); digitalWrite(e1, HIGH); digitalWrite(f1, HIGH); digitalWrite(g1, HIGH); break;
case 2: digitalWrite(a1, LOW); digitalWrite(b1, LOW); digitalWrite(c1, HIGH); digitalWrite(d1, LOW); digitalWrite(e1, LOW); digitalWrite(f1, HIGH); digitalWrite(g1, LOW); break;
case 3: digitalWrite(a1, LOW); digitalWrite(b1, LOW); digitalWrite(c1, LOW); digitalWrite(d1, LOW); digitalWrite(e1, HIGH); digitalWrite(f1, HIGH); digitalWrite(g1, LOW); break;
case 4: digitalWrite(a1, HIGH); digitalWrite(b1, LOW); digitalWrite(c1, LOW); digitalWrite(d1, HIGH); digitalWrite(e1, HIGH); digitalWrite(f1, LOW); digitalWrite(g1, LOW); break;
case 5: digitalWrite(a1, LOW); digitalWrite(b1, HIGH); digitalWrite(c1, LOW); digitalWrite(d1, LOW); digitalWrite(e1, HIGH); digitalWrite(f1, LOW); digitalWrite(g1, LOW); break;
case 6: digitalWrite(a1, LOW); digitalWrite(b1, HIGH); digitalWrite(c1, LOW); digitalWrite(d1, LOW); digitalWrite(e1, LOW); digitalWrite(f1, LOW); digitalWrite(g1, LOW); break;
case 7: digitalWrite(a1, LOW); digitalWrite(b1, LOW); digitalWrite(c1, LOW); digitalWrite(d1, HIGH); digitalWrite(e1, HIGH); digitalWrite(f1, HIGH); digitalWrite(g1, HIGH); break;
case 8: digitalWrite(a1, LOW); digitalWrite(b1, LOW); digitalWrite(c1, LOW); digitalWrite(d1, LOW); digitalWrite(e1, LOW); digitalWrite(f1, LOW); digitalWrite(g1, LOW); break;
case 9: digitalWrite(a1, LOW); digitalWrite(b1, LOW); digitalWrite(c1, LOW); digitalWrite(d1, LOW); digitalWrite(e1, HIGH); digitalWrite(f1, LOW); digitalWrite(g1, LOW); break;
default: digitalWrite(a1, HIGH); digitalWrite(b1, HIGH); digitalWrite(c1, HIGH); digitalWrite(d1, HIGH); digitalWrite(e1, HIGH); digitalWrite(f1, HIGH); digitalWrite(g1, HIGH); break;
}
}