Problema con visualizzazione errori

Buongiorno a tutti,
ho un problema software che mi servirebbe eliminare. Utilizzo un TFT01 con lo shield e arduino mega. Il problema è la visualizzazione sul display di un eventuale errore durante un procedimento che viene avviato tramite la pressione di un tasto che creo. Mi spiego meglio: non riesco a far comparire un errore (in questo caso appositamente voluto tramite un semplice analogRead) durante la seduta, perchè finisce prima la seduta e poi se il valore di A0 è maggiore di un tot valore mi segnala un pericolo. Non riesco a far interrompere la seduta se c'è questo errore. Vi posto il codice da me creato:

#if defined(__AVR__)
#define imagedatatype  unsigned int
#elif defined(__PIC32MX__)
#define imagedatatype  unsigned short
#elif defined(__arm__)
#define imagedatatype  unsigned short
#endif

extern imagedatatype Icone_Attention[];

#include <UTFT.h>
#include <UTouch.h>
#include <UTFT_Buttons.h>

UTFT myGLCD(TFT01_32, 38, 39, 40, 41);
UTouch myTouch(6, 5, 4, 3, 2);
UTFT_Buttons myButtons(&myGLCD, &myTouch);

extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t Dingbats1_XL[];


void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  myGLCD.InitLCD(LANDSCAPE);
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);

  myTouch.InitTouch(LANDSCAPE);
  myTouch.setPrecision(PREC_MEDIUM);

  myButtons.setTextFont(BigFont);
  myButtons.setSymbolFont(Dingbats1_XL);

}
int avvia, pressed_button;

void MenuIniziale() {
  avvia = myButtons.addButton(50, 50, 219, 139, "Avvia seduta");
  myButtons.drawButton(avvia);
}


void Seduta() {
  myButtons.disableButton(avvia);
  myGLCD.clrScr();
  myGLCD.fillScr(0, 0, 0);
  delay(2000);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  myGLCD.setColor(VGA_RED);
  myGLCD.setBackColor(VGA_WHITE);
  myGLCD.print("0  0  0", LEFT, 10);
  delay(2000);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  myGLCD.setColor(VGA_RED);
  myGLCD.setBackColor(VGA_WHITE);
  myGLCD.print("0  0  1", LEFT, 30);
  delay(2000);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  myGLCD.setColor(VGA_RED);
  myGLCD.setBackColor(VGA_WHITE);
  myGLCD.print("0  1  0", LEFT, 50);
  delay(2000);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  myGLCD.setColor(VGA_RED);
  myGLCD.setBackColor(VGA_WHITE);
  myGLCD.print("0  1  1", LEFT, 70);
  delay(2000);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  myGLCD.setColor(VGA_RED);
  myGLCD.setBackColor(VGA_WHITE);
  myGLCD.print("1  0  0", LEFT, 90);
  delay(2000);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  myGLCD.setColor(VGA_RED);
  myGLCD.setBackColor(VGA_WHITE);
  myGLCD.print("1  0  1", LEFT, 110);
  delay(2000);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  myGLCD.setColor(VGA_RED);
  myGLCD.setBackColor(VGA_WHITE);
  myGLCD.print("1  1  0", LEFT, 130);
  delay(2000);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  myGLCD.setColor(VGA_RED);
  myGLCD.setBackColor(VGA_WHITE);
  myGLCD.print("1  1  1", LEFT, 150);
  delay(2000);
  myGLCD.clrScr();
  myGLCD.fillScr(0, 0, 0);
  myGLCD.setColor(VGA_BLACK);
  myGLCD.setBackColor(VGA_AQUA);
  myGLCD.print("     Seduta finita     ", CENTER, 120);
  delay(2000);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  myGLCD.clrScr();
  myGLCD.fillScr(0, 0, 0);
  MenuIniziale();
}

void pericolo() {
  myButtons.disableButton(avvia);
  myGLCD.clrScr();
  myGLCD.fillScr(0, 0, 0);
}

void loop() {
  MenuIniziale();
  while (1)
  {
    if (myTouch.dataAvailable() == true) {

      delay(50);
      myTouch.read();
      pressed_button = myButtons.checkButtons();

      if (pressed_button == avvia) {

        Seduta();

      }

    }

    if (analogRead(A0) > 600) {
      break;
    }
  }


  pericolo();
  myGLCD.setColor(VGA_RED);
  myGLCD.setBackColor(VGA_AQUA);
  myGLCD.print("         PERICOLO!!   PERICOLO!!          ", CENTER, 170);
  myGLCD.drawBitmap(130, 75 , 50, 50, Icone_Attention);
  for (int i = 0; i < 10; i++) {
    digitalWrite(8, HIGH);
    delay(500);
    digitalWrite(8, LOW);
    delay(500);
  }
  delay(5000);
  myGLCD.clrScr();
  myGLCD.fillScr(0, 0, 0);
}

