Menu shield dfrobot

si ta température est stockée dans une variable globale, elle est automatiquement disponible dans toutes les fonctions, c'est à ça que sert une variable globale.
Tu en as déjà défini plein pour les consignes, il suffit d'en rajouter pour les températures. D'ailleurs je vais me répéter : pour tes consignes, tu utilise des unsigned int -->ça bouffe plein de mémoire pour une valeur qui sera toujours autour de 20, c'est dommage. Utilises plutôt des byte, tu utilisera un seul octet par variable.

Tu pourrais aussi définir tout ça dans des tableaux, ce serait plus facile pour organiser le reste du programme.

par exemple :

byte consigneJour[8] = {32, 32, 32, 32, 32, 32, 32, 32 };
byte consigneNuit[8] = {29, 29, 29, 29, 29, 29, 29, 29 };
byte temperature[8];

que tu vas utiliser par exemple pour le terra 1 :

if( temperature[0] < consigneJour[0]) { ..........

changer les consignes depuis le menu, c'est encore une autre problématique, chaque chose en son temps :wink: d'abord fais fonctionner correctement ce que tu as, les améliorations viendront ensuite

ok, en tous cas, merci beaucoup de ton aide.

La, je vais chez mon pote justement, et je regarde a sa des que j'ai un moment.

Mais du coup, pour relevé les temperatures, je met " byte temperature[8]; " mais je ne met rien a coté ? comment va t il faire pour savoir de quelle tremperature il s'agit ?

non, ça c'est la déclaration de la variable, exactement comme tu as déclaré unsigned int consigneJour5 = 32;, simplement ici c'est une variable de type byte qui va etre nommée temperature, et le [8]veut dire que la variable est un tableau contenant 8 cases, dont en fait une suite de 8 variables de type byte.
Tu pourrais de la même manière faire un tableau de unsigned int ou un autre type de variables. J'ai choisi des bytes car pour stocker une valeur entre 10 et 40, un seul octet suffit (valeurs possible de 0 à 254) donc ça économise de la mémoire, qui est une denrée rare sur un arduino.

tu peux si tu veux initialiser le tableau avec des valeurs, par exemple 0 : byte temperature[8]={0}; (attention cette notation ne fonctionne que pour 0, pour d'autres valeurs il faut donner toutes les valeurs comme je l'ai fait pour les consignes) mais cela n'a aucun intéret, puisque le tableau doit contenir les températures lues dans la fonction void lireTemperatures() que tu dois créer.

Dans cette fonction tu vas lire tes capteurs et stocker les valeurs lues dans les cases du tableau.

Attention les index d'un tableau commencent à 0, donc dans ton cas pour ton terrarium 1 tous les tableaux utiliseront comme index [0 ], pour le 2, [1], etc etc jusqu'a [7]

bon en fait je viens de voir que tu as besoin de valeurs après la virgule, donc le tableau de températures devra etre déclaré en float, mais pour le reste ça ne change rien.

Tu aura donc quelques chose comme :

float temperatures[8];


void lectureTemperatures()
{
  sensors_1.requestTemperatures(); // RELEVE LA TEMPERATURE DE LA SONDE 1

  temperatures[0] = sensors_1.getTempCByIndex(0); // LA VARIABLE "t_1" CORRESPOND A LA TEMPERATURE DE LA SONDE "SENSORS_1"

et ainsi de suite pour les 8 sondes

ok, je regarde ca, et je te tiens au courant.

Merci beaucoup.

Salut

Alors d’abord, bonne année à toi.

Après une petite absence ou je n’ai pas eu le temps de regarder à ça, je me remet sur le projet.

J’ai donc commencer à réécrire le code comme tu me l’as expliquer, et dès que c’est fonctionnel, je reviens vers toi pour la partie modif des valeurs via les touches de l’écran.

À bientôt

Donc voila, j'ai refait mon programme, quand je l'ai compilé hier, aucun soucis, je l'ai enregistré, et ce matin, en voulant le televersé sur la carte pour faire un essai, l'IDE me donne pleins d'erreurs " was not declared in this scope".

Si quelqu'un pouvais essayer de la compiler pour voir ce que sa donne chez lui.

J'ai essayer de commenter mes fonctions releve_temp / regulation / … mais toujours pareil.

Ca me parait bizarre que cela compilé hier et plus aujourd'hui sans avoir rien toucher.

Merci d'avance

Gestion_elevage_v3.ino (33.2 KB)

Bonjour,

Indentes ton code avec CTRL T (sous windows) et tu verras que le } final de operateMainMenu() est mal placé.
Au lieu de mettre ton code en pièce jointe, mets le entre balises de code comme indiqué dans les messages à lire.

Bonjour,

Apres le formatage automatique, j'ai toujours une erreur lors de la compil

C:\Users\Jordan\Desktop\Arduino\Gestion_elevage_v3\Gestion_elevage_v3.ino: In function 'void operateMainMenu()':

Gestion_elevage_v3:500: error: 'evaluateButton' was not declared in this scope

button = evaluateButton(readKey);

^

Gestion_elevage_v3:580: error: a function-definition is not allowed here before '{' token

int evaluateButton(int x) {

^

Gestion_elevage_v3:1230: error: expected '}' at end of input

}

^

exit status 1
'evaluateButton' was not declared in this scope

Pour ce qui est de mettre mon code entre balise, je ne peut pas, il est trop grand, sinon je dois le mettre en 2 posts, et c'est un peu le bordel.

En tous cas, merci de ton aide.

bon alors voila, j'ai pu televerser mon code dans mon Arduino (j'ai copier la fonction operatemainmenu de mon programme "V2" dans "V3" et sa fonctionne, il devais manquer quelque chose).

Par contre , j'ai des cases blanches sur la premiere ligne de mon ecran a la place de mon menu...

UP.

salut

toi tu n'a pas lu les règles du forum. les "up" c'est interdit, et tu as du bol que les modos n'aient pas encore viré ton message

il me semble qu'avant de faire des copies de fonctions, il faudrait plutôt résoudre les erreurs que le compilateur indique clairement... et avec les indications de kamill tu aurais pu t'en sortir.

d'autant que là, tu nous dis que tu as pu compiler/téléverser, mais sans donner le code modifié en question, alors pour te répondre, ça va être compliqué...

Salut,

En effet, je n’étais pas au courant pour les UP...

Pour ce qui est de mon problème, j’ai suivi les conseils, j’ai fait un formatage auto, mais toujours le même problème, j’ai contrôler mon code d’un bout à l’autre pour vérifier que mes accolades soit toutes au bon endroit (en cliquant dessus sa dit où se situe l’autre partie) tout était OK, c’est pour ça que j’ai fait un copier coller de ma fonction.

Pour le nouveau code, je le met en pièce jointe ce soir.

Merci

Apres un petit contre temps, je met le programme en pièce-jointe.

Je pense qu'il est possible de raccourcir la fonction Régulation avec les tableaux (au lieu de faire 8 pavés en faire qu'un en utilisant les colonnes du tableau, mais je n'ai pas encore eu le temps de chercher sur ce sujet, je cherche déjà a faire fonctionner l'affichage et la régulation.

Merci d'avance

Gestion_elevage_v3.ino (30.1 KB)

Alors première remarque : voila qui est bien mieux organisé et bien plus logique que ta première version :slight_smile: Les opérations sont bien séparées, la loop est très facile à comprendre, bravo !

Par contre il y a une erreur : dans tes conditions, tu utilises &. Il faudrait utiliser &&.
Le premier (& tout seul) réalise une opération logique ET bit à bit entre deux variables, ça s'emploie comme on emploierait un autre opérateur comme + ou - par exemple, ce qui n'est pas tu tout ce que tu cherches à faire. Dans ton cas ça doit fonctionner, car les deux éléments dont tu réalises le ET bit à bit étant des conditions, donc des booléens, seul le premier bit compte, et ça marche, mais c'est un coup de chance !
Le second en revanche (&&) réalise un ET logique entre deux conditions, ce qui est très exactement ce que tu veux faire.

Si tu avais besoin de conditions OU il faudrait de la même manière employer || et non pas |

Pour ce qui est de simplifier la régulation en tirant partie des tableaux, oui en effet c'est très exactement la chose à faire, et c'était dans cette optique que je te disais à la réponse #10 de regarder mon code dans l'autre post : maintenant que (presque) toutes tes variables utiles sont dans des tableaux, il suffit de n'écrire qu'une seule fois le code de la régulation, et de placer ce code dans une boucle for qui va permettre d'incrémenter l'index des tableaux et de réaliser les tests autant de fois que nécessaire. Je dis "presque" car il te reste les numéros de broches des relais qui sont dans des variables séparées... Tu devrais facilement pourvoir convertir cela en un tableau sur le même modèle que les consignes :wink:
Il sera ensuite encore possible de simplifier la fonction en organisant le "if" qui vérifie l'horaire différemment, mais ça on verra après :slight_smile:

Ensuite, l'affichage... Alors là par contre, tu t'es vraiment compliqué la vie à refaire tous les tests que tu as déjà fait dans la régulation, c'est dommage et inutile. Il serait bien plus simple de simplement faire un digitalRead(RELAIS_1) pour savoir si le relais 1 est ON ou OFF plutôt que de refaire les tests.
Et pour l'affichage des consignes jour/nuit, même simplification possible que dans la régulation.

Allez, un tuyau pour simplifier ça : utiliser un troisième tableau de consignes, rempli en début de loop() avec les valeurs soit du tableau de jour, soit du tableau de nuit, en fonction de l'heure. Ainsi le test sur l'heure n'est fait qu'une seule fois au lieu de le faire à chaque terrarium dans la régulation, puis à chaque terrarium dans l'affichage.

