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