Grazie ad entrambi per la risposta.
@ORSO2001, la parte logica della programmazione l'avevo abbastanza chiara in mente, il mio problema è che scrivendo il codice poi non faceva quello che volevo; Probabilmente pechè ho usato sia per la void allarm() che per quella snooz le stesse variabili previousMillis e currentMillis ad esclusione di noteDuration e snoozeDuration.
Scritto così se premo un tasto il buzzer si silenzia solo per qualche secondo a prescindere del tempo impostato a snoozeDuration e, non ne capisco il motivo! Con il delay invece tutto funziona correttamente però poi si ibena tutto e non mi va bene.
const int buzzer = D7; //buzzer to arduino pin D7
bool AllertBuzzer = true;
String Allert;
bool StoredAllert;
unsigned long previousMillis = 0;
const long snoozeDuration = 300000;
const long pauseBetweenNotes = 1000;
const long noteDuration = 1000;
boolean outputTone = false; // Records current state
void snooze()
{
unsigned long currentMillis = millis();
int Value = analogRead(0);
int Btn = 0;
if ((Value > 5) && (Value < 20)) (Btn = 1); //enter
if ((Value > 240) && (Value < 300)) (Btn = 2); //up
if ((Value > 400) && (Value < 450)) (Btn = 3); //down
if ((Value > 500) && (Value < 600)) (Btn = 4); //back
if ((Btn >= 1) && (Btn <= 3))
{
if (currentMillis - previousMillis < snoozeDuration)
{
previousMillis = currentMillis;
noTone(buzzer);
Serial.println ("BUTTON PRESSED - ALLARM SNOOZED");
Serial.print ("Value= ");
Serial.println(Value);
Serial.print("Delta Millis: ");
Serial.println(currentMillis - previousMillis);
delay(30000);
}
}
/*
else if (Btn = 4)
{
noTone(buzzer);
Serial.println ("BUTTON PRESSED - ALLARM STOPPED");
Serial.print ("Value= ");
Serial.println(Value);
}
*/
}
void allarm()
{
snooze();
unsigned long currentMillis = millis();
if (outputTone) {
// We are currently outputting a tone
// Check if it's been long enough and turn off if so
if (currentMillis - previousMillis >= noteDuration)
{
previousMillis = currentMillis;
noTone(buzzer);
outputTone = false;
}
}
else {
// We are currently in a pause
// Check if it's been long enough and turn on if so
if (currentMillis - previousMillis >= pauseBetweenNotes)
{
previousMillis = currentMillis;
tone(buzzer, 1000);
outputTone = true;
}
}
}