Par exemple tu vas créer un tableau de plus et une fonction :

byte Consigne[8];

void choixConsigne()
{
 if (now.hour() > 9 & now.hour() < 21) {
   // SI L'HEURE EST COMPRISE ENTRE 9H ET 21H
   for (byte i=0; i<8; i++) {
     Consigne[i] = Cons_jour[i];
   }
 }
 else { 
   // SI L'HEURE EST COMPRISE ENTRE 21H ET 9H 
   for (byte i=0; i<8; i++) {
     Consigne[i] = Cons_nuit[i];
   }
 }
}

Et bien entendu il faut appeler cette fonction choixConsigne() en début de loop() de manière à ce que le tableau Consigne soit à jour à tout moment.
Ensuite il suffit dans tous tes tests de supprimer le test de l'heure puisque qu'il est déjà fait et d'utiliser seulement le tableau Consigne[].

Entre ça et tirer partie des tableaux pour ta fonction de régulation, tu va diviser presque par deux la longueur de ton programme :slight_smile: Ça sera bien plus simple à lire et à débugger.

Quand un afficheur lcd affiche seulement quelques carrés en début de première ligne, c'est que son initialisation n'est pas faite. Donc soit tu as oublié de mettre lcd.begin(16,2) dans le setup(), soit la déclaration des broches n'est pas correcte.

salut,

Alors voila, j'ai fait les modifs que tu m'as indiquées, maintenant, la fonction de régulation dois ressembler a quelque chose dans ce style la non

const int Relais[8] = {46, 47, 48, 49, 50, 51, 52, 53 }; 

byte Consigne[8];

void loop() {

  choix_consigne();
  releve_temp();
  regulation();
  mainMenuDraw();
  drawCursor();
}

void choix_consigne() {

  if (now.hour() > 9 && now.hour() < 21) {
    for (byte i=0; i<8; i++) {
      Consigne[i] = Cons_jour[i];
    }
  }

  else

    for (byte i=0; i<8; i++) {
      Consigne[i] = Cons_nuit[i];
    }
}


void regulation() { // FONCTION REGULATION

  if (temperature[0] > (Consigne[0] + 0.5)) {

      digitalWrite(Relais[0], LOW);

      }

  if (temperature[0] < (Consigne[0] + 0.5)) {

      digitalWrite(Relais[0], HIGH);

      }

Mais pour ce servir des tableaux et ne faire qu'une fonction pour les 8 terrariums, j'ai essayer de mettre un "i" en index mais sa ne fonctionne pas. Je creuse un peu de ce coté la.

Merci encore a toi de ton aide

Je remet le code en pièce jointe, apres les modifs, les broches de l'ecran sont bien declarées et il est bien initialisén mais toujours le problème des cases blanches, j'ai essayer un ancien programme, l'affichage fonctionne, j'ai comparé les 2 programmes, ils sont identiques, aucune différence, mais aucun affichage, a part les cases blanches...

Gestion_elevage_v3.ino (19.9 KB)

tiotjordan:
Mais pour ce servir des tableaux et ne faire qu'une fonction pour les 8 terrariums, j'ai essayer de mettre un "i" en index mais sa ne fonctionne pas. Je creuse un peu de ce coté la.

ben pourtant, utilise ce que je t'ai indiqué avec la boucle for dans la fonction choixConsigne, de la même manière

quanbd tu fais un truc qui ne fonctionne pas, ce qui serait utile pour t'aider, c'est que tu postes le code qui justement ne marche pas, ça permettrait de t'indiquer où est le problème

tiotjordan:
Je remet le code en pièce jointe, apres les modifs, les broches de l'ecran sont bien declarées et il est bien initialisén mais toujours le problème des cases blanches, j'ai essayer un ancien programme, l'affichage fonctionne, j'ai comparé les 2 programmes, ils sont identiques, aucune différence, mais aucun affichage, a part les cases blanches...

effectivement, j'ai aussi comparé avec un des premiers que tu avais posté, l'initialisation semble être identique

il faudrait que tu compares quand tu compiles un programme qui marche et un qui ne marche pas ce que raconte l'IDE dans la zone du bas de la fenetre, tu va avoir des lignes genre "utilisation de la librairie LiquidCrystal depuis" et un nom de dossier. Vérifie que dans les deux cas c'est bien la même lib qui est utilisée

Salut,

alors pour ce qui est de la simplification du programme avec les tableausx, c'est bon, j'ai trouver.

Maintenant pour l'écran, lors de la compilation, en bas de l'IDE (dans la partie noire), ce ne m'indique rien du tous, a part

Le croquis utilise 15750 octets (6%) de l'espace de stockage de programmes. Le maximum est de 253952 octets.
Les variables globales utilisent 994 octets (12%) de mémoire dynamique, ce qui laisse 7198 octets pour les variables locales. Le maximum est de 8192 octets.