[RISOLTO] il millis questo incompreso (per me almeno)

Salve a tutti

vi posto il pezzo di codice che non comprendo

          if (msg.indexOf("rapr") > 0)
          {
            do
            {
              ritardo = digitalRead(apriCancelloR);
              suonacampanello();
              Serial.println(millis());
              Serial.println(tAttuale);
              if ((millis() - tAttuale) > tLimite) 
              {
                tAttuale = millis();
                break;
              }  
            } 
            while (ritardo == HIGH);
            if (ritardo == LOW)
            {
              pc_client.print("<p>apertura cancello ritardata</p>");
              digitalWrite(apriCancello, HIGH);
              delay(500);
              digitalWrite(apriCancello, LOW);
            }  
            else
            {
              pc_client.print("<p>apertura cancello ritardata non effettuata</p>");
            }
          }

alura...
il comando che arriva ad arduino via browser (chrome in questo caso ma quando sarà in produzione arriverà da iexplore) è:
http://192.168.1.46/rapr

come si vede dal codice entra nella if ed entra nel ciclo do, dal ciclo ne può uscire per due condizioni:
1- viene premuto il pulsante che fa aprire il cancello (il pin apriCancelloR è dichiarato in PULLUP)
2- viene raggiunto il tempo limite (tLimite) che è di 420000 millisecondi (che se ho fatto il giusto conto sono 7 minuti)

e questo è l'ultimo pezzo del serial monitor:

104441
78043
104457
78043
104473
78043
104488
78043
104504
78043
104519
78043
104536
78043
104551
78043
104566
78043
104582
78043
104597
78043
104613
78043
104629
78043
104644
78043
104659
78043
104676
78043
104691
78043
104707
78043
104722
78043
104738
78043
104754
78043
104769
78043
104784
78043
104800
78043
104816
78043
GET /favicon.ico HTTP/1.1

il numero fisso (78043) è il tAttuale l'altro è il millis, come si vede alla differenza di 420000 non ci arriva e quindi mi stampa quella GET.

qualcuno può illuminarmi su come mai non fa ciò che io mi aspetto che faccia?
Grazie a tutti e scusate la lungaggine del post.

Con un pezzo di codice e non tutto il programma non è facile aiutarti.
Se può intanto servirti, io ho scritto un [ur=http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/]articolo[/url] su come programmare i compiti usando millis.

Nel programma manca un pezzetto .. fondamentale ...

         if (msg.indexOf("rapr") > 0)
          {
          // Entri qui se hai ricevuto il messaggio ...
          // ... e da QUESTO momento devi contare i 7 minuti
            tAttuale = millis()
            do
            {
              ritardo = digitalRead(apriCancelloR);
              suonacampanello();
              Serial.println(millis());
              Serial.println(tAttuale);
              if ((millis() - tAttuale) > tLimite) 
              {
                break;
              }  
            } 
            while (ritardo == HIGH);
            //
            if (ritardo == LOW)
            {
              pc_client.print("<p>apertura cancello ritardata</p>");
              digitalWrite(apriCancello, HIGH);
              delay(500);
              digitalWrite(apriCancello, LOW);
            }  
            else
            {
              pc_client.print("<p>apertura cancello ritardata non effettuata</p>");
            }
          }

... in pratica tAttuale lo devi assegnare subito prima di entrare nel DO ... solo così saprai se è passato il tempo richiesto :wink:

Guglielmo

@leo grazie per il link me lo sono letto e lo sto studiando per bene

@guglielmo
sei il mio salvatore, come al solito, io effettivamente tAttuale lo inizializzavo subito dopo il loop e non prima del do, ma se ci avessi ragionato su un momento invece di venire a chiedera la pappa fatta qui sul forum, forse (e dico forse) ci sarei arrivato anche da solo.

Grazie ad entrambi. A buon rendere.... spero prima o poi

p.s.: se vi va avrei un altro problemino (hardware stavolta) postato in sezione, per l'appunto, hardware

grazie :wink: