Go Down

Topic: automate pour terrarium (Read 584 times) previous topic - next topic

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

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);
     }
     
     }

     
     

lpg79

Bonjour,

Avec la petite expérience que j'ai  ::) ,  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

tiotjordan

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

Artouste

#3
Jul 23, 2017, 10:35 pm Last Edit: Jul 23, 2017, 10:36 pm by Artouste
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)

Zarb94

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.

tiotjordan

Bonsoir
tu a lu ce topic ?  8)
Oui, j'avais vu ce topic, mais cela ne correspondais pas a mon problème.

tiotjordan

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.

tiotjordan

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.

dfgh

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

tiotjordan

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

jeanfranlec

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


tiotjordan

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.

jeanfranlec

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


tiotjordan

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.

kamill

#14
Aug 17, 2017, 07:21 pm Last Edit: Aug 17, 2017, 07:22 pm by kamill
Bonjour,

C'est presque ça mais il faut faire les tests dans le bon sens
Code: [Select]

     //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);
     }

Go Up