// reduzir a frequencia na metade dobra o tempo
// TCNT1 = 65536 - (F_CPU / prescaler / desired_frequency)
// 65536-(16MHz/1024/1Hz) = 49911 = 0xC2F7, 1 segundo
// 65536-(16MHz/1024/0.5Hz) = 34286 = 0x85EE, 2 segundos
// 65536-(16MHz/1024/0.25Hz) = 3036 = 0xBDC, 4 segundos
// para 8 segundos precisa de contador pois o timer1 nao suporta o valor
const byte BTN_LIGA = 2;
const byte BTN_SONECA = 3;
const byte BUZZER = 8;
const byte LED = 9;
volatile bool alarme = false;
volatile bool soneca = false;
volatile uint8_t segundos = 0;
volatile byte overflowCount = 0;
//interrupção do TIMER1
ISR(TIMER1_OVF_vect) {
TCNT1 = 0xC2F7; // Renicia TIMER
overflowCount++;
if (overflowCount >= 1) {
overflowCount = 0;
segundos++;
Serial.println(segundos);
}
if (segundos >= 5 && soneca) {
overflowCount = 0;
segundos = 0;
change_alarm();
} else if (segundos >= 30 && alarme) {
change_alarm();
}
}
void change_alarm() {
overflowCount = 0;
segundos = 0;
if (alarme) {
alarme = false;
soneca = false;
} else {
alarme = true;
soneca = false;
}
}
void start_soneca() {
overflowCount = 0;
segundos = 0;
if (alarme) {
alarme = false;
soneca = true;
}
}
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(BTN_LIGA, INPUT);
pinMode(BTN_SONECA, INPUT);
attachInterrupt(digitalPinToInterrupt(BTN_LIGA), change_alarm, FALLING);
attachInterrupt(digitalPinToInterrupt(BTN_SONECA), start_soneca, FALLING);
// Configuração do timer1
TCCR1A = 0; //confira timer para operação normal pinos OC1A e OC1B desconectados
TCCR1B = 0; //limpa registrador
TCCR1B |= (1 << CS10) | (1 << CS12);// configura prescaler para 1024: CS12 = 1 e CS10 = 1
TCNT1 = 0xC2F7; // incia timer com valor para que estouro ocorra em 1 segundo
TIMSK1 |= (1 << TOIE1); // habilita a interrupção do TIMER1
}
void loop() {
if (alarme) {
digitalWrite(LED, HIGH);
tone(BUZZER, 300);
} else {
digitalWrite(LED, LOW);
noTone(BUZZER);
}
}
// inverte estado do led do arduiono usando xor e negacao da entrada
// as duas fazem a mesma coisa
// digitalWrite(LED_BUILTIN, digitalRead(LED_BUILTIN) ^ !0);
// digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));