ciao ziopippo,
allora...per farla breve ti posto un mio esempio di alarm/snooze.
in pratica all'apparire di un allarme dato da random all'inizio hai che il LED sul pin 13 si accende, anche scritta su monitor seriale...se non fai nulla l'allarme si mette in pausa da solo...e si riattiva dopo un po'...se premi il pulsante snooze (attento che nell'esempio deve essere collegato a GND) l'allarme si tacita per un po' ma se ancora presente ritorna...a monitor seriale scrivo tutti gli stadi dell'alarm/snooze...vedi se ti può essere utile per quello che ti serve...manca il reset di tutto quando l'allarme rientra...
#define SNOOZEBUTTON 2
unsigned long alarmTime;
unsigned long snoozeTime;
boolean alarm;
boolean alarmNotPresent;
boolean snooze;
void setup() {
Serial.begin(9600);
pinMode(SNOOZEBUTTON , INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
alarmTime = millis();
alarmNotPresent = true;
alarm = false;
snooze = false;
}
void loop() {
int aCaso = random(0, 10000);
if (aCaso == 500 && alarmNotPresent) {
alarmNotPresent = false;
Serial.println("allarme");
}
if (!alarmNotPresent) {
if (!alarm) {
digitalWrite(LED_BUILTIN, HIGH);
alarm = true;
alarmTime = millis();
}
}
if (alarm) {
if (!digitalRead(SNOOZEBUTTON) && !snooze) {
Serial.println("snooze pressed");
snooze = true;
snoozeTime = millis();
digitalWrite(LED_BUILTIN, LOW);
}
else if (snooze && millis() - snoozeTime >= 10000) {
Serial.println("snooze time expired");
digitalWrite(LED_BUILTIN, HIGH);
alarmTime = millis();
snooze = false;
}
if (!snooze) {
if (digitalRead(LED_BUILTIN) && millis() - alarmTime >= 15000) {
Serial.println("alarm horn pause");
digitalWrite(LED_BUILTIN, LOW);
alarmTime = millis();
}
if (!digitalRead(LED_BUILTIN) && millis() - alarmTime >= 5000) {
Serial.println("alarm horn enable again");
digitalWrite(LED_BUILTIN, HIGH);
alarmTime = millis();
}
}
}
}