Gestion Terrarium

a marqué ce sujet comme résolu.

Bonjour à tous, mon fils se passionne pour les lézards, il en a un (un gecko léopard ), mais là il veut 2 autres bestioles qui sont des Tribolonotus Gracilis. ces animaux vivent dans un milieu humide et chaud, donc : Achat d’un terrarium et utilisation d’un Arduino Nano pour en faire la gestion qui consiste :

  • gestion de la température via une lampe chauffante et gestion de la consigne selon le jour ou la nuit
  • Gestion de la lampe UV selon jour ou nuit
  • Gestion de la pulvérisation d’eau. 3s de pulvérisation toutes les 20min. (je cherche une humidité de contact et non pas un air humide). Matériel : Arduino Nano, sortie relais, afficheur 4x20, sonde de température DS18B20, horloge DS3231.

Tout fonctionne MAIS… (ben oui y a un mais) je ne sais pas pourquoi mais le programme s’arrête. Et je tourne en rond. Or si je ne résous pas ce problème, je ne peux y mettre les lézards. Utilisation de la fonction millis pour gérer le temps de pulvérisation et temps d’attente.

le code complet ci-dessous, merci pour votre aide

/Libraries
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <Wire.h> 
#include <RTClib.h> 
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>

RTC_DS3231 rtc;

LiquidCrystal_I2C lcd(0x27, 20, 4);  // set the LCD address to 0x27 for a 20 chars and 4 line display

# define DHTPIN 2                    // Sonde DTH22 câblée broche 2
# define DHTTYPE DHT22

DHT_Unified dht(DHTPIN, DHTTYPE);

uint32_t delayMS;

//Variables
byte Year ;
byte Month ;
byte Date ;
byte DoW ;
byte Hour ;
byte Minute ;
byte Second ;
byte HOUR_J = 8;   // Seuil horaire jour
byte HOUR_N = 18;  // Seuil horaire nuit
byte SP_C;         // Consigne température pour afficheur
byte SP_J = 27;    // Consigne température jour
byte SP_N = 23;    // Consigne température nuit
bool Century = false;
bool h12 ;
bool PM ;
bool J ;          // Bit de jour
bool N ;          // Bit de nuit


// Variables mise à jour de la plage horaire
  int Bp; int MaJ; int Flag; int Vo; int Lig; int Sel; ; int Col; int Val; int Max; int Cur; int CurLig;
  // Table evenements chaque ligne correspond à une voie. Sur la ligne, on trouve H depart, M depart, H arret,M arret...
  int TabEvt [1][4] =
  {
  {8, 0, 19, 0},
   };

#define ONE_WIRE_BUS 7               // Sonde DS18B20 câblée broche 7

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

unsigned long currentTime=0;
unsigned long previousTime=0;
unsigned long interval, interval1=3000, interval2=1200000;
bool pulver=LOW;
// interval2 --> Attente entre 2 pulv
// interval1 --> Temps de pulverisation

void setup() 
{
  lcd.init();       // initialisation de l'afficheur}
  Wire.begin();
  dht.begin();
  sensors.begin();  // DS18B20
  rtc.begin();
  
  // Print temperature sensor details. (DTH22)
  sensor_t sensor;
  dht.temperature().getSensor(&sensor);
  
  // Print humidity sensor details.    (DTH22)
  dht.humidity().getSensor(&sensor);

  // Set delay between sensor readings based on sensor details.
  delayMS = sensor.min_delay / 1000;

  //configurer les bornes 4,8 et 12 en sortie
   pinMode(4,OUTPUT);   // Cde éclairage
   pinMode(8,OUTPUT);   // Cde chauffage
   pinMode(12,OUTPUT);  // Cde pompe

   currentTime=millis();
}

void loop() 
{
  // Print a message to the LCD.
  lcd.backlight();

  DateTime now = rtc.now(); // on lit l’heure dans l’instance now 
/* function readRTC */
////Read Real Time Clock
lcd.setCursor (1,0);
lcd.print(now.year());
lcd.print("-");
lcd.print(now.month());
lcd.print("-");
lcd.print(now.day());
lcd.print(" ");
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
 delay(3000);

// Gestion éclairage
// Rechercher si heure actuelle est dans dans la plage horaire de la voie 2
    if (now.hour() >= TabEvt [0][0] && now.hour() <= TabEvt [0][2] ) 
      {
       digitalWrite(4,HIGH);   // Cde éclairage activée
       J = true;             // Bit de jour actif
       N = false;              // Bit de nuit INactif
       }   
       else
      {
       digitalWrite(4,LOW);  // Cde éclairage desactivée
       J = false;             // Bit de jour inactif
       N = true;             // Bit de nuit actif
       }    
            
  if (J == 1) //  heure de jour
      {
       SP_C = SP_J;       // Affichage consigne température active
       }
  if (N == 1) // heure du nuit 
      {
        SP_C = SP_N;       // Affichage consigne température active
      }
  
  // Delay between measurements.
  //  delay(delayMS);
  // On récupere la température de l'air (DTH22)
    sensors_event_t event;

  // On récupere la température de l'air (DS18B20)
      sensors.requestTemperatures(); 
      lcd.setCursor(0, 1);
      lcd.print(sensors.getTempCByIndex(0));     
      lcd.setCursor(6, 1);
      lcd.print("Deg");
      lcd.setCursor(11, 1);
      lcd.print("CONS :");
      lcd.setCursor(17, 1);
      lcd.print(SP_C);           
   //Gestion des commandes de chauffage
   if ((J == 1 && sensors.getTempCByIndex(0)<SP_J) || (N == 1 && sensors.getTempCByIndex(0)<SP_N))  // Si bit de jour et température inférieur consigne de jour
    {
     digitalWrite(8,HIGH); // Cde chauffage activée
    }
   if ((J == 1 && sensors.getTempCByIndex(0)>=28) || (N == 1 && sensors.getTempCByIndex(0)>=24))  // Si bit de jour et température inférieur consigne de jour
    {
     digitalWrite(8,LOW); // Cde chauffage désactivée
    }
   //Gestion des commandes de pulverisation
       if (pulver)
        {
          interval=interval2;
        }
        else
        {
            interval=interval1;
        }
        if ((currentTime-previousTime)>interval)
        {
            previousTime=currentTime;
            pulver=!pulver;
            digitalWrite(12,!pulver);
        }
  }   

Bonjour,

Je ne vois pas d’actions bloquantes dans ce code. Il faudrait ajouter des traces pour voir quand ça bloque.

Par contre la pulvérisation ne peut pas marcher car currentTime n’est pas relue dans la loop(). Il faut y rajouter currentTime=millis();

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte