relè ritardato alla diseccitazione

Ciao ragazzi,
non riesco a capire come mai la funzione millis, nel semplice codice seguente, funziona solo per intervalli brevi (5-10 secondi). Quando invece imposto a 3 minuti il relè rimane sempre eccitato.
Qualcuno mi può spiegare perchè accade questo?

Grazie

# define BUTTON 2
# define LED 8
int buttonState = 0;
unsigned long iMillis = 0;
int TempoON = 5000;

void setup() 
{ 
  pinMode(LED, OUTPUT); 
  pinMode(BUTTON, INPUT); 
  }

void loop() {


int buttonState = digitalRead(BUTTON);
if ( buttonState == LOW ) 
{ digitalWrite(LED, HIGH);

iMillis = millis(); }
if ((millis()-iMillis)> TempoON)
{ digitalWrite(LED, LOW);
   }
}

La variabile 'TempoON' è di tipo sbagliato visto che la si confronta con una unsigned long.

cioè se TempoOn che è dichiarata int cerchi di farla diventare = 180.000 millisecondi (3 minuti) questa ti fa marameo e prende come valore massimo 65535 che è il max valore consentito per gli int cioè poco più di un minuto
come ha detto Claudio_FF devi impostare anche questa a unsigned long :wink:

Che errore da neofita....
Grazie ragazzi, mi sa che devo ripassare un po' il C++

Cambiando la variabile int in unsigned long tutto funziona perfettamente.

A presto! 8)

che poi essendo int e non unsigned int il max è 32767 :slight_smile: