Problema con molteplici funzioni

Salve a tutti, volevo creare un programma richiamando più funzioni così da avere il programma il più leggibile possibile, dovendo usare alcuni delay a giro per il programma volevo usare il millis()

ho eseguito un programma di test ma mi succede una cosa strana:

unsigned long apptime1;
unsigned long apptime2;
unsigned long appdelay;
void setup() {
  // put your setup code here, to run once:

//Initialize serial and wait for port to open:
  Serial.begin(9600); 

  Serial.println(F("HELLO!!"));
}

void loop() {
  // put your main code here, to run repeatedly:
prova();
  }
              
void prova(){

 apptime1 = millis();
 appdelay= apptime1-apptime2;

 if(appdelay>=1000){
  apptime2 = millis();
Serial.println("a");
 }
}

In questa maniera il programma mi invia via seriale il carattere a ogni 100ms

MA

void setup() {
  // put your setup code here, to run once:

//Initialize serial and wait for port to open:
  Serial.begin(9600); 

  Serial.println(F("HELLO!!"));
}

void loop() {
  // put your main code here, to run repeatedly:
prova();
  }
              
void prova(){
unsigned long apptime1;
unsigned long apptime2;
unsigned long appdelay;

 apptime1 = millis();
 appdelay= apptime1-apptime2;

 if(appdelay>=1000){
  apptime2 = millis();
Serial.println("a");
 }
}

Se sposto la dichiarazione delle variabili di appoggio all'interno della funzione, ad ogni ciclo di scansione mi spara fuori il carattere "a" ho provato a plotterare anche le variabili che ad ogni ciclo di scansione incrementano a mi ritrovo 1123 1123 1123 a 1124 1124 1124 a e così via

Non capisco come mai dichiarando le variabili all'interno della funzione, non fanno il loro dovere :frowning:

Tu sai vero che le variabili dentro una funzione vengono create quando chiami la funzione e … vengono distrutte quando la funzione termina, quindi, la volta dopo che chiami la funzione, è come la prima volta.

Se ti serve conservare il valore, o le dichiari globali, o le dichiari, dentro la funzione, statiche.

Guglielmo

Ni in realtà lo sapevo ma non ho riconosciuto il problema, quello che adesso capisco è che se vengono distrutte, come mai la sottrazione (appdelay) e apptime2 aveva lo stesso valore di apptime1?? la sottrazione e apptime2 essendo distrutte non dovevano essere a 0?

Quando ? Dove ? In che punto ? Se non metti il codice che usi per fare le prove e la sequenza esatta dei risultati ... è difficile risponderti ...

Considera comunque che, mentre per le varibili globali è garantita l'inizializzazione a zero, la stessa cosa NON è garantita per le locali che sarebbe sempre bene inizializzare.

Guglielmo