#include <avr/io.h>
#include <util/delay.h>
// Define pin connections
#define ALARM_PIN 8
#define VOLUME_UP_PIN 9
#define VOLUME_DOWN_PIN 10
#define SWITCH_PIN 11
// Volume settings
#define MAX_VOLUME 10
#define MIN_VOLUME 0
void setup() {
// Set pin directions
pinMode(ALARM_PIN, OUTPUT); // Set ALARM_PIN as output
pinMode(VOLUME_UP_PIN, INPUT_PULLUP); // Set VOLUME_UP_PIN as input with pull-up resistor
pinMode(VOLUME_DOWN_PIN, INPUT_PULLUP); // Set VOLUME_DOWN_PIN as input with pull-up resistor
pinMode(SWITCH_PIN, INPUT_PULLUP); // Set SWITCH_PIN as input with pull-up resistor
Serial.begin(9600);
}
void loop() {
static uint8_t volume = 5; // Initial volume level
static uint8_t alarm_on = 0; // Alarm is initially off
// Check if the switch is pressed
if (digitalRead(SWITCH_PIN) == LOW) {
delay(50); // Debounce delay
if (digitalRead(SWITCH_PIN) == LOW) {
alarm_on = !alarm_on; // Toggle alarm state
while (digitalRead(SWITCH_PIN) == LOW); // Wait for switch release
}
}
// Adjust volume up
if (digitalRead(VOLUME_UP_PIN) == LOW) {
delay(50); // Debounce delay
if (digitalRead(VOLUME_UP_PIN) == LOW && volume < MAX_VOLUME) {
volume++;
while (digitalRead(VOLUME_UP_PIN) == LOW); // Wait for button release
}
}
// Adjust volume down
if (digitalRead(VOLUME_DOWN_PIN) == LOW) {
delay(50); // Debounce delay
if (digitalRead(VOLUME_DOWN_PIN) == LOW && volume > MIN_VOLUME) {
volume--;
while (digitalRead(VOLUME_DOWN_PIN) == LOW); // Wait for button release
}
}
// Control the alarm
if (alarm_on) {
digitalWrite(ALARM_PIN, HIGH); // Turn on alarm
delay(1000 / (volume + 1)); // Volume affects delay (frequency)
digitalWrite(ALARM_PIN, LOW); // Turn off alarm
delay(1000 / (volume + 1)); // Volume affects delay (frequency)
} else {
digitalWrite(ALARM_PIN, LOW); // Ensure alarm is off
}
delay(100); // Main loop delay
}