/*
Realizzare un sistema che sia in grado di accendere un led ogni secondo utilizzando i timer nativi di Arduino.
Inoltre, alla pressione di un tasto, incrementare un contatore tramite una funzione di interrupt, visualizzando
il valore su seriale ad ogni cambiamento.
*/
// Includo la libreria "TimerOne", una delle tante che x
// permette la gestione dei timer nativi di Arduino
#include "TimerOne.h"
// Devo utilizzare uno dei pin in grado di gestire gli interrupt
// NB: DA MODIFICARE RISPETTO ALLO SCHEMA PRESENTE!!!
#define BTNPIN 2
#define LEDPIN 8
int counter = 0;
int prevValue = 0;
boolean ledState = false;
void setup(){
Serial.begin(9600);
pinMode(LEDPIN, OUTPUT);
// Creo un nuovo timer, dandogli il tempo in cui generare l'evento
// e quale funzione utilizzare
Timer1.initialize(1000000); //valore 1 secondo
Timer1.attachInterrupt(changePinState);
// Creo l'interrupt che permette di gestire il pulsante, andando a gestire azioni che
// esulano dal normale flusso del programma
attachInterrupt(digitalPinToInterrupt(BTNPIN), interruptHandler, RISING); //rising = rilascio ; falling = pressione
}
void loop(){
// Gestico la sezione critica ignorando eventuali interrupts generati quando
// vado ad incrementare il contatore
noInterrupts();
int value = counter;
interrupts();
if (value != prevValue){
Serial.println(value);
prevValue = value;
}
}
void changePinState(){
if (!ledState){
digitalWrite(LEDPIN, HIGH);
} else {
digitalWrite(LEDPIN, LOW);
}
ledState = !ledState;
}
void interruptHandler(){
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
// Per gestire il bounce del pulsante non accetto azioni per 150ms,
// non funziona con i semplici delay all'interno degli interrupt
if (interrupt_time - last_interrupt_time > 150)
{
counter ++;
}
last_interrupt_time = interrupt_time;
}