creer un tableau de message d'erreur + gestion sms

bonjour tout le monde avec un ami on fini le programme de gestion d'une serre autonome

il me reste un truc a faire, mais je vois pas trop comment l'aborder.

nous avons une ligne de libre sur mon ecran 4 lignes, je voudrais la dédier au message d erreur

seulement le soucis, c est si j ai plusieurs messages d erreur, ils vont se superposer et donc seront illisible

en fait j'aurais voulu essayer de faire un tableau virtuel à 5-6 lignes.
lorsque un premier message apparait, il va dans la ligne 1
si un second message unique apparait , il va dans la deuxieme lignes etc...

si un message disparait, tout les suivants remonte d'un cran, etc...

et ensuite, on fait un code qui va lire, la ligne 1 si elle n est pas vide, puis la 2 puis la 3 etc....

qu en pensez vous?

et dernier point qui me restera a aborder, c est une gestion des sms, quel module existe t il et est ce compliqué à coder?

l'idée est que sur un reception type check, en retour, j ai les constantes du programme: temp;humidité; luminosité etc...

et en cas d'erreur presente dans le tableau creer auparavant, l arduino envoi un sms, avec le ou les messages d erreurs

merci à tous

si un message disparait, tout les suivants remonte d'un cran, etc...

comment un message pourrait-il disparaître?

pour les SMS il y a plein de modules, un SIM800L fonctionnera sans doute (si vous avez une couverture GSM)

Et bien par une action physique qui corrigerais le probleme

Quel genre de problème ? Genre plus d’eau dans la réserve ? Trop chaud ?

Pouvez vous lister les alertes que vous avez en tête ?

Si vous en avez moins de 8 vous pourriez juste avoir des petites icônes sur la dernière ligne qui indiquent cet état (voir utiliser des caractères normaux)

Bonjour effectivement je pense qu'il y en a moins de 8 par contre utilisateur final ça va être ma femme et je pense qu'il faut pas trop lui compliquer les choses donc je préfère essayer d'écrire un message clair qui sera utilisé dans l'alerte des SMS

Et oui la liste des problèmes sera du genre trop chaud trop froid plus d'eau air trop sec terre trop sèche pas assez lumière

Autre question que j’ai oublié Gmail horloge que vous aviez préconisé dans votre poste mais elle dérive quand même pas mal en 3 semaines il y a eu 3 heures de décalage est-ce qu’il y a une solution à cela ou non ?

Une RTC DS3231 ? elle ne devrait pas dériver de plus de quelques secondes par an…

Pour les messages si vous savez les lister vous définissez un tableau de booleen des alarmes actives et vous passez l’entrée à vrai si la condition est remplie et à faux quand l’alerte tombe

Pour l’affichage soit vous rajoutez des boutons ou un encodeur rotatif pour les afficher un par un, soit vous les faites simplement défiler un par un pendant 5 secondes - en imaginant bien sûr que vous avez codé correctement et que votre loop() est non bloquante

(Et Votre femme n’est sans doute pas aussi bête que vous croyez… )

sinon voilà un bout de code qui peut expliquer le concept:

const char alerte_0[] PROGMEM = "ALERTE #0";
const char alerte_1[] PROGMEM = "ALERTE #1";
const char alerte_2[] PROGMEM = "ALERTE #2";
const char alerte_3[] PROGMEM = "ALERTE #3";
const char alerte_4[] PROGMEM = "ALERTE #4";
const char alerte_5[] PROGMEM = "ALERTE #5";

const char* const lesALertes[] PROGMEM = {alerte_0, alerte_1, alerte_2, alerte_3, alerte_4, alerte_5};

const uint8_t nbAlertes = sizeof(lesALertes) / sizeof(lesALertes[0]);
bool alertesActives[nbAlertes];

// le paramètre optionnel sert à forcer l'affichage du prochain message (utile quand un paramètre change et qu'on veut forcer tout de suite l'affichage)
// si on  appelle la fonction sans paramètre, alors forceAffichage prend la valeur par défaut et on met à jour que tous les periodeChangementMessageAlerte ms
void afficheProchaineAlerte(bool forceAffichage = false)
{
  static unsigned long chronoAlerte = 0;
  const unsigned long periodeChangementMessageAlerte = 2000ul;
  char message[30]; // assez grand pour le plus grand message d'alerte+1

  static uint8_t alerteCourante = 0;
  if (forceAffichage || (millis() - chronoAlerte >= periodeChangementMessageAlerte)) { // est-ce le moment de changer le message
    // on cherche quelle alerte est en cours après alerteCourante
    uint8_t i = 1;
    while (i <= nbAlertes) {
      uint8_t index = (alerteCourante + i) % nbAlertes; // utilisation du modulo pour rester dans le tableau
      if (alertesActives[index]) {
        // on affiche celle là
        strcpy_P(message, (char*)pgm_read_word(&(lesALertes[index]))); // on récupère le message dans la mémoire flash
        Serial.println(message); // et on l'imprime
        alerteCourante = index;
        break; // on a affiché un message on termine ici et sort du while
      }
      i++;
    } // fin du while

    if (i > nbAlertes) {
      // il n'y avait aucun message d'alerte, effacer l'écran
      Serial.println(F("SYSTEME OK"));
    }
    chronoAlerte += periodeChangementMessageAlerte;
  }
}

void testDuSysteme(boolean forceTest = false)
{
  static unsigned long chronoTestSysteme = 0;
  const unsigned long periodeTestSysteme = 500ul; // on teste 2 fois par seconde

  if (forceTest || (millis() - chronoTestSysteme >= periodeTestSysteme)) {
    // ici on modifie aléatoirement l'état du systeme
    for (uint8_t i = 0; i < nbAlertes; i++) {
      if (random(0, 50) == 0) { // une chance sur 50 d'un soucis
        alertesActives[i] = !alertesActives[i] ;
      }
    }
    chronoTestSysteme += periodeTestSysteme;
  }
}

void setup() {
  Serial.begin(115200);
  for (uint8_t i = 0; i < nbAlertes; i++) alertesActives[i] = false;
}

void loop()
{
  testDuSysteme();
  afficheProchaineAlerte();
}

dans lequel les erreurs sont générées aléatoirement, à vous bien sûr de tester correctement l’état de votre système

merci je vais montrer ce code a mon ami

ma femme n est pas bete, mais je la connais…

vtec35:
ma femme n est pas bete, mais je la connais...

attention elle va vous balancer sur twitter :slight_smile:

est ce que vous auriez une piste sur la derive important de l horloge? que l on sache ou creuser

C’est bien une 3231 pas une 1307? Votre code il la remet à l’heure ?