Sketch trés lent pourquoi ???

bonjour,

je suis un passionné aquariophilie

je me suis acheté un quitte avec un arduino mega pour réaliser un mini automate pour mon aquarium

alors j’ai un elegoo mega2560 R3
une horloge ds1307
un Ecran 2.8" tft ILI9341

je suis autodidacte en cherchant des codes a droite et a gauche

j’ai fais un petit de menu avec l’horloge et juste une sonde de température

mais mon sketch est très très lent

Pourquoi ???
merci
des explications en restant très simple

voila le sketch

Menu_3_ok.ino (17.7 KB)

:o :confused: ben vous essayez de faire cela

/////////////////////////
    /// horloge /////////////
    /////////////////////////
    DateTime now = RTC.now();
    DateTime heureRTC;
    heureRTC = RTC.now(); ///heureRTC = RTC1307.now();
    /////////////////////////

    ////////////////////// HEURE /////////////////////////////////////
    tft.setTextColor(RED, BLACK); tft.setTextSize(2);
    tft.setCursor(15, 5); tft.print(now.hour()); tft.print(":");
    if (now.minute() < 10) {
      tft.print("0");
    }
    tft.print(now.minute()); tft.print(":");
    if (now.second() < 10) {
      tft.print("0");
    }
    tft.print(now.second());
    ////////////////////// DATE /////////////////////////////////////
    tft.setTextColor(RED, BLACK); tft.setTextSize(2);
    tft.setCursor(170, 5);
    tft.print(now.day());
    switch (now.month()) {
      case 1:
        tft.print("/1 /");
        break;
      case 2:
        tft.print("/2/");
        break;
      case 3:
        tft.print("/3/");
        break;
      case 4:
        tft.print("/4/");
        break;
      case 5:
        tft.print("/5/");
        break;
      case 6:
        tft.print("/6/");
        break;
      case 7:
        tft.print("/7/");
        break;
      case 8:
        tft.print("/8/");
        break;
      case 9:
        tft.print("/9/");
        break;
      case 10:
        tft.print("/10/");
        break;
      case 11:
        tft.print("/11/");
        break;
      case 12:
        tft.print("/12/");
        break;
    }
    tft.print(now.year());

des milliers de fois par seconde alors qu’une fois toute les secondes ce serait bien suffisant par exemple et uniquement pour les éléments qui changent (par exemple que les secondes si vous êtes passé de 12 à 13s, pas la peine de ré-afficher toute la date)

il semble que vous prenez un malin plaisir à effacer tout l’écran pour tout redessiner…

de plus il y a au moins une boucle infinie…

      if ((choix_0 == 1) ) {
        while (choix_0 == 1) {
          ////////////////////////////
          digitalWrite(13, HIGH);
          TSPoint p = ts.getPoint();
          digitalWrite(13, LOW);
          pinMode(XM, OUTPUT);
          pinMode(YP, OUTPUT);
          p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240);
          p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320);
          ////////////////////////////
          //Serial.print(" x= "); Serial.print(p.x); Serial.print(" y= "); Serial.println(p.y + 25);
          if (p.z > MINPRESSURE && p.z < MAXPRESSURE )
          {
            //Serial.println("  dans le while ");
            if ( (p.x > 150 && p.x < 180 && p.y + 25 > 270 && p.y + 25 < 300) ) {
              TempSeuilAlarmeHaute++;
            }
            if ( ( p.x > 190 && p.x < 220 && p.y + 25 > 270 && p.y + 25 < 300) ) {
              TempSeuilAlarmeHaute--;
            }
            ////////////
            tft.fillRect(10, 195, 30, 30, WHITE);
            if (( p.x > 200 && p.x < 230 && p.y + 25 > 15 && p.y + 25 < 50) ) {
              choix_1 = 0;
              break;
            }
          }
          tft.setCursor(65, 175); tft.setTextColor(RED, BLACK); tft.setTextSize(2); tft.print("Consigne : "); tft.print(TempSeuilAlarmeHaute);
        }
      }

dans ce while vous ne modifiez jamais choix_0 donc si vous y entrez vous n’en sortirez plus…

==> un peu de boulot pour remettre cela en forme

merci de la réponse

mais voila comment faire

mettez-moi moi sur la piste

bien cordialement

ah oui en effet j'ai oublier une erreur j'ai laissé choix_1 =0 a la place de mettre choix_0=0

mais c'est toujours aussi lent

mais c'est toujours aussi lent

oui faut revoir tout l'affichage comme je vous l'ai dit.

  • vous commencez par mettre un test avec millis() pour effectuer la lecture de la RTC et l'affichage une fois par seconde seulement

  • vous mémorisez ce qu'il y a comme anciennes valeurs à l'écran et testez avant d'afficher si la valeur a changé. si c'est la même, pas la peine d'afficher

--> faites cela ce sera sans doute un bon début

Une solution à la hussarde pour mettre à jour les affichages :

  1. Par information à afficher travailler à nombre de caractère figé, exemple (au hasard) 5 caractères.
  2. Ne pas effacer tout l'écran à chaque fois mais là où on veut actualiser un affichage :
    1=> écriture une séquence vide, vu l'exemple écrire 5 caractères vides => cela effacera ce qui était précédement affiché
    2=> écrire les nouveaux caractères mis à jour.

alors la je séche

je fais des teste depuis 2h pour mettre un millis() sur l’horloge
mais rien ne fonctionne
avez vous des exemples ?
merci

Je pense que les appels à fillScreen(BLACK) doivent être très pénalisants.

Dans ce genre de projet je le fais une seule fois dans setup().
Ensuite j'utilise fillRect(), setCursor(), setTextColor() et print().

La solution de 68tjs marche aussi.

J'ai eu un soucis une fois avec, il me restait des caractères récalcitrants.
J'ai tourné la difficulté en réécrivant la même chaîne mais avec la couleur du fond de l'écran.
Et là fonctionnement garanti.

en effet j’ai remplace les fillscreen part des fillrects et ca tourne un peu mieux

puis j’ai arrête l’horloge et oui c’est elle qui me fait ralentir

mais je ne sais pas mettre la fonction millis sur l’horloge

une hame charitable peut regarder mon skretch et me mettre un millis pour avoir un temps de scrutation de 1s sur l’horloge

je met mon skretch

bien cordialement
xavier

Menu_6.ino (18 KB)

vous déclarez une variable globale uint32_t derniereMaJ. =0;qui vous permet de savoir quand la dernière mise à jour a eu lieu

dans la loop vous testez si c'est le moment de faire une mise à jour

if (millis() - derniereMaJ >= 1000) {
 // plus d'une seconde depuis la dernière mise à jour
...
  derniereMaJ = millis();
} 
... // ici autre chose que vous voulez faire tout le temps

Bonjour,

  • Vous n'avez pas forcement besoin de millis() puisque vous utilisez un chip horloge DS 1307 il suffit de comparer la seconde lue pour voir si elle a changée.

  • Vous utilisez un écran un Ecran 2.8" tft ILI9341, pourquoi ne pas utiliser cette bibliothèque et pourquoi ne pas utiliser le SPI hardware avec cet écran ?

  • Pourquoi switch / case pour afficher le mois par exemple, tft.print(now.month()); fonctionne.

  • Ensuite, il faut gérer l'écran par zone et ne rafraîchir que ce qui bouge.

Voilà quelques pistes qui j'espère pourront aider.

super
ca fonctionne un grand merci a J-M-L

c’est encore une peu lent quand avec le style je veux augmenté la consigne

je remet mon sketch

encore un grand merci je vais pouvoir continué mon petit gestionnaire d’aquarium

Menu_6.ino (18.6 KB)