Aiuto While

Salve,

sto realizzando un progetto per la gestione e il controllo dell'acquario, con arduino Mega e un TFT da 5 pollici. Il progetto procede bene ma non riesco a venire a capo di una funzione che vorrei implementare. In pratica il programma consiste in una home page dove vengono riportati i valori dell'acquario, con un tocco sul display si entra nella pagina del menu dove poter effettuare le varie impostazioni. La funzione di cui non riesco a venire a capo consiste nel tornare alla home page se ci si trova in una pagina diversa dalla home e se non viene rilevato un tocco sul display entro 60 secondi. Il codice che ho scritto io è il seguente:

void ReturnHome()
{
  unsigned long tempo = 0;
  
  if (dispScreen != 0) 
  {
    tempo = millis();
    
    while (myTouch.dataAvailable() == false)
    {
      if (tempo == (millis() - 60000))
      {
        dispScreen=0;
        myGLCD.clrScr();
        Home(true);
      }
    }
  }
}

ma ha un problema sostanziale, finché non si esce dal ciclo while, con un tocco sul display, il programma resta bloccato, torna alla home ma è tutto "sospeso". Sinceramente con le mie poche conoscenze e poca esperienza che ho non sono riuscito a trovare una soluzione adatta. Questa funzione non è essenziale per il programma ma vorrei implementarla anche solo per capire come fare. La funzione void ReturnHome() è inserita nel loop.

Grazie per l'aiuto

Intanto il primo consiglio è che ti studi bene come si usa la millis() prima QUI, poi QUI ed infine leggi anche QUI e QUI ... ... perché come la stai usando tu può dare problemi ;)

Guglielmo

Ti ringrazio del suggerimento, studierò sicuramente i link, comunque il mio problema non credo dipenda dall'uso del millis(). Devo trovare un'alternativa al while ma sinceramente non riesco a capire come.

Grazie

Ciao, sto cercando di leggere la funzione ma ho qualche problema. Ok il primo if (dispScreen) Ok il while (al tocco myTouch.dataAvailable() -> true) qui mi sorgono 2 dubbi: 1) myTouch.dataAvailable() rimane true o dopo il tocco torna a false? Cambia parecchio il flusso successivo 2) if (tempo > (millis() - 60000)) , metti sempre maggiore: non puoi sperare di "beccare" l'eguaglianza

Stefano

1) Dopo il tocco torna false. E' true quando rileva il tocco poi torna sempre false. 2) Ok!

Grazie

Ciao, occhio a non incasinarti richiamando funzioni da funzioni che poi si perde il filo.... ho provato a cambiare il punto di vista così:

unsigned long tempo = 0;

void ReturnHome() {
  if ((dispScreen != 0 || myTouch.dataAvailable() == true || seiInHome==true)  tempo = millis();
  if ((millis() - tempo) > 60000){
    dispScreen = 0;
    myGLCD.clrScr();
    Home(true);
  }
}

Intanto "tempo" devi dichiararlo globale, poi "se il display è acceso o c'è un tocco o si è già in home, tengo legato tempo e millis(). Se o si spegne il display o non c'è tocco o non si è in home per 60 sec. richiama home

Spero ti possa essere di aiuto

Stefano

Ciao, intanto grazie per l'aiuto. Ma perché dici se il display è acceso? io non faccio il controllo su display acceso, se intendi dispScreen != 0 indica se la pagina visualizzata è diversa dalla home, 0 = Home. Poi perché metti OR ( || ) e non AND ( && ), dovrebbe essere se la pagina è diversa dalla HOME e non c'è un un tocco entro 60 secondi, torna alla home.

Grazie

Ciao, purtroppo non conosco il tuo codice quindi qualcosa l'ho tirato ad intuito, quindi:

unsigned long tempo = 0;[color=#222222][/color]
[color=#222222][/color]
void ReturnHome() {[color=#222222][/color]
  if ((dispScreen == 0 || myTouch.dataAvailable() == true)  tempo = millis();[color=#222222][/color]
  if ((millis() - tempo) > 60000){[color=#222222][/color]
    dispScreen = 0;[color=#222222][/color]
    myGLCD.clrScr();[color=#222222][/color]
    Home(true);[color=#222222][/color]
  }

quando setto tempo = millis() allora tengo fermo il countdown dei 60 secondi; lo devo tenere fermo sia se sono già in home che se ho toccato il touch....

Stefano

@cam9500: ... ma li rileggete i vostri post quando li scrivete ? ? ? :o :o :o

Ma lo hai visto il codice che hai messo la "monnezza" che si è portato dietro ? Il copia/incolla va fatto in modo TEXT puro e non in modo HTML o RTF con i colori ... altrimenti quello è il risultato ...

Guglielmo

Eheheh in effetti c'è un po di casotto, cmq si estrapola.....

Occacchio ! Scusate tutti... non so come ho fatto a farlo: ho copiato dall' IDE !!

unsigned long tempo = 0;

void ReturnHome() {
  if (dispScreen != 0 || myTouch.dataAvailable() == true) tempo = millis();
  if ((millis() - tempo) > 60000){
    dispScreen = 0;
    myGLCD.clrScr();
    Home(true);
  }
}

Ovviamente nn l'ho riletto :(

Avresti megli modificato il post al posto di riscriverlo.
Ciao Uwe

In effetti volevo farlo ma l'ho lasciato a monito della potenza di Global Moderator Guglielmo :)

Allora, ho provato la funzione ma non va, ricarica la home solo se si trova già nella home, la prima volta dopo 60 secondi ma poi la ricarica di continuo. :o :o Comunque ho notato che l'hai cambiata rispetto a quella postata con i caratteri "strani".

Vero era il dispScreen== 0:

unsigned long tempo = 0;

void ReturnHome() {
  if (dispScreen== 0 || myTouch.dataAvailable() == true) tempo = millis();
  if ((millis() - tempo) > 60000){
    dispScreen = 0;
    myGLCD.clrScr();
    Home(true);
  }
}

Tieni presente che non ho il tuo display touch quindi considerala solo una traccia.... il colpo di genio sta a te :)

Ehheh è proprio il colpo di genio che manca!! :D Cmq già avevo corretto, il risultato è che ritorna alla home quando è nei menu, ma non tiene conto dell'ultimo tocco, in pratica ritorna alla home dopo 60 secondi da quando ci si entra, in ogni caso. Il problema è come gestire il dataAvailable. Faccio delle prove vediamo un po....

Anzi mi correggo non torna alla home ogni 60 secondi da quando ci si entra ma ci ritorna in un tempo non definito, a volte dopo 60 secondi anche se ti eseguono tocchi altre volte dopo più tempo ma mai con un tempo definito, comunque mai dopo 60 secondi dall'ultimo tocco ::) ::)

Ciao, tieni conto che hai il problema che richiami la funzione Home(true) da un'altra funzione non da loop(): può fare casino. Prova così:

boolean ReturnHome() {
  if (dispScreen == 0 || myTouch.dataAvailable() == true) tempo = millis();
  if ((millis() - tempo) > 60000) {
    return true;
  } else {
    return false;
  }
}

e dove richiami ReturnHome() metti:

if (ReturnHome()) {
  Home(true);
  dispScreen = 0;
  myGLCD.clrScr();
}

Così con un serial.print puoi verificare meglio come gira.... Di più mi resta difficile :(

Stefano

Stefano

Aspetta, devo tenere conto dell'ultima postata e lasciare perdere quella precedente? Comunque ho provato anche a metterla direttamente nel loop() ma non cambiava nulla.

Grazie

Si, l'ultima sostituisce le precedenti.... prova ad utilizzare il mio esempio come spunto e cerca con dei serial.print di debuggare l'errore o il mal funzionamento.

Stefano