Aiuto con millis

Sono riuscito a silenziare il buzzer utilizzando delay, vorrei però fare la stessa cosa usando millis in modo da non ibernare il resto durante la funzione snooze().
Il codice di seguito è un'estratto di un progetto più completo (funzionante) che dovrebbe continuare a visualizzare dati durante l silenziamento.
Vorrei poi che mi aiutaste a capire come posso fare per silenziare totalmente il buzzer nel caso in cui premo il tasto back (fino al successivo stato di allarme).

#include <OneWire.h>
#include <DallasTemperature.h>

double Temp_Max_Stored = 25.70;

int led_red = D5;
int led_green = D6;
// Data wire is plugged into port 2 on the Arduino
const int ONE_WIRE_BUS = D4;
float tempDALLAS;
const int buzzer = D7; //buzzer to arduino pin D7
uint8_t relay_pin = D0;
unsigned long previousMillis = 0;
const long snoozeDuration = 10000; // attesa 5 minuti (1000 millisecondi equivalgono ad un secondo)
const long pauseBetweenNotes = 1000;
const long noteDuration = 1000;
boolean outputTone = false;                // Records current state
bool snoozed = false;


OneWire oneWire1(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire1);


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  //set up LEDs
  pinMode (led_red, OUTPUT);
  digitalWrite(led_red, LOW);
  pinMode (led_green, OUTPUT);
  digitalWrite(led_green, LOW);
  pinMode(relay_pin, OUTPUT);
  digitalWrite(relay_pin, HIGH);
  Serial.println("");
  Serial.println("ArduAcquario MALAWI ");
}

void loop() {
  // put your main code here, to run repeatedly:
  sensors.requestTemperatures();
  tempDALLAS = sensors.getTempCByIndex(0);   // Read temperature of Dallas sensor
  Serial.print("Temperatura acqua rilevata: ");
  Serial.println(tempDALLAS);
  Serial.println("=====================================================");
  while (tempDALLAS > (Temp_Max_Stored))
  {
    if (!snoozed)
    {
      Serial.println("================= ALLARM TIME! ================");
      Serial.print ("Temp_Max_Stored = "); Serial.println (Temp_Max_Stored);
      sensors.requestTemperatures();
      tempDALLAS = sensors.getTempCByIndex(0);   // Read temperature of Dallas sensor
      digitalWrite (led_green, LOW ); //set the LED off
      digitalWrite (led_red, HIGH); //set the LED on
      Serial.println();
      Serial.print("Temperatura acqua troppo ALTA! ");
      Serial.println(tempDALLAS);
      Serial.println();
      allarm();
      digitalWrite(relay_pin, LOW);
      delay(500);
    }
    else {
      snooze();
    }
  }
  digitalWrite (led_green, HIGH ); //set the LED off
  digitalWrite (led_red, LOW); //set the LED on
  //Serial.println("==============================================");
  Serial.print("Temperatura acqua coretta ");
  Serial.println(tempDALLAS);
  digitalWrite(relay_pin, HIGH);
  noTone(buzzer);
}


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))
  {
    Serial.print("button = ");
    Serial.println(Btn);

    snoozed = true;

    noTone(buzzer);
    Serial.println ("BUTTON PRESSED - ALLARM SNOOZED");
    delay(snoozeDuration);
    snoozed = false;
  }
}

void allarm()
{
  snooze();
  if (!snoozed)
  {
    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;
      }
    }
  }
}

Al di la del programma (che ho appena sbirciato senza capirci molto) i timer millis() possono funzionare in 3 modi, che chiamo "fino a", " da", e "a"
Per tutti e tre é necessario che un evento carichi una variabile globale (o di visibilità sufficiente) con il valore di millis(), e che esista un tempo limite, se no non sarebbe un timer.
I primi sono costituiti da una while (millis()-time_prec<intervallo), o una delle scritture similari (in molti threed Guglielmo ha postato link ad articoli in cui si parla di modi migliori usare millis(), ma non me ne ricordo nessuno). All'interno di questa while {} vi sono tutte le operazioni da effettuare, tra le quali, magari, una che mi fa uscire in anticipo (if (qualcosa){time_prec=millis()-intervallo;}), o CBE di azzeri il timer
I timer "da" sono equivalenti ai primi, solo che nella condizione della while é maggiore anziché minore
I timer "a", sono invece i più comuni, una if (millis()-time_prec>= intervallo). Per renderli più utili credo serva una flag " cosa fatta" che vie e controllata nella condizione, alzata nelle istruzioni, ed abbassata al caricamento della variabile.
Scegli quale ti serve

ciao ziopippo,

usa un flag (boolean horn = false) per dire che l'allarme deve stare sempre "zitto"; lo rendi attivo quando compare un allarme (horn = true).

usa un'altra variabile (boolean snooze = false) per fasi che il tuo buzzer suoni; e che metterai a true quando vorrai mettere in pausa il buzzer...quando la boolean snooze è true fai la verifica tra millis() e una tua unsigned long snoozeOFF, precedentemente salvata...se passato il tempo riporti la boolean snooze a false così il tuo buzzer inizia di nuovo a suonare...nel momento in cui la precedente horn ritorna false tutto si tacita.

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;
    }
  }
}

Ciao, ziopippo.
Prima di tutto, come ho già scritto a Funesto, ti consiglio di usare un

//t è unsigned long

if(millis()-t>999) // Una volta al secondo:
  {
  t=millis();
  Serial.print ... ... ...
  display.print ... ... ... 
  }

per fare solo una volta al secondo tutto ciò che non deve essere veramente continuo, per velocizzare il ciclo. Leggere la temperatura, ad esempio, è un'operazione che può essere fatta anche ogni 5 secondi.

Per il problema, poi, scrivi qualcosa del tipo:

void suona()
{if (!muto) tone(buzzer, 1000); else noTone(buzzer);}

quando silenzi l'allarme, muto va a 1 e l'allarme smetterà e non potrà più suonare finché muto non verrà rimesso a 0.

ziopippo:
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

Hai ragione, serve una variabile previous millis per ogni timer

Datman:
Ciao, ziopippo.
Prima di tutto, come ho già scritto a Funesto, ti consiglio di usare un

//t è unsigned long

if(millis()-t>999) // Una volta al secondo:
  {
  t=millis();
  Serial.print ... ... ...
  display.print ... ... ...
  }


per fare solo una volta al secondo tutto ciò che non deve essere veramente continuo, per velocizzare il ciclo. Leggere la temperatura, ad esempio, è un'operazione che può essere fatta anche ogni 5 secondi.

Per il problema, poi, scrivi qualcosa del tipo:

void suona()
{if (!muto) tone(buzzer, 1000); else noTone(buzzer);}

quando silenzi l'allarme, muto va a 1 e l'allarme smetterà e non potrà più suonare finché muto non verrà rimesso a 0.

Grazie per le dritte!
Questa soluzione mi piace e vedrò di adattarle anche ad un'altro progetto in funzione da diversi anni in modo di evitare gli attuali tempi di latenza.

Buongiorno,
ho nuovamente bisogno del vostro aiuto perchè non riesco a venirne a capo.

Ho provato diverse soluzioni ma non riesco ad annidare i cicli in modo da silenziare il buzzer.
Con la soluzione che posto di seguito riesco a mettere in silenzio il buzzer però non rispetta i tempi, è come se non tenesse in considerazione la mia variabile snoozeDuration e resta muto perennemente.
Vi sarei inoltre grato se riusciste a snellire anche il codice.
Grazie.

#include <OneWire.h>
#include <DallasTemperature.h>

double Temp_Max_Stored = 25.70;

int led_red = D5;
int led_green = D6;
// Data wire is plugged into port 2 on the Arduino
const int ONE_WIRE_BUS = D4;
float tempDALLAS;
const int buzzer = D7; //buzzer to arduino pin D7
uint8_t relay_pin = D0;
unsigned long previousMillisAllarm = 0;
unsigned long previousMillisSilenzia = 0;
const long snoozeDuration = 30000; // attesa 5 minuti (1000 millisecondi equivalgono ad un secondo)
const long pauseBetweenNotes = 1000;
const long noteDuration = 1000;
boolean outputTone = false;                // Records current state
bool snoozed = false;


bool muto = false;

OneWire oneWire1(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire1);


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  //set up LEDs
  pinMode (led_red, OUTPUT);
  digitalWrite(led_red, LOW);
  pinMode (led_green, OUTPUT);
  digitalWrite(led_green, LOW);
  pinMode(relay_pin, OUTPUT);
  digitalWrite(relay_pin, HIGH);
  Serial.println("");
  Serial.println("ArduAcquario MALAWI ");
}

void temperature()
{
  unsigned long t;
  if (millis() - t > 5000) // Una volta al secondo:
  {
    t = millis();
    sensors.requestTemperatures();
    tempDALLAS = sensors.getTempCByIndex(0);   // Read temperature of Dallas sensor
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  temperature();
  while (tempDALLAS > (Temp_Max_Stored))
  { 
    Serial.println("================= ALLARM TIME! ================");
    Serial.print ("Temp_Max_Stored = "); Serial.println (Temp_Max_Stored);
    temperature();
    digitalWrite (led_green, LOW ); //set the LED off
    digitalWrite (led_red, HIGH); //set the LED on
    Serial.println();
    Serial.print("Temperatura acqua troppo ALTA! ");
    Serial.println(tempDALLAS);
    Serial.println();
    allarm();
    digitalWrite(relay_pin, LOW);
    delay(500);


  }
  digitalWrite (led_green, HIGH ); //set the LED off
  digitalWrite (led_red, LOW); //set the LED on
  Serial.println("==============================================");
  Serial.print("Temperatura acqua coretta ");
  Serial.println(tempDALLAS);
  digitalWrite(relay_pin, HIGH);
  noTone(buzzer);
}



void silenzia()
{

  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 - previousMillisSilenzia < snoozeDuration))
    { noTone(buzzer);
      muto = true;

    Serial.println();
    Serial.println();
    Serial.println(currentMillis - previousMillisSilenzia);
    Serial.println(snoozeDuration);
      
previousMillisSilenzia = currentMillis;
      Serial.print("******************** IF SILENZIA******************** ");
    }
    else {
      Serial.print("button = ");
      Serial.println(Btn);
      Serial.println ("BUTTON PRESSED - ALLARM SNOOZED");
muto = false;
     
      Serial.print("******************** ELSE SILENZIA******************** ");
      
    }  
  }
  /*
      else if (Btn = 4)
    {
    //AllertBuzzer = false;
    Serial.println("===========================================");
    Serial.println("====== TASTO BACK - TACITA PREMUTO ========");
    Serial.println("===========================================");
    }
  */
}


void allarm()
{
  silenzia();
  if (!muto)
  {
    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 - previousMillisAllarm >= noteDuration)
      {
        previousMillisAllarm = 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 - previousMillisAllarm >= pauseBetweenNotes)
      {
        previousMillisAllarm = currentMillis;
        tone(buzzer, 1000);
        outputTone = true;
      }
    }
  }
}

E' così?
unsigned long t=0 lo dichiarerei globalmente all'inizio.
Al posto delle const puoi usare dei #define, che sostituiscono i valori al momento della compilazione:

#include <OneWire.h>
#include <DallasTemperature.h>
#define Temp_Max_Stored 25.70
#define led_red D5
#define led_green D6
  // Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS D4
#define buzzer D7 // buzzer to arduino pin D7
#define snoozeDuration 30000 // attesa 5 minuti (1000 millisecondi equivalgono ad un secondo)
#define pauseBetweenNotes 1000
#define noteDuration 1000
#define relay_pin D0

float tempDALLAS;
unsigned long previousMillisAllarm = 0;
unsigned long previousMillisSilenzia = 0;
boolean outputTone = false;                // Records current state
bool snoozed = false;
bool muto = false;
OneWire oneWire1(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire1);
unsigned long t=0;

void setup()
{
  Serial.begin(115200);
  // set up LEDs
  pinMode (led_red, OUTPUT);    digitalWrite(led_red, LOW);
  pinMode (led_green, OUTPUT); digitalWrite(led_green, LOW);
  pinMode (relay_pin, OUTPUT);  digitalWrite(relay_pin, HIGH);
  Serial.println("");  Serial.println("ArduAcquario MALAWI ");
}

void temperature()
{

  if (millis()-t>5000) // Una volta ogni 5 secondi:
  {
    t=millis();
    sensors.requestTemperatures();
    tempDALLAS = sensors.getTempCByIndex(0);   // Read temperature of Dallas sensor
  }
}

void loop()
{
  temperature();
  while (tempDALLAS>Temp_Max_Stored)
  { 
    Serial.println("================= ALLARM TIME! ================");
    Serial.print ("Temp_Max_Stored = "); Serial.println (Temp_Max_Stored);
    temperature();
    digitalWrite (led_green, LOW); //set the LED off
    digitalWrite (led_red, HIGH); //set the LED on
    Serial.println();  Serial.print ("Temperatura acqua troppo ALTA! ");
    Serial.println(tempDALLAS); Serial.println();
    allarm();
    digitalWrite(relay_pin, LOW);
    delay(500);
  }

  digitalWrite (led_green, HIGH ); //set the LED off
  digitalWrite (led_red, LOW); //set the LED on
  Serial.println("==============================================");
  Serial.print("Temperatura acqua coretta ");
  Serial.println(tempDALLAS);
  digitalWrite(relay_pin, HIGH);
  noTone(buzzer);
}

void silenzia()
{
  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 - previousMillisSilenzia < snoozeDuration)
    { 
       noTone(buzzer);
       muto = true;
       Serial.println(); Serial.println();
       Serial.println(currentMillis - previousMillisSilenzia);
       Serial.println(snoozeDuration);
       previousMillisSilenzia = currentMillis;
       Serial.print("******************** IF SILENZIA******************** ");
    }

    else
   {
      Serial.print("button = ");
      Serial.println(Btn);
      Serial.println ("BUTTON PRESSED - ALLARM SNOOZED");
      muto = false;
      Serial.print("******************** ELSE SILENZIA******************** ");
    }  
  }

  /*
     else if (Btn=4)
    {
    //AllertBuzzer = false;
    Serial.println("===========================================");
    Serial.println("====== TASTO BACK - TACITA PREMUTO ========");
    Serial.println("===========================================");
    }
  */
}

void allarm()
{
  silenzia();
  if (!muto)
  {
    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 - previousMillisAllarm >= noteDuration)
      {
        previousMillisAllarm = currentMillis;
        noTone(buzzer);
        outputTone = false;
      }
    } // END if (outputTone)

    else
    {
      // We are currently in a pause
      // Check if it's been long enough and turn on if so
      if (currentMillis - previousMillisAllarm >= pauseBetweenNotes)
      {
        previousMillisAllarm = currentMillis;
        tone(buzzer, 1000);
        outputTone = true;
      }
    } // END else
  } // END if (outputTone)
} // END allarm()

P.s.: Allarme in inglese è Alarm, con una "l" sola :slight_smile:

Datman:
E' così?
unsigned long t=0 lo dichiarerei globalmente all'inizio.
Al posto delle const puoi usare dei #define, che sostituiscono i valori al momento della compilazione:

Ho modificato volentieri il codice come proposto da te però, non ho ben capito la differenza tra #define e const.

Inoltre continua a non fare ciò che voglio; D'altronde da ciò che ho visto non hai modificato nulla del mio codic se non la variabile t e #define.
l
PS. Ho anche modificato ALLLLLARM con 4 L :smiley: :wink:

#include <OneWire.h>
#include <DallasTemperature.h>
#define Temp_Max_Stored 25.70
#define led_red D5
#define led_green D6
#define ONE_WIRE_BUS D4 // Data wire is plugged to arduino pin
#define buzzer D7 // buzzer to arduino pin D7
#define snoozeDuration 30000 // attesa 5 minuti (1000 millisecondi equivalgono ad un secondo)
#define pauseBetweenNotes 1000
#define noteDuration 1000
#define relay_pin D0

float tempDALLAS;
unsigned long previousMillisAlarm = 0;
unsigned long previousMillisSilenzia = 0;
boolean outputTone = false;                // Records current state
bool snoozed = false;
bool muto = false;
OneWire oneWire1(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire1);
unsigned long t = 0;

void setup()
{
  Serial.begin(115200);
  // set up LEDs
  pinMode (led_red, OUTPUT);    digitalWrite(led_red, LOW);
  pinMode (led_green, OUTPUT); digitalWrite(led_green, LOW);
  pinMode (relay_pin, OUTPUT);  digitalWrite(relay_pin, HIGH);
  Serial.println("");  Serial.println("ArduAcquario MALAWI ");
}

void temperature()
{

  if (millis() - t > 5000) // Una volta ogni 5 secondi:
  {
    t = millis();
    sensors.requestTemperatures();
    tempDALLAS = sensors.getTempCByIndex(0);   // Read temperature of Dallas sensor
  }
}

void loop()
{
  temperature();
  while (tempDALLAS > Temp_Max_Stored)
  {
    Serial.println("================= ALARM TIME! ================");
    Serial.print ("Temp_Max_Stored = "); Serial.println (Temp_Max_Stored);
    temperature();
    digitalWrite (led_green, LOW); //set the LED off
    digitalWrite (led_red, HIGH); //set the LED on
    Serial.println();  Serial.print ("Temperatura acqua troppo ALTA! ");
    Serial.println(tempDALLAS); Serial.println();
    alarm();
    digitalWrite(relay_pin, LOW);
    delay(500);
  }

  digitalWrite (led_green, HIGH ); //set the LED off
  digitalWrite (led_red, LOW); //set the LED on
  Serial.println("==============================================");
  Serial.print("Temperatura acqua coretta ");
  Serial.println(tempDALLAS);
  digitalWrite(relay_pin, HIGH);
  noTone(buzzer);
}

void silenzia()
{
  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 - previousMillisSilenzia < snoozeDuration)
    {
      noTone(buzzer);
      muto = true;
      Serial.println(); Serial.println();
      Serial.println(currentMillis - previousMillisSilenzia);
      Serial.println(snoozeDuration);
      previousMillisSilenzia = currentMillis;
      Serial.println("******************** IF SILENZIA******************** ");
    }

    else
    {
      Serial.print("button = ");
      Serial.println(Btn);
      Serial.println ("BUTTON PRESSED - ALLARM SNOOZED");
      muto = false;
      Serial.println("******************** ELSE SILENZIA******************** ");
    }
  }

  /*
     else if (Btn=4)
    {
    //AllertBuzzer = false;
    Serial.println("===========================================");
    Serial.println("====== TASTO BACK - TACITA PREMUTO ========");
    Serial.println("===========================================");
    }
  */
}

void alarm()
{
  silenzia();
  if (!muto)
  {
    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 - previousMillisAlarm >= noteDuration)
      {
        previousMillisAlarm = currentMillis;
        noTone(buzzer);
        outputTone = false;
      }
    } // END if (outputTone)

    else
    {
      // We are currently in a pause
      // Check if it's been long enough and turn on if so
      if (currentMillis - previousMillisAlarm >= pauseBetweenNotes)
      {
        previousMillisAlarm = currentMillis;
        tone(buzzer, 1000);
        outputTone = true;
      }
    } // END else
  } // END if (outputTone)
} // END alarm()

Il #define è diretto al compilatore, che compila il programma con il valore al posto dell'etichetta, senza usare una variabile.

Datman:
Il #define è diretto al compilatore, che compila il programma con il valore al posto dell'etichetta, senza usare una variabile.

Carino! :smiling_imp:

Circa il mio problema dello snooze hai proposte da fare? :kissing:

Sto guardando, ma non mi è facile seguirlo senza averlo sviluppato da zero piano piano...
Per renderlo più comprensibile, dato che silenzia() sta solo dentro alarm() lo metterei lì direttamente.

#include <OneWire.h>
#include <DallasTemperature.h>
#define Temp_Max_Stored 25.70
#define led_red D5
#define led_green D6
#define ONE_WIRE_BUS D4 // Data wire is plugged to arduino pin
#define buzzer D7 // buzzer to arduino pin D7
#define snoozeDuration 30000 // attesa 5 minuti (1000 millisecondi equivalgono ad un secondo)
#define pauseBetweenNotes 1000
#define noteDuration 1000
#define relay_pin D0

float tempDALLAS;
unsigned long previousMillisAlarm = 0;
unsigned long previousMillisSilenzia = 0;
boolean outputTone = false;                // Records current state
bool snoozed = false;
bool muto = false;
OneWire oneWire1(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire1);
unsigned long t = 0;

void setup()
{
  Serial.begin(115200);
  // set up LEDs
  pinMode (led_red, OUTPUT);    digitalWrite(led_red, LOW);
  pinMode (led_green, OUTPUT); digitalWrite(led_green, LOW);
  pinMode (relay_pin, OUTPUT);  digitalWrite(relay_pin, HIGH);
  Serial.println("");  Serial.println("ArduAcquario MALAWI ");
}


void temperature()
{

  if (millis() - t > 5000) // Una volta ogni 5 secondi:
  {
    t = millis();
    sensors.requestTemperatures();
    tempDALLAS = sensors.getTempCByIndex(0);   // Read temperature of Dallas sensor
  }
}


void loop()
{
  temperature();
  while (tempDALLAS > Temp_Max_Stored)
  {
    Serial.println("================= ALARM TIME! ================");
    Serial.print ("Temp_Max_Stored = "); Serial.println (Temp_Max_Stored);
    temperature();
    digitalWrite (led_green, LOW); //set the LED off
    digitalWrite (led_red, HIGH); //set the LED on
    Serial.println();  Serial.print ("Temperatura acqua troppo ALTA! ");
    Serial.println(tempDALLAS); Serial.println();
    alarm();
    digitalWrite(relay_pin, LOW);
    delay(500);
  }

  digitalWrite (led_green, HIGH ); //set the LED off
  digitalWrite (led_red, LOW); //set the LED on
  Serial.println("==============================================");
  Serial.print("Temperatura acqua coretta ");
  Serial.println(tempDALLAS);
  digitalWrite(relay_pin, HIGH);
  noTone(buzzer);
}



void alarm()
{
  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 - previousMillisSilenzia < snoozeDuration)
    {
      noTone(buzzer);
      muto = true;
      Serial.println(); Serial.println();
      Serial.println(currentMillis - previousMillisSilenzia);
      Serial.println(snoozeDuration);
      previousMillisSilenzia = currentMillis;
      Serial.println("******************** IF SILENZIA******************** ");
    }

    else
    {
      Serial.print("button = ");
      Serial.println(Btn);
      Serial.println ("BUTTON PRESSED - ALLARM SNOOZED");
      muto = false;
      Serial.println("******************** ELSE SILENZIA******************** ");
    }
  if (!muto)
  {
    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 - previousMillisAlarm >= noteDuration)
      {
        previousMillisAlarm = currentMillis;
        noTone(buzzer);
        outputTone = false;
      }
    } // END if (outputTone)

    else
    {
      // We are currently in a pause
      // Check if it's been long enough and turn on if so
      if (currentMillis - previousMillisAlarm >= pauseBetweenNotes)
      {
        previousMillisAlarm = currentMillis;
        tone(buzzer, 1000);
        outputTone = true;
      }
    } // END else
  } // END if (outputTone)
} // END alarm()

silenzia() l'avevo messa come funzione esterna perchè non sono ancora sicuro se mi potrebbe essere utile per spegnere definitivamente l'allarme.

Il problema è che non avendo cn l'IDE di arduino la possibilità di fare il debug passo passo, non riesco a capire dove sia il problema.

ciao...secondo me il problema sta proprio nella funzione silenzia().

ragiona bene sul concetto di variabile locale...a che valore hanno o acquisiscono nella funzione.
di conseguenza ragiona a come si comporteranno tutti gli if() e l'else nella funzione....quindi a che valore avrà la variabile muto che verifichi nella funzione alarm()

EDIT: lo stessi fai per la funzione alarm()...quella variabile outputTone...come cambia nella funzione?

ORSO2001:
ciao...secondo me il problema sta proprio nella funzione silenzia().

Con certezza penso che il problema sia in questa funzione perchè se al posto di millis utilizzo delay funziona tutto a meraviglia.
Il problema è che ho fatto diverse prove ma non riesco a fargli fare ciò che voglio.

Scusa se dico la mia domanda...ma lo hai capito come funziona il mills()???

in pratica è il tempo da cui avvii i programma,ora ti serve un unsinged long per fare da cronometro......
se il cronometro raggiunge il tempo impostato ....cambia una variabile e fai ciò che desideri.
...cronometri ne puoi avere tanti...

Puso:
in pratica è il tempo da cui avvii i programma,ora ti serve un unsinged long per fare da cronometro......
se il cronometro raggiunge il tempo impostato ....cambia una variabile e fai ciò che desideri.
...cronometri ne puoi avere tanti...

Si in effetti millis mi serve come creonometro per non usare delay()

si il millis() ...in pratica è da quando parte lo schetch....poi usi un unsigned long come STOP per (tipo il ceronometro)......poi usi una variablile pe fare ciò che vuoi.....e di cronometri ne puoi avere tanti...solo millis() fa partire il tempo...tutti i cronometri ti servono per fermarlo e leggerlo...poi fare ciò che vuoi.