Vibrazione valori visualizzati su display

Ciao,
utilizzo un TFT 4.3 per visualizzare dei dati su una vettura, visualizzo 3 dati, letti sulle porte analogiche; inoltre visualizzo un indicatore marce ( che prende i segnali da 5 switch posti sul leveraggio innesto marce), e altri vari allarmi etc.
Il "problema" è questo: i 3 valori visualizzati sul display funzionano correttamente se nessuna marcia è inserita, mentre con qualsiasi marcia inserita i decimali (o le ultime 2 cifre) visualizzate, vibrano molto velocemente. Ho provato a rallentare la lettura e la stampata sul display di questi 3 valori, e anche della parte che visualizza la marcia inserita, ma senza successo. Ho verificato anche disturbi hardware, ma il problema si verifica anche facendo funzionare tutto su banco.
Mi è venuto in mente che forse ho complicato troppo il codice nella parte di visualizzazione della marcia, potrebbe essere quello? Potrei semplificare in qualche modo la lettura degli switch? Vi allego il codice qua sotto (non tutto perchè è enorme, se poi serve, basta chiedere) grazie per l'aiuto.

//********************** controllo switch per segnalatore marcia ***************************************
    if (millis() - pmillis >= 300) {     // controllo marce ogni 300 ms
      Mmillis = millis ();

      zero = digitalRead (RETRO);           // leggo il bulbo retromarcia
      if  (zero == 0)                       // verifico se è inserita la retro
      {
        if (retrom == false)                //controllo se ho già scritto la R
        {
          myGLCD.setFont(BigNum);           //numeri giganti
          myGLCD.setColor(255, 0, 0);       //colore numeri
          myGLCD.setBackColor (0, 0, 0);    //colore sfondo scritta
          myGLCD.print("7", CENTER, 0);     //scrivo il numero marcia, il 7 fa la R
          retrom = true;                    //avviso che ho scritto
        }
      }
      else {        // da quà controllo tutte le altre marce se non c'è la retro
        retrom = false;                      //azzero la R per poterla riscrivere

        zero = digitalRead (SX);              // leggo lo switch marce SX
        if  (zero == 0)                       // verifico se è premuto lo switch
        {
          zero = digitalRead (FRONT);         // leggo lo switch marce FRONT
          if  (zero == 0)                     // verifico se è premuto lo switch
          {
            if (uno == false)
            {
              myGLCD.setFont(BigNum);          //numeri giganti
              myGLCD.setColor(255, 0, 0);      //colore numeri
              myGLCD.setBackColor (0, 0, 0);   //colore sfondo scritta
              myGLCD.print("1", CENTER, 0);    //scrivo il numero marcia
              uno = true;                      //avviso che ho scritto
            }
          }
          else {
            uno = false;                       //azzero l'uno per poterlo riscrivere
          }
          zero = digitalRead (REAR);           // leggo lo switch marce REAR
          if  (zero == 0)                      // verifico se è premuto lo switch
          {
            if (due == false)
            {
              myGLCD.setFont(BigNum);          //numeri giganti
              myGLCD.setColor(255, 0, 0);      //colore numeri
              myGLCD.setBackColor (0, 0, 0);   //colore sfondo scritta
              myGLCD.print("2", CENTER, 0);    //scrivo il numero marcia
              due = true;                      //avviso che ho scritto
            }
          }
          else {
            due = false;                       //azzero il due per poterlo riscrivere
          }
        }
        else
        {
          uno = false;                         //azzero l'uno per poterlo riscrivere
          due = false;                         //azzero il due per poterlo riscrivere
        }

        zero = digitalRead (DX);               // leggo lo switch marce DX
        if  (zero == 0)                        // verifico se è premuto lo switch
        {
          zero = digitalRead (FRONT);          // leggo lo switch marce FRONT
          if  (zero == 0)                      // verifico se è premuto lo switch
          {
            if (cinque == false)
            {
              myGLCD.setFont(BigNum);          //numeri giganti
              myGLCD.setColor(255, 0, 0);      //colore numeri
              myGLCD.setBackColor (0, 0, 0);   //colore sfondo scritta
              myGLCD.print("5", CENTER, 0);    //scrivo il numero marcia
              cinque = true;                   //avviso che ho scritto
            }
          }
          else {
            cinque = false;                    //azzero il 5 per poterlo riscrivere
          }
          zero = digitalRead (REAR);           // leggo lo switch marce REAR
          if  (zero == 0)                      // verifico se è premuto lo switch
          {
            if (sei == false)
            {
              myGLCD.setFont(BigNum);           //numeri giganti
              myGLCD.setColor(255, 0, 0);       //colore numeri
              myGLCD.setBackColor (0, 0, 0);    //colore sfondo scritta
              myGLCD.print("6", CENTER, 0);     //scrivo il numero marcia
              sei = true;                       //avviso che ho scritto
            }
          }
          else {
            sei = false;                        //azzero il 6 per poterlo riscrivere
          }
        }
        else
        {
          cinque = false;                         //azzero il 5 per poterlo riscrivere
          sei = false;                            //azzero il 6 per poterlo riscrivere
        }

        if (uno == false)                       // controlla la 3° solo se non è in 1°
        {
          if (cinque == false)                  // controlla la 3° solo se non è in 5°
          {
            zero = digitalRead (FRONT);         // leggo lo switch marce FRONT
            if  (zero == 0)                     // verifico se è premuto lo switch
            {
              if (tre == false)
              {
                myGLCD.setFont(BigNum);          //numeri giganti
                myGLCD.setColor(255, 0, 0);      //colore numeri
                myGLCD.setBackColor (0, 0, 0);   //colore sfondo scritta
                myGLCD.print("3", CENTER, 0);    //scrivo il numero marcia
                tre = true;                      //avviso che ho scritto
              }
            }
            else {
              tre = false;                       //azzero il 3 per poterlo riscrivere
            }
          }
        }
        if (sei == false)                       // controlla la 4° solo se non è in 6°
        {
          if (due == false)                     // controlla la 4° solo se non è in 2°
          {
            zero = digitalRead (REAR);          // leggo lo switch marce REAR
            if  (zero == 0)                     // verifico se è premuto lo switch
            {
              if (quattro == false)
              {
                myGLCD.setFont(BigNum);         //numeri giganti
                myGLCD.setColor(255, 0, 0);     //colore numeri
                myGLCD.setBackColor (0, 0, 0);  //colore sfondo scritta
                myGLCD.print("4", CENTER, 0);   //scrivo il numero marcia
                quattro = true;                 //avviso che ho scritto
              }
            }
            else {
              quattro = false;                  //azzero il 4 per poterlo riscrivere
            }
          }
        }
        if (uno == false)
        {
          if (due == false)
          {
            if (tre == false)
            {
              if (quattro == false)
              {
                if (cinque == false)
                {
                  if (sei == false)
                  {
                    if (retrom == false)
                    {
                      myGLCD.setFont(BigNum);           //numeri giganti
                      myGLCD.setColor(0, 0, 0);         //colore numeri
                      myGLCD.setBackColor (0, 0, 0);    //colore sfondo scritta
                      myGLCD.print(" ", CENTER, 0);     //cancella i numeri
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    //************************* fine controllo switch marce ***************************

scusate, vi rimetto altra parte del codice, non ci stava. Come si fa per allegare un codice lungo? Grazie

 //************* controllo ingressi per allarmi flashlube olio freni e liquido ***************
    if (millis() - pmillis >= 1000) {    // controlla gli ingressi ogni secondo
      Amillis = millis ();

      zero = digitalRead (LUBE);  // leggo il pin del lube
      if  (zero == 0)             // controllo se il pin è a massa
      {
        if (flashlube == false)   // controllo se ho già scritto l'allarme
        {
          Flashlube();            // crea scritta riserva flashlube
          flashlube = true;       // avviso che ho scritto allarme

          digitalWrite (OUTCICALINO, HIGH);  // attiva il cicalino per beep
          delay (600);                       // aspetta 600 ms
          digitalWrite (OUTCICALINO, LOW);   // disattiva il cicalino
          delay (400);                       // aspetta 400 ms
          digitalWrite (OUTCICALINO, HIGH);  // attiva il cicalino per beep
          delay (600);                       // aspetta 600 ms
          digitalWrite (OUTCICALINO, LOW);   // disattiva il cicalino
        }
      }
      zero = digitalRead (OIL_FRENI); // leggo il pin dell'olio freni
      if  (zero == 0)                 // controllo se il pin è a massa
      {
        if (oliofreni == false)       // controllo se ho già scritto l'allarme
        {
          Oliofreni();                // creo scritta riserva olio freni
          oliofreni = true;           // avviso che ho scritto allarme

          digitalWrite (OUTCICALINO, HIGH);  // attiva il cicalino per beep
          delay (600);                       // aspetta 600 ms
          digitalWrite (OUTCICALINO, LOW);   // disattiva il cicalino
          delay (400);                       // aspetta 400 ms
          digitalWrite (OUTCICALINO, HIGH);  // attiva il cicalino per beep
          delay (600);                       // aspetta 600 ms
          digitalWrite (OUTCICALINO, LOW);   // disattiva il cicalino
        }
      }
      zero = digitalRead (RADIAT);    // leggo il pin del liquido radiatore
      if  (zero == 0)                 // controllo se il pin è a massa
      {
        if (liquidoradiatore == false)// controllo se ho già scritto l'allarme
        {
          Liquidoradiatore();         // creo scritta riserva liquido radiatore
          liquidoradiatore = true;    // avviso che ho scritto allarme

          digitalWrite (OUTCICALINO, HIGH);  // attiva il cicalino per beep
          delay (600);                       // aspetta 600 ms
          digitalWrite (OUTCICALINO, LOW);   // disattiva il cicalino
          delay (400);                       // aspetta 400 ms
          digitalWrite (OUTCICALINO, HIGH);  // attiva il cicalino per beep
          delay (600);                       // aspetta 600 ms
          digitalWrite (OUTCICALINO, LOW);   // disattiva il cicalino
        }
      }
    }
    //************************** fine controllo allarmi *******************************
    //********************* controllo pressioni da pin analogici **********************

    myGLCD.setFont(BigFont);                              //imposta grandezza carattere
    myGLCD.setColor(255, 255, 0);                           //colore scritta
    myGLCD.setBackColor (0, 0, 0);                          //colore sfondo scritta

    if (millis() - pmillis >= 3000) {                       // legge la prex metano solo ogni 3 secondi
      pmillis = millis ();

      liv_met = analogRead(LIV_MET);                        //lettura valore pressione metano da bombole
      bar_metano = map (liv_met, 110, 900, 0, 250);         //converte volt 0,5 - 4,5 in 5 - 250 bar
      //myGLCD.printNumI(bar_metano, 45, 20);               //scrive, posiz 1° orizz, 2° vert
      myGLCD.printNumF(float(bar_metano) / 1, 0, 75, 25);   //float, variabile, divide per, n. decimali,
      //posizione orizz, posizione vert
    }

    if (millis() - pmillis >= 500) {                        // legge la prex rail ogni 500 ms
      pmillis1 = millis ();

      prex_rail = analogRead(PREX_RAIL);                    //lettura valore pressione rail metano
      bar_rail = map (prex_rail, 30, 1024, 0, 1000);        //converte volt 0,5 - 4,5 in 0 - 10 bar
      //myGLCD.printNumI(bar_rail, 100, 65);                //scrive, posiz 1° orizz, 2° vert
      myGLCD.printNumF(float(bar_rail) / 100, 2, 75, 80);  //float, variabile, divide per, n. decimali,
      //posizione orizz, posizione vert
    }

    if (millis() - pmillis >= 250) {                        // legge la prex collettore ogni 250 ms
      pmillis2 = millis ();

      prex_turbo = analogRead(PREX_TURBO);                  //lettura valore pressione turbo
      bar_turbo = map (prex_turbo, 0, 1024, -106, 223);     //converte volt 0 - 5 in -100 - 200 decibar
      //myGLCD.printNumI(bar_turbo, 45, 100);               //scrive, posiz 1° orizz, 2° vert
      myGLCD.printNumF(float(bar_turbo) / 100, 2, 75, 120); //float, variabile, divide per, n. decimali,
      //posizione orizz, posizione vert
    }
    //************************* fine controllo pressioni *********************************

thedrifter:
Come si fa per allegare un codice lungo? Grazie

Si mette come allegato e NON all'interno del post.

Guglielmo

Ok, ho allegato tutto il codice, spero di aver fatto bene...
Naturalmente per compilarlo servono diverse librerie...
Grazie di nuovo

DISPLAY_TOUCH_ALFA_75.ino (57.5 KB)