Problema con millis :(

Buona domenica a tutti!

Sto riscontrando un problema per quanto riguarda millis().

In pratica vorrei realizzare un semplice countdown dove al termine del tempo il led si spegne.

int attesa=10000;
boolean state = true;
int tempo;  //Variabile per memorizzare il tempo


void setup()
{
  Serial.begin(115200);
pinMode(D7, OUTPUT);     //impostiamo il pin 13 come Output
tempo = millis();       //prendo il tempo iniziale

}

void loop()
{

  if(state == true){
  digitalWrite(D7,HIGH);
}


if((tempo+attesa)<millis())//Se sono trascorsi 10 secondi
{  
  state = false;            
digitalWrite(D7,LOW);
}

}

Questo pezzettino di codice mi fa accendere il led e dopo 10 secondi si spegne.

Ma la variabile attesa rimane sempre 10 secondi, vorrei che diminuisca di un secondo man mano che scade il tempo! per poi mostrarlo magari in una pag WEB.

Spero che qualcuno mi aiuti !

Grazie

P.S: Utilizzo ESP8266

Ho un po di cose da dire:
1)la seriale tienila più bassa (9600) é sufficiente.
2)meglio se stravolgi la condizione. Essa diventa
if (millis()-timeprec>timer)
Dove timeprec é la vatiabile a cui hai caricato millis(). Mentre timer é una costante pari a 10 secondi.

3)ora aggiungi un'altra variabile, che parta anche lei da 10 secondi. Chiamala resto.
Aggiungine anche una quarta contatore, anch'essa uguale a millis().
Controlla se millis() é diverso da contatore. Se si riduci di 1 resto e rendi di nuovo contatore uguale a millis.

Prova e dicci

Silente:
Ho un po di cose da dire:
1)la seriale tienila più bassa (9600) é sufficiente.
2)meglio se stravolgi la condizione. Essa diventa
if (millis()-timeprec>timer)
Dove timeprec é la vatiabile a cui hai caricato millis(). Mentre timer é una costante pari a 10 secondi.

3)ora aggiungi un'altra variabile, che parta anche lei da 10 secondi. Chiamala resto.
Aggiungine anche una quarta contatore, anch'essa uguale a millis().
Controlla se millis() é diverso da contatore. Se si riduci di 1 resto e rendi di nuovo contatore uguale a millis.

Prova e dicci

Dovrebbe essere cosi'?

int timer=10000;
boolean state = true;
int timeprec = millis();  
int resto= 10000;
int contatore=millis();     

void setup()
{
 Serial.begin(9600);
pinMode(D7, OUTPUT);     //impostiamo il pin 13 come Output


}

void loop()
{

 if(state == true){
 digitalWrite(D7,HIGH);
}

if(millis()!= contatore)
{
 resto = resto - 1000;
 contatore=millis();
}


if((millis()-timeprec>timer))//Se sono trascorsi 10 secondi
{  
 state = false;            
digitalWrite(D7,LOW);
}

}

Scusa la mia ignoranza, non ho capito qual è il valore che devo mostrare sulla Pag WEB. cioè quella che arriverà a 0 (è resto?)

Se io stampassi sul monitor seriale resto mi da una serie di numeri negativi..

  1. devi fare resto--
  2. le variabili (tranne stato) sono tutte unsigned long
  3. le variabili da eguagliare a millis() vanno eguagliate nel setup()
  4. si, é resto
    5)pagina web? Non so manco io come si usa, temo andresti ad infilarti in casini

Silente:

  1. devi fare resto–
  2. le variabili (tranne stato) sono tutte unsigned long
  3. le variabili da eguagliare a millis() vanno eguagliate nel setup()
  4. si, é resto
    5)pagina web? Non so manco io come si usa, temo andresti ad infilarti in casini

Scusami ancora.

Quando stampo resto non arriva a 0 e si ferma ma:

10
9
8
7
6
5
4
3
2
1
0
4294967295
4294967294
4294967293
unsigned long timer = 10000;
boolean state = true;
unsigned long resto = 10;
unsigned long contatore;
unsigned long timeprec;

void setup()
{
  Serial.begin(9600);
  pinMode(D7, OUTPUT);     //impostiamo il pin 13 come Output
  contatore = millis();
  timeprec = millis();

}

void loop()
{

  if (state == true) {
    digitalWrite(D7, HIGH);
  }

  if (millis() != contatore)
  {
    resto -- ;
    
contatore = millis();
  }



  Serial.println(resto);
  delay(500);


  if ((millis() - timeprec > timer)) //Se sono trascorsi 10 secondi
  {
    state = false;
    digitalWrite(D7, LOW);
  }

}

Qualcuno mi aiuti! :frowning: