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
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