Go Down

Topic: Aiuto While (Read 92 times) previous topic - next topic

Luka74

May 28, 2016, 03:30 pm Last Edit: May 28, 2016, 04:19 pm by Luka74
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:

Code: [Select]
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

gpb01

#1
May 28, 2016, 04:45 pm Last Edit: May 28, 2016, 04:45 pm by gpb01
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
Search is Your friend ... or I am Your enemy !

Luka74

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

cam9500

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


Luka74

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

Grazie

cam9500

Ciao, occhio a non incasinarti richiamando funzioni da funzioni che poi si perde il filo.... ho provato a cambiare il punto di vista così:
Code: [Select]
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


Luka74

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

cam9500

Ciao, purtroppo non conosco il tuo codice quindi qualcosa l'ho tirato ad intuito, quindi:
Code: [Select]
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

gpb01

@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
Search is Your friend ... or I am Your enemy !

Luka74

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

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy