#define buttonSnooze 2
#define buttonOff 3
#define buzzer 8
volatile uint8_t count = 0;
volatile bool alarmActive = true;
volatile bool snoozeActive = false;
volatile uint8_t snoozeCount = 0;
void setup() {
/* definindo os pinos do buzzer como saída
e os pinos do pushbutton como entrada */
pinMode(buttonSnooze, INPUT_PULLUP);
pinMode(buttonOff, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
tone(buzzer, 262); // ligando buzzer
attachInterrupt(digitalPinToInterrupt(buttonSnooze), snoozeISR, FALLING); // interrupção da função soneca
attachInterrupt(digitalPinToInterrupt(buttonOff), stopISR, FALLING); // interrupção da função parar
noInterrupts();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 15624;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
interrupts();
}
// interrupção do despertador
ISR(TIMER1_COMPA_vect) {
if (snoozeActive) {
snoozeCount++;
if (snoozeCount >= 10) { // Soneca de 10 segundos
snoozeActive = false;
tone(buzzer, 262); // Religa o buzzer
count = 0; // Reinicia a contagem do alarme
}
return; // Sai da ISR, não conta para o alarme enquanto está em soneca
}
if (alarmActive) {
count++;
if (count >= 30) { // Tocou por 30 segundos
noTone(buzzer);
alarmActive = false;
TIMSK1 &= ~(1 << OCIE1A);
}
}
}
// interrpção da função soneca
void snoozeISR() {
if (alarmActive && !snoozeActive) {
snoozeActive = true;
snoozeCount = 0;
noTone(buzzer); // Desliga o buzzer
}
}
// interrupção de parar o alarme
void stopISR() {
alarmActive = false;
snoozeActive = false;
noTone(buzzer);
TIMSK1 &= ~(1 << OCIE1A);
}
void loop() {
// Tudo fica nas interrupções.
}