Qualcuno che mi aiuti, please!!

Hai il codice pieno di delay, quindi il programma deve passare prima da tutte quelle pause e solo alla fine legge il valore di A0. Ovviamente se A0 è tornato nella norma quando viene letto, l'allarme non viene sollevato. Dovresti rivedere un pò il codice, perché così non funziona in tempo reale (valore fuori norma => segnalazione immediata del pericolo),

Come posso migliorarlo?? Ho ipotizzazto di andare a mettere nella funzione Seduta() un continuo controllo del valore di A0 (dei vari if dopo quasi ogni istruzione), ma il codice uscirebbe troppo lungo. Come posso procedere?

Fai un falso delay al cui interno metti un ciclo di attesa basato su millis. All'interno di questo ciclo metti una lettura periodica di A0.
Questa è la soluzione più immediata e semplice, senza stare a riscrivere tutto il programma

Scusami tanto, non ho capito purtroppo :disappointed_relieved: :disappointed_relieved:
Sono un neodiplomato quindi non ho tutta questa conoscenza...purtroppo :frowning:

Crei una funzione che chiamerai myDelay, ad esempio.
Gli passi come parametro il tempo di attesa.
Poi passi a scrivere il codice, inserendo un'attesa basata su millis: vedi l'esempio BlinkWithoutDelay, leggi anche questo mio articolo:
http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

Ho letto e riletto più volte ma non saprei proprio come integrarlo nel mio programma. Mi potresti scrivere uno spezzone di codice che poi modificherò a seconda delle mie esigenze?? Grazie ancora per le tue risposte...non sapendo cosa fare ho provato con gli if dopo ogni istruzione della funzione Seduta(). Non è molto efficiente e il codice e lunghissimo...Avviene quasi tutto in tempo reale ma bisogna aspettare, prima di printare sullo schermo il messaggio di errore, la lettura del delay....sono disperatoooo :frowning:

void myDelay(unsigned long interval) {

unsigned long startMillis = millis(); //registro il momento attuale
  do {
    if (CONDIZIONE) { //la condizione che deve verificarsi per un'uscita immediata
      break; //uscita dal while immediato
    }
  } while (millis() - startMillis < interval); //cicla finché non è passato l'intervallo richiesto
}

E' un prototipo tirato via. devi mettere al posto di CONDIZIONE il check da fare (nel tuo caso, la lettura analogica).

In realtà il programma è scritto in maniera del tutto errata. In questi casi l'uso di millis() e di una impostazione a stati devono essere previsti sin dall'inizio.

Consiglio
Riscrivilo da zero.

E' inutile tentare di rabberciare un codice fatto in questo modo, tanto prima o poi dovrai riscriverlo. Tanto vale farlo subito.

Buongiorno a tutti e buone feste fatte!!
Scusate se rispondo solo ora, ma non ho avuto la possibiltà di rispondere prima. Ho provato a fare come dice leo ma mi da degli errori. Non ho tutta questa conoscenza del linguaggio quindi scusate se vi assillo con domande stupide. Quindi per il momento, purtroppo, continuo ad usare l'enorme programma che ho scritto. Vi chiedo per favore se potreste aiutarmi a migliorarlo. Grazie e scusate ancora

Aiutarti volentieri ma aiutarti a frti capire cosa significano gli errori e come eliminarli non aiutarti scrivendoti il programma
Ciao Uwe

nono non voglio che mi riscriviate il programma, ma che sulla base del programma che ho scritto mi aiutiate a migliorarlo

Iniziamo con il dire che questa è una porcheria:

void setup()
{ ...
}

void loop() 
{
  MenuIniziale();
  while (1)
  { if (myTouch. ... 
  } 
}

Il loop è già chiamato da dentro aun while infinito.
Quindi la struttura più corretta è spostare quel MenuIniziale(); alla fine della setup() e perciò eliminare quel while(1) nel loop

void setup()
{ ...
  MenuIniziale();
}

void loop() 
{ if (myTouch. ...
}

quel pezzo di codice l'ho preso dall'esempio del touch...se non c'è quel while(1) i button appaiono e scompaiono

Perché senza il while viene richiamato MenuIniziale() ad ogni ciclo.
La cosa si risolve spostandolo nel setup() come ha fatto Nid.

il MenuIniziale(); l'ho spostato come avete detto voi ma facendo cosi non mi fa premere sul button. Quindi suppongo che l'esempio che ho presio sia corretto. Quindi la questione del while passerebbe in secondo piano!! Però rimane sempre il problema della visualizzazione dell'errore in tempo reale. La struttura con gli if è assolutamente improponibile, ma purtroppo io a ciò mi fermo a causa delle mie incopetenze in materia. Se mi dareste tanto aiuto ne sarei molto grato