automate pour terrarium

Bonjour a tous,

Alors avant tous, je tiens a préciser que je ne suis pas ici pour que l'on me fasse mon programme, juste que l'on m'aiguille pour résoudre mon problème pour apprendre et ne plus être embêter la prochaine fois.

Alors voila mon projet : automatiser un terrarium a dendrobates (petites grenouille tropicale, pour celles et ceux qui ne connaissent pas).

Je souhaite pouvoir gérer un fogger (machine a "brouillard") via un relais (mise en marche a heure prédéfinie dans le programme), une pompe de brumisation (pour simuler la pluie si je suis dire) également via un relais. Pour la brumisation, 2 capteurs de niveau dans la réserve d'eau, un qui indique (via une led rgb) le niveau d'eau (premier capteur en niveau haut, led verte allumé, niveau bas led rouge allumé, capteur au fond en bas, led rouge clignote et relais brumisation désactivé (sécurité pour éviter que la pompe ne tourne a vide).

Par la suite, je pense rajouter sonde de température et d'humidité pour gérer via l'arduino.

j'ai également prévu 2 boutons poussoir, pour pouvoir déclencher manuellement le fogger ou la pompe de brumisation.

Pour gérer le temps, j'ai un module RTC.

Maintenant que je vous ai présenter le projet, les problèmes.

  • J'ai essayer un programme trouver sur internet pour afficher la date et l'heure dans le moniteur série = OK.

  • J'ai créer mon programme (comme je l'avais fait pour gérer l'éclairage de mes aquarium via relais (un interrupteur qui commander 2 relais en ON/OFF) = sa ne fonctionne pas, appui sur les BP ne change rien du tous.

  • J'ai intégrer le programme pour l'heure dans mon programme, l'heure ne s'affiche qu'une seule fois dans le moniteur série, et affiche tous le temps l'heure a laquelle j'ai televerser le programme dans l'arduino (UNO).

Je vous joint mon programme, si quelqu'un pouvais m'aiguiller, parceque la je ne comprend vraiment pas.

Je precise également, que ma UNO et mes 2 shields relais se trouver sous mon aquarium, donc peut être sujet a l'humidité, et par conséquent défaillant.

Le plan de câblage est en cours de réalisation, je vous le poste dès que possible.

En vous remerciant.

//PROJET DE GESTION DE TERRARIUM POUR DENDROBATES VIA ARDUINO
//COMMANDE DU FOGGER ("MACHINE A FUMEE"), BRUMISATEUR (POMPE HAUTE PRESSION ET SPRINKLER) EN AUTOMATIQUE (HEURES DEFINIE VIA MODULE RTC) ET EN MANUEL VIA BOUTON POUSSOIR SUR PANNEAU DE CONTROLE
//SURVEILLANCE DU NIVEAU D'EAU DANS LA RESERVE DE BRUMISATION VIA 2 CAPTEURS DE NIVEAU (UN POUR LE NIVEAU BAS, UN POUR LA SECURITE (EMPECHE LA POMPE DE TOUNER SI PLUS D'EAU) ET INDICATION DE L'ETAT VIA LED RGB (ALLUMEE VERTE = NIVEAU D'EAU CORRECT, ALLUMEE ROUGE = NIVEAU D'EAU BAS, CLIGNOTE ROUGE = RESERVE VIDE, EMPECHE LA POMPE DE SE METTRE EN MARCHE)
//PAR LA SUITE, AJOUT DE CAPTEURS DE TEMPERATURE ET D'HUMIDITE POUR GESTION DU CHAUFFAGE/BRUMISATION EN FONCTION DES MESURES / VENTILATEUR POUR LA CONDENSATION/TEMPERATURE HAUTE (EN ETE) ET AFFICHAGE DES VALEURS SUR ECRAN LCD
//D'AUTRES OPTIONS VIENDRONT JE PENSE COMPLETE LE SYSTEME AU FUR ET A MESURE, COMME JE PENSE UN LECTEU NFC POUR POUVOIR DECLENCHER LE FOGGER / LA BRUMISATION EN MANUEL (EVITE QUE QUELQU'UN NE JOUE AVEC)
//L'ECLAIRAGE SERA GERER VIA UN TC420 (POUR TROP TROUVER COMMENT GERER LE PWM DE L'ARDUINO SANS FAIRE DE CIRCUIT COMPLEXE AUQUELS POUR ETRE FRANC JE NE COMPREND PAS GRAND CHOSE ET N'EST PAS TROP LE TEMPS POUR L'INSTANT, MAIS PAR LE SUITE, POURQUOI PAS

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

const int BP_FOGGER=1;
const int BP_BRUMI=2;
const int RELAIS_FOGGER=3;
const int RELAIS_BRUMI=4;
const int CAPTEUR_NIVEAU_BRUMI=5;
const int CAPTEUR_STOP_BRUMI=6;
const int LED_ROUGE_BRUMI=7;
const int LED_VERTE_BRUMI=8;

void setup () {

Serial.begin(57600); //Démarrage de la communication
Wire.begin(); //Démarrage de la librairie wire.h
RTC.begin(); //Démarrage de la librairie RTClib.h

//Met à l'heure à date à laquelle le programme est compilé

RTC.adjust(DateTime(DATE, TIME));

pinMode (BP_FOGGER, INPUT_PULLUP);
pinMode (BP_BRUMI, INPUT_PULLUP);
pinMode (CAPTEUR_NIVEAU_BRUMI, INPUT_PULLUP);
pinMode (CAPTEUR_STOP_BRUMI, INPUT_PULLUP);
digitalWrite (BP_FOGGER, HIGH);
digitalWrite (BP_BRUMI, HIGH);
digitalWrite (CAPTEUR_NIVEAU_BRUMI, HIGH);
digitalWrite (CAPTEUR_STOP_BRUMI, HIGH);
pinMode (RELAIS_FOGGER, OUTPUT);
pinMode (RELAIS_BRUMI, OUTPUT);
pinMode (LED_ROUGE_BRUMI, OUTPUT);
pinMode (LED_VERTE_BRUMI, OUTPUT);

}

void loop() {

//Affichage de l'heure dans le moniteur serie (pour essai fonctionnement ou verification)

DateTime now = RTC.now();
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
delay(3000);

// DECLENCHEMENT AUTOMATIQUE FOGGER

// A 6H50 PENDANT 10 MINUTES

if(now.hour() == 6 && now.minute() == 50) {
digitalWrite(RELAIS_FOGGER,1);
delay(1000000);
digitalWrite(RELAIS_FOGGER,0);
}

// A 23H00 PENDANT 10 MINUTES

if(now.hour() == 23 && now.minute() == 00) {
digitalWrite(RELAIS_FOGGER,1);
delay(1000000);
digitalWrite(RELAIS_FOGGER,0);
}

// DECLENCHEMENT AUTOMATIQUE BRUMISATION

// A 8H15 PENDANT 8 SECONDES

if(now.hour() == 8 && now.minute() == 15) {
digitalWrite(RELAIS_BRUMI,1);
delay(8000);
digitalWrite(RELAIS_BRUMI,0);
}

// A 14H15 PENDANT 8 SECONDES

if(now.hour() == 14 && now.minute() == 15) {
digitalWrite(RELAIS_BRUMI,1);
delay(8000);
digitalWrite(RELAIS_BRUMI,0);
}

// A 20H15 PENDANT 8 SECONDES

if(now.hour() == 20 && now.minute() == 15) {
digitalWrite(RELAIS_BRUMI,1);
delay(8000);
digitalWrite(RELAIS_BRUMI,0);
}

// DECLENCHEMENT MANUEL FOGGER PENDANT 10 MINUTES

if(digitalRead(BP_FOGGER)==1) {
digitalWrite(RELAIS_FOGGER,1);
delay(1000000);
digitalWrite(RELAIS_FOGGER,0);
}

// DECLENCHEMENT MANUEL BRUMISATION PENDANT 8 SECONDES

if(digitalRead(BP_BRUMI)==1) {
digitalWrite(RELAIS_BRUMI,1);
delay(8000);
digitalWrite(RELAIS_BRUMI,0);
}

// ALLUMAGE LED VERTE NIVEAU D'EAU OK BRUMISATION

if(digitalRead(CAPTEUR_NIVEAU_BRUMI)==1) {
digitalWrite(LED_VERTE_BRUMI,1);
digitalWrite(LED_ROUGE_BRUMI,0);
}

// ALLUMAGE LED ROUGE NIVEAU D'EAU BAS BRUMISATION

if(digitalRead(CAPTEUR_NIVEAU_BRUMI)==0) {
digitalWrite(LED_ROUGE_BRUMI,1);
digitalWrite(LED_VERTE_BRUMI,0);
}

// SECURITE RESERVE BRUMISATION VIDE (COUPE LE RELAIS DE BRUMISATION ET FAIS CLIGNOTER LA LED ROUGE)

if(digitalRead(CAPTEUR_STOP_BRUMI)==1) {
digitalWrite(RELAIS_BRUMI,0);
digitalWrite(LED_ROUGE_BRUMI,1);
delay(1000);
digitalWrite(LED_ROUGE_BRUMI,0);
delay(1000);
digitalWrite(LED_ROUGE_BRUMI,1);
delay(1000);
}

}

Bonjour,

Avec la petite expérience que j'ai ::slight_smile: , il me semble qu 'il faut impérativement éviter les delay pour te servir de tempo.

Tu bloques ainsi ton programme et si tu fais une action (bouton par exemple) Elle n'est pas prise en compte.

Pour vérifier le fonctionnement de tes boutons, j' essaierai uniquement cette partie de programme en affichant sur le port série l'état de tes entrées pour vérifier si elles changent lors d'un appui. Par ailleurs à tu mis des résistance de tirage ?

Bon courage

Bonjour,

Alors voila, je me creuse la tete depuis que j'ai poster le message, et j'ai trouver une partie de la solution à mon problème.

Deja, j'ai supprimer les delay pour les déclenchements automatiques, je me sers de l'horloge pour activer mes relais pendant 10 minutes ou 8 secondes selon l'équipement, ce qui empêche le blocage du programme, il n'y a que pour les déclenchements manuels que je n'ai pas encore trouver comment faire.

Maintenant mon soucis : pour mon horloge, le code est rester le même, cela fonctionne, sauf que quand je débranche l'arduino (le pile dans le RTC est neuve je viens de la changer), quand je le rebranche, dans le moniteur serie, l'heure est toujours celle a laquelle j'ai compilé mon programme.

Si tu peut m'aider...

tiotjordan:
Bonjour a tous,

Alors avant tous, je tiens a préciser que je ne suis pas ici pour que l'on me fasse mon programme, juste que l'on m'aiguille pour résoudre mon problème pour apprendre et ne plus être embêter la prochaine fois.

Alors voila mon projet : automatiser un terrarium a dendrobates (petites grenouille tropicale, pour celles et ceux qui ne connaissent pas).

Bonsoir
tu a lu ce topic ? 8)

tiotjordan:
Maintenant mon soucis : pour mon horloge, le code est rester le même, cela fonctionne, sauf que quand je débranche l'arduino (le pile dans le RTC est neuve je viens de la changer), quand je le rebranche, dans le moniteur serie, l'heure est toujours celle a laquelle j'ai compilé mon programme.

Si tu peut m'aider...

Bonjour,
Il faut que tu commente cette ligne dans le setup: RTC.adjust(DateTime(DATE, TIME));

Une fois l'heure réglé dans ton RTC tu commente cette ligne car c'est elle qui reprend la date et l'heure de la dernière compilation à chaque démarrage (quand tu rebranche).

Perso, j'avais fais un code qui ne servait qu'à régler l'heure de la sorte.

Artouste:
Bonsoir
tu a lu ce topic ? 8)

Oui, j'avais vu ce topic, mais cela ne correspondais pas a mon problème.

Zarb94:
Bonjour,
Il faut que tu commente cette ligne dans le setup: RTC.adjust(DateTime(DATE, TIME));

Une fois l'heure réglé dans ton RTC tu commente cette ligne car c'est elle qui reprend la date et l'heure de la dernière compilation à chaque démarrage (quand tu rebranche).

Perso, j'avais fais un code qui ne servait qu'à régler l'heure de la sorte.

Salut,

Merci de ton aide, sa fonctionne, impeccable.

Maintenant, quand je veut activer mes relais en manuel, la brumisation dure 8 secondes, mais le fogger (brouillard) lui, dure 10 minutes.

A part en utilisant delay(), comment puis-je faire pour qu'il me récupère l'heure actuelle, qu'il ajoute 8 secondes ou 10 minutes suivant le relais, sans bloquer mon programme ?

Je cherche depuis hier chez moi, au boulot a mes pauses... mais rien trouver...

Merci d'avance.

Bonjour a tous,

je me permet de déterrer mon post.

Ayant trouver la solution a mon soucis précédent, j'ai maintenant un autre soucis : j'ai améliorer mon programme, et ai ajouter un DHT22 et un relais, qui commande mon tapis chauffant.

Jusque la, tous va bien, j'ai fait mon programme, sa fonctionne super en automatique ou en manuel, sauf le chauffage. En effet, la température devant être au alentour de 26°C, j'ai donc fais mon code comme ceci :

//ARRET TAPIS CHAUFFANT SI T>27°C

if (t > 27) {
digitalWrite(RELAIS_TAPIS_CHAUFFANT,LOW);
digitalWrite(LED_BLEUE_TAPIS_CHAUFFANT,LOW);
}

//DECLENCHEMENT TAPIS CHAUFFANT SI T<25°C

if (t < 25) {
digitalWrite(RELAIS_TAPIS_CHAUFFANT,HIGH);
digitalWrite(LED_BLEUE_TAPIS_CHAUFFANT,HIGH);
}

Or, sa fonctionne, ma led bleue s'allume quand le tapis est en marche, dans le moniteur serie j'ai bien ma température et mon hygrométrie (j'attend ma Mega pour ajouter mon écran, le code est OK, j'ai fait un test juste écran et DHT22), mon chauffage tourne nickel, et d'un coup, mon relais se met a "clignoter" toutes les 5 secondes.

Je precise que le terra est chez ma copine, je ne le vois donc pas en permanence, et comme par hasard, je bug tous le temps quand je n'y suis pas (le PC étant avec moi, elle ne peut pas voir la valeur mesurée par la sonde.

Est ce que quelqu'un aurait une idée de ou peut venir mon problème ?

En vous remerciant.

hello
comme tu le décrit, je dirais que ta sonde est trop près de la résistance
tu dois avoir un problème d'inertie

J'ai oublier de préciser, ma sonde est tout en haut de mon terrarium, et mon tapis chauffant est en dessous, sois a environ 45cm d'écart...

J'y vais demain, je verrais via le moniteur serie les valeurs de la sonde.

Autre question, j'ai vu a different endroit sur internet que le câblage de la DHT22 est le suivant :

pin 1 VCC sur 5v
pin 2 DATA sur entrée digital, avec une résistance entre celle ci et VCC
pin 3 non utilisé
pin 4 GND

Or, câblée comme ça, sa ne fonctionne pas, dans le moniteur serie, je n'ai que des caractères anarchiques, en revanche, en la branchant sur une entrée analogique, sa fonctionne parfaitement. Idem pour la résistance, si je met une resistance de 10Ko entre la pin 2 DATA et la pin 1 VCC, sa ne fonctionne pas, sans, sa fonctionne...

Bonsoir;

Il me semble avoir lu dans ton code que tu avais défini les entrée en INPUT_PULLUP.
La résistance de pullup interne aux entrés arduino, quand elle est utilisée, est de 20K entre l'entrée arduino et le 5V arduino).

Dans le montage que tu décrit tu indique que tu mets une résistance de pullup externe supplémentaire entre l'entrée arduino et le 5V.

Il y a donc 2 résistances de pullup en // ça ne devrait pas gêner en principe (sauf que 10//20=6.7k)

Pour être logique, utilise les résistance de pullup que préconise le fabricant du capteur, et définit ton entrée en INPUT tout simplement (sans le PULLUP).

J'ai lu 1K ici https://www.gotronic.fr/pj-1052.pdf, 4.7k ailleurs, et même encore plus loin qu'elle n'était pas utile car déja présente sur le capteur !!!

Bonjour,

Pour la résistance, le capteur ayant été acheté sur E***, je ne sais pas... Sans résistance, pas de soucis, je vais laisser comme sa, les valeurs semblent cohérentes (je mettrais peut être un thermo/hygromètre en securité pour contrôler).

Pour ce qui est de mon soucis de "commande", j'ai trouver le soucis : en fait, quand la température est en dessous de 25, j'active mon relais, mais dès qu'il arrive a 25, il se coupe, et avec l'intertie (24,9, 25, 24,9, 25, 24,9, ...), mon relais "clignote".

Aurait tu par hasard une solution a me proposer, j'ai essayer plein de trucs, mais pas moyen...

Après, est ce que si je branche mon tapis chauffant direct sur une prise, de manière a augmenter la température du terra, et que quand j'arrive vers 26, je le branche sur mon relais, est ce que sa pourrait le faire (si <=25, active le relais, si >= a 27, coupe le relais) ?

En te remerciant.

Bonjour;

Il faut toujours introduire un hystérésis dans une commande à relais car effectivement si tu a une faible inertie, dés que tu va couper ton chauffage, la temp va baisser et le chauffage se réenclencher.

Donc tu ne peux pas avec une commande TOUT ou RIEN (ON / OFF) faire une régulation précise et stable, il te faut forcément une valeur mini en DESSOUS de laquelle tu chauffe et une valeur maxi AU DESSUS de laquelle tu arrête de chauffer, et selon l'inertie de ton système quelques degré de différence entre maxi et mini, sinon ton relais faire faire du bagotage permanent ...

Bonjour,

Si j'ai bien compris ce que je viens de lire en cherchant ce qu'est l'hystérésis,Tu veut dire que si je fais mon programme comme ceci :

//ARRET TAPIS CHAUFFANT SI T = 27°C

if (t < (26 + 1)) {
digitalWrite(RELAIS_TAPIS_CHAUFFANT,LOW);
digitalWrite(LED_BLEUE_TAPIS_CHAUFFANT,LOW);
}

//DECLENCHEMENT TAPIS CHAUFFANT SI T = 25°C

if (t > (26 - 1)) {
digitalWrite(RELAIS_TAPIS_CHAUFFANT,HIGH);
digitalWrite(LED_BLEUE_TAPIS_CHAUFFANT,HIGH);
}

cela fonctionnera normalement ?

En te remerciant.

Bonjour,

C'est presque ça mais il faut faire les tests dans le bon sens

     //ARRET TAPIS CHAUFFANT SI T > 27°C
     if (t > (26 + 1)) {
       digitalWrite(RELAIS_TAPIS_CHAUFFANT,LOW);
       digitalWrite(LED_BLEUE_TAPIS_CHAUFFANT,LOW);
     }
     
       //DECLENCHEMENT TAPIS CHAUFFANT SI T < 25°C
     if (t < (26 - 1)) {
       digitalWrite(RELAIS_TAPIS_CHAUFFANT,HIGH);
       digitalWrite(LED_BLEUE_TAPIS_CHAUFFANT,HIGH);
     }

Bonjour,

Oups, me suis planté.

Merci bien j'essaye sa demain et reviens vers vous pour vous tenir au courant.

Bonjour a tous,

Désolé, j'ai eu des petits imprévus, qu ont fait que je n'ai pas pu essayer en temps voulu. Donc, j'ai fait le test en mettant un hysteresis, et sa fonctionne, j'y avais oensé, mais pas essayé.

Merci beaucoup, mon automate est opérationnel avec les fonctions suivantes :

  • Brumisation automatique de 10 secondes toutes les 4h
  • Fogger automatique pendant 10 minutes 3 fois par jour
  • Brumisation manuelle de 10 secondes lors de l'appui sur le bouton "Brumisation manuelle"
  • Fogger manuel pendant 10 minutes lors de l'appui sur le bouton "Fogger manuel"
  • Un bouton "annulation" relier au reset de la carte pour annulé lorsque l'on a lancer le fogger (pas trouver d'autre fonction que Delay, mais je vais continuer a chercher)
  • Controle de la temperature via un DHT22, qui enclenche mon relais sur lequel sont relié 2 tapis chauffants (un de 14w sous le terra et un de 28w collé sur la vitre arrière ( a l'extérieur ) (je contrôle juste l'hygrométrie, je ne la pilote pas, elle est a 99,9% en permanence, surement de l'eau sur la sonde, va falloir je vois sa)
  • Affichage de la date et heure sur la première ligne de l'écran LCD et de la température et de l'hygrométrie sur la deuxième
  • Controle du niveau d'eau de brumisation via un capteur de niveau dans la réserve (allumage d'une LED RGB verte sur le panneau de contrôle si niveau OK, LED RGB rouge si niveau pas et coupe le relais (empêche la pompe de tourner a sec)
  • Controle de la marche sur tapis chauffant via une LED bleue (allumage si tapis chauffant en marche, éteinte si tapis chauffant a l'arrêt)

Mon projet évoluera surement encore.

Encore merci a tous.

Parfait;

On peux voir des photos de la machine STP?

Oui, je pourrais en posté, mais je ne pourrais pas faire les photos avant se week-end.

Par contre, l'arduino Mega 2560 et le module RTC sont dans une boite de dérivation, et ne sont pas visible, seul l'écran et les 3 boutons poussoirs "sorte" du couvercle.