Projet de gestion climatique

Bonjour tout le monde !

C'est avec une certaine fierté que je viens vous présenter mon premier projet Arduino sur la gestion climatique d'une serre/véranda/jardin d'intérieur etc... Je sais que ce n'est pas ce qui manque sur le forum mais comme c'est un projet utile, idéal pour apprendre et en plus bon marché ! Je ne pouvais pas passer à côté! :sunglasses:

Le projet : il s'agit de réguler le climat d'un espace de culture via des relais commandés par l'arduino avec des consignes hautes et basses en température, hygrométrie et aussi en temps afin de pouvoir déclencher certains événements tous les "x temps". Plus concrètement gérer l'aération, la ventilation, le chauffage, la brumisation etc..

Le matériel : je dispose pour le moment:

  • une carte Arduino UNO
  • un capteur de température (pour l'extérieur)
  • un capteur de température et d'hygrométrie DHT22 (pour l'intérieur)
  • quatre relais (2 shields de deux relais)
  • d'un encodeur / switch
  • d'un écran LCD - 4 lignes 20 caractères

d'autres options seront ajoutées par la suite comme le stockage des données, transmission avec ou sans fil, et affichage des mesures sur un terminal mais pour l'instant je préfère me contenter du minimum, faire les essais, être sûr que ce soit fiable avant d'aller plus loin.

Les branchements : bah je n'ai pas encore fait de schéma sur l'ordi mais brièvement l'encodeur/switch et le capteur de température (extérieure) sont sur les entrées analogiques et le reste sur les I/O numériques.

Le fonctionnement : toutes les consignes se remplissent via l'écran LCD et l'encodeur/switch. Il y a un premier menu avec l'affichage des températures et l'hygrométrie, si j'appuis sur le bouton, les valeurs Min/Max des capteurs s'affichent, si je réappuie une seconde fois je reviens au menu initial.
Si je tourne l'encodeur, je parcoure quatre menus correspondants aux quatre relais avec l'affichage des consignes. Pour modifier ces dernières j'utilise le switch et l'encodeur qui au fur et à mesure des appuis va pouvoir sélectionner la consigne à modifier et avec l'encodeur spécifier une valeur. Enfin un dernier appui permet de revenir au menu initial.
Les consignes en température (et l'hygrométrie aussi) se présente sous cette forme Tmin < T < Tmax : en gros le relais se déclenche en dessous de Tmin ET/OU au dessus de Tmax. Pour la consigne de temps si on choisi de l'utiliser se présente comme ça : temps_On / temps_Off.
Je suis conscient que si j'avais pris le temps de faire des dessins, cela aurait été bien plus simple pour expliquer.. enfin surtout pour comprendre :grinning: . Je le ferais si je voie qu'il y a trop de confusion dans la compréhension du fonctionnement.

Le programme : bon c'est là où je vais avoir besoin de votre aide ::slight_smile: Si le programme fonctionne à peu près correctement (il y a quelques p'tits bug, et il manque le reset des extrêmes..), il n'est pas du tout optimisé et me paraît bordélique, en effet c'est mon premier programme et je ne sais pas trop à quoi ressemble un sketch bien codé.. Je ne maîtrise pas les tableaux et les boucles non plus... :-[ . Alors j'aimerais avoir quelques suggestions pour avoir un beau code dans les règles de l'art!! J'aimerais vraiment apprendre à coder proprement car je me suis rendu compte que je prenais beaucoup de plaisir à programmer et j'aimerais pouvoir continuer sur de bonnes bases.. Sans plus attendre voici le sketch ( attention ça va peut être piquer les yeux.. :fearful: )

Heu... Bon avec le prog ça fait trop de texte.. je le mets en pièce jointe..

Merci beaucoup et à bientôt!

gestion climat.pdf (78.9 KB)

Bonjour,

Pour un premier programme, c'est pas mal du tout, je trouve le code propre, d'autres pourraient en prendre de la graine.

Ceci dit, plusieurs remarques:

  • Tu n'as pas d'horloge temps réel. Dans ces conditions, difficile de gérer le "timing" des consignes de température et hygrométrie.

  • Tu utilises la classe "PinChangeIn" avec un "attachInterrupt", c'est bien. Mais tu appelle systématiquement, à chaque boucle les fonctions EncodeurA et EncodeurB. Ca, c'est pas correct.

  • Il faut impérativement que tu sauvegarde dans l'EEPROM, les consignes que tu as réglées par l'encodeur.

Enfin, je te dirais qu'avec la UNO, tu auras du mal à ajouter des fonctionnalités supplémentaires.

Bonjour bilbo83

bilbo83:
Pour un premier programme, c'est pas mal du tout, je trouve le code propre, d'autres pourraient en prendre de la graine.

J'ai passé tellement de temps à remanier le code dans tous les sens, fouiner sur le net pour trouver des exemples avec des syntaxes correctes. Mais étant complètement débutant, c'est assez difficile de savoir si tel ou tel code est bien écrit ou pas.. De plus je serais heureux si ce code pouvait servir d'exemple pour les autres. En tout cas merci pour le compliment, ça va m'encourager à continuer dans ce sens.

bilbo83:

  • Tu n'as pas d'horloge temps réel. Dans ces conditions, difficile de gérer le "timing" des consignes de température et hygrométrie.

Quand tu dis "timing", tu parles du déclenchement des relais sur une base temporelle? c'est à dire la fonction "temps_On / temps_Off" ? Si c'est bien le cas, c'est un choix personnel : je ne voyais pas l'utilité d'activer un évènement à des heures précises. Un exemple d'utilisation : quand il fait trop chaud ou qu'il y a trop d'humidité, l'aération se met en marche mais il faut aussi qu'elle se déclenche de temps en temps pour renouveler l'air au sein de l'espace de culture. Et c'est aussi une question de coût, j'ai quelques amis qui aimeraient avoir aussi une gestion climatique automatisée pour leurs collections d'orchidées/cactus/plantes carnivores et comme ils sont pour la plupart peu fortunés, j'essais de réduire les coûts au maximum. Mais je pense quand même me procurer un petit module RTC un peu plus tard, histoire de voir comment ça fonctionne.

bilbo83:

  • Tu utilises la classe "PinChangeIn" avec un "attachInterrupt", c'est bien. Mais tu appelle systématiquement, à chaque boucle les fonctions EncodeurA et EncodeurB. Ca, c'est pas correct.

Tu as raison, après réflexion ça ne me semble pas logique. Ils sont donc supprimés de la boucle loop!

bilbo83:

  • Il faut impérativement que tu sauvegarde dans l'EEPROM, les consignes que tu as réglées par l'encodeur.

Oui, je suis en train de cogiter dessus car je ne sais pas si je dois utiliser l'EEPROM qui a un nombre limité de cycles d'écriture ou utiliser un shield avec une carte SD.. Cette dernière me semble plus adaptée mais engendre des dépenses supplémentaires, car en plus je risque d'être vraiment juste en I/O.. Mais dans tous les cas je préfère que ça coûte plus cher mais que ça dure dans le temps!

bilbo83:
Enfin, je te dirais qu'avec la UNO, tu auras du mal à ajouter des fonctionnalités supplémentaires.

Ca c'est sûr!! la aussi je réfléchi aux alternatives je pense me prendre la MEGA pour développer mes projets et pour les amis peut être qu'un clone de la UNO mais qui dispose de plus d'entrée sortie (comme la ADAFRUIT TRINQUET PRO) sera suffisant.

Pour conclure, je te tenais juste à te remercier encore une fois car je trouve admirable que quelqu'un prenne le temps de consacrer quelques instants pour corriger mon code et m'aider dans mon apprentissage!!

A bientôt!

je ne voyais pas l'utilité d'activer un évènement à des heures précises.

J'ai réalisé un montage de gestion d'une petite serre à orchidées (2mx2mx2m) avec une DUE + shield Ethernet et SD.
Dans ce cas, les consignes de température et d'hygrométrie varient de manière continue en fonction de l'heure de la journée (et même de la saison si on veut), pour recréer un climat donné (La Réunion par exemple). Un horloge est indispensable (DS1307, DS3231 ou DS3234 sur SPI).

Pour l'EEPROM, ne te tracasse pas, tu ne vas écrire les consignes que lorsqu'elles sont modifiées et validées par ton menu.

Le shield Ethernet+SD n'occupe que le bus SPI, plus les sorties 4 et 10 pour les CS (chip select).
C'est un bon choix, si tu veux enregistrer et transmettre des données.

l'ajout d'une RTC type DS1307 te permettrait aussi de sauvegarder les consignes dans les 56 bytes de NVRAM sans les inconvénients de l'usure EEPROM ...

Suite .. (mais pas fin?)

Concernant l'utilité de l'horloge, elle sera également indispensable pour horodater une transmission ou un enregistrement de données.

C'est bon je suis convaincu, maintenant ça me paraît indispensable, je vais me procurer une RTC... Aussi je trouve ça intéressant de pouvoir stocker quelques octets dans la NVRAM.

Par contre j'ai une question pour bilbo83, comment fonctionne ton système ? tu te calques sur le climat d'un lieu en temps réel ou par rapport à une base de données préétablie et tu peux choisir la saison que tu veux?

Je trouve que ton code est propre et bien commenté pour ma part.

Je développe actuellement exactement le même module, dans l'urgence j'ai fait quelques chose de simple avec deux relais néanmoins il y a 3 ans j'avais réalisé un truc plus complet, avec capteur et electrovane pour le CO2, capteur niveau de cuve, détecteur de fumée le tout relié à un serveur web récoltant toutes les x secondes les donnés émises sur le réseau par le module.

Si tu as des questions, ou envie d'en parler n'hésite pas à me contacter !

Bonjour,

Pour le climat, pas de temps reel, je fixe des consignes de température mini et maxi, qui vont évoluer avec l'heure de la journée (c'est une pseudo sinusoïde). Pour l'hygrométrie je peux fixer l'humidité absolue (gr/m3) qui va correspondre au climat le mieux adapté aux orchidées, mais ce n'est qu'un compromis parce qu'elles ne sont pas toutes de la même variété. La consigne d'humidité relative contrôlée par un brumisateur variera en fonction de la température ambiante et de l'hygrométrie absolue choisie.

Bonjour les gars!
Enchanté Elriri! Je suis content de pouvoir rencontrer des gens qui bossent sur les mêmes projets, chacun à ses méthodes et c'est vraiment enrichissant comme partage !

Bilbo83 -> Je comprends mieux maintenant ton système, c'est bien pensé! j'aimerais bien pouvoir carrément copier les données climatiques d'un lieu du globe pour les exploiter ici et ainsi de pouvoir définir des préréglages suivant le type de climat que l'on souhaite! Mais j'en suis encore loin, mon projet pousse comme une plante à croissance lente! Mais ce n'est pas grave encore deux trois petites choses à régler pour lancer un proto pour tester les fonctions de bases! les options viendront s'ajouter doucement..

Pour l'instant, je coince sur la fonction "Reset des Temp/Hygro Min/Max"..
Je voudrais que 'un appui long sur le poussoir de l'encodeur me fasse le reset des extrêmes mais j'ai beau retourner le code dans tous les sens celui ci ne fonctionne pas comme je voudrais..

Si je ne mets pas d'interruption sur le bouton poussoir, lors d'un appui long le reset se fait mais ça fait aussi défiler les menus à l'écran.
Si je mets une interruption sur le bouton poussoir, lors d'un appui long les menus ne défilent pas et le reset ne se fait pas..

Alors je commence à me demander si je ne vais pas ajouter un autre BP pour régler une fois pour toute mais ça m'énervera quand même de ne pas avoir trouvé la solution!

Mais dans tous les cas, je m'amuse et je prend beaucoup de plaisir à cogiter dessus!