// Variabili per il tempo
volatile uint32_t ticks = 0;
volatile uint32_t interval = 0;
volatile bool intervalReady = false;
// Funzione di conversione tempo (assumendo che ogni tick è 0.01 secondi)
void convertiTicksInTempo(uint32_t ticks, int& ore, int& minuti, int& secondi, int& centesimi) {
// Calcola il totale dei secondi
uint32_t secondi_totali = ticks / 100;
// Calcola il rimanente dei centesimi
centesimi = ticks % 100;
// Estrae ore, minuti e secondi
ore = secondi_totali / 3600;
minuti = (secondi_totali / 60) % 60;
secondi = secondi_totali % 60;
}
// Funzione associata all'external interrupt sul pin 2
void buttonPressed() {
if (digitalRead(2) == LOW) {
interval = ticks;
} else {
interval = ticks - interval;
intervalReady = true;
}
}
void setup() {
Serial.begin(115200);
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), buttonPressed, CHANGE);
}
void loop() {
// Incremento ticks ogni 0.01 secondi (10 ms == 10000 us)
static uint32_t baseTime;
if (micros() - baseTime >= 10000) {
baseTime += 10000;
ticks++;
}
// Visualizza l'intervallo quando pronto
if (intervalReady) {
intervalReady = false;
// Calcola ore, minuti, secondi e centesimi
int ore, minuti, secondi, centesimi;
convertiTicksInTempo(interval, ore, minuti, secondi, centesimi);
Serial.print("Ticks: "); Serial.print(interval);
Serial.print(" -> Tempo: ");
Serial.print(ore); Serial.print("h ");
Serial.print(minuti); Serial.print("m ");
Serial.print(secondi); Serial.print("s ");
Serial.print(centesimi); Serial.println("cs");
}
}