//*******************************************************//
// GESTION CENTRALISEE D'UN AQUARIUM //
//*******************************************************//
// Ajout n°1 : sonde DHT22 (température et humidité) //
// cette sonde doit être remplacée par le //
// le capteur BME280 qui est beaucoup plus précis // //
//-------------------------------------------------------//
// Ajout n°2 : 3 sondes DS18B20 (capteur de température) //
// étanches //
// Le code en commentaire dans la procédure "SETUP" doit //
// être gardé afin de connaître l'adresse des 3 sondes //
// sur le port qui devront être ensuite mise dans la //
// partie "intenciation des objets" dans "DeviceAddress" //
//-------------------------------------------------------//
// Ajout n°3 : Module RTC //
// Gérer date et heure système //
//*******************************************************//
//intégration des includes
//========================================================
//ajout n°1 : debut
//Ajouter bibliothèque Adafruit DHT
#include <DHT.h>
//ajout n°1 : fin
//ajout n°2 : debut
//ajout des librairies pour les sondes Dallas DS18B20
#include <DallasTemperature.h>
#include <OneWire.h>
//ajout n°2 : fin
//ajout n°3 : début
#include <RTClib.h>
#include <Wire.h>
//ajout n°3 : fin
//définition des PINs
//=========================================================
#define pinEcho 11 //pin ECHO du capteur à ultrason
#define pinTrig 12 //pin TRIG du capteur à ultrason
//ajout n°1 : debut
#define pinDHT22 A0 //pin DATA du capteur DHT22
//ajout n°1 : fin
//ajout n°2 : debut
#define pinDS18B20 7 //pin DATA des 3 sondes Dallas DS18B20
//ajout n°2 : fin
//définition des constantes
//=========================================================
//ajout n°1 : debut
//définir le type de capteur
#define typeDHT DHT22
//ajout n°1 : fin
//ajout n°2 : debut
#define precision 12 //oneWire precision reference to Dallas Temperature DS18B20
//définition des variables
//=========================================================
long duree;
float distance;
//ajout n°1 : debut
float vitesse_son;
float temperature;
float temperature_ressentie;
float humidite;
//ajout n°1 : fin
//ajout n°2 : debut
//int compteur_sonde = 0; //compteur des sondes Dallas DS18B20
float tempHaut;
float tempMilieu;
float tempBas;
//ajout n°2 : fin
//intenciation des objets
//=========================================================
//ajout n°1 : debut
//instenciation d'un objet dht
DHT dht(pinDHT22, typeDHT);
//ajout n°1 : fin
//ajout n°2 : debut
//intenciation des 3 sondes DS18B20
OneWire capteursDS18B20(pinDS18B20);
DallasTemperature sensors(&capteursDS18B20);
DeviceAddress sondeHaut = {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB};
DeviceAddress sondeMilieu = {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB};
DeviceAddress sondeBas = {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB};
//ajout n°2 : fin
//ajout n°3 : debut
RTC_DS1307 rtc_ds1307;
//ajout n°3 : fin
//=========================================================
//initialisation du programme
//=========================================================
void setup()
{
//code à activer pour déterminer les adresses des sondes Dallas DS18B20
//une fois les adresses des sondes DS18B20 identifiées,
// les indiquées dans les lignes "DeviceAddress" plus haut
//byte stockage[8];
//int compt = 0;
//Serial.begin(115200);
//sensors.begin();
//Serial.print("Nbre Sondes détectées : ");
//Serial.print(sensors.getDeviceCount(), DEC);
//Serial.println(" capteurs DS18B20");
//Serial.println ("Retrouver l'adressage d'une sonde DS18B20");
//Serial.println ("==========================================");
//delay (1000);
//while (capteursDS18B20.search(stockage) == true);
//{
// for (int i = 0; i < 8; i++) { // l'adresse renvoyée par la fonction search est stockée sur 8 octets
// if (stockage[i] < 16)
// Serial.print('0');
// Serial.print ("");
// Serial.print(stockage[i], HEX);
// Serial.print(" ");
// }
//}
//initialisation du port série
Serial.begin(115200);
//attente de la connection série avec l'Arduino
while (!Serial);
//ajout n°3 : debut
//lancement de la communication I2C avec le module RTC et attente
// que la connection soit opérationnelle
while ( ! rtc_ds1307.begin()) {
Serial.println("Attente du module RTC...");
delay(1000);
}
// Mise à jour de l'horloge RTC avec la date et heure CPU
// au moment de la compilation
rtc_ds1307.adjust(DateTime(F(__DATE__), F(__TIME__)));
//Serial.println("Horloge du module RTC mise à jour");
//ajout n°3 : fin
//ajout n°3 : début
//récupération de la date et heure
DateTime now = rtc_ds1307.now();
affiche_date_heure(now);
// char heure[10];
//affichage de la date et heure retournée par le module RTC
// Note : le %02d permet d'afficher les chiffres sur 2 digits (01, 02,...)
// sprintf(heure, "Il est %02d:%02d:%02d", now.hour(), now.minute(), now.second());
// Serial.println(heure);
//ajout n°3 : fin
//configuration de l'entrée/sortie du capteur ultrason
pinMode(pinEcho, INPUT);
pinMode(pinTrig, OUTPUT);
//ajout n°1 : debut
//initialisation du capteur DHT
dht.begin();
//ajout n°1 : fin
//ajout n°2 : debut
sensors.begin();
//on fixe la précision des 3 sondes Dallas DS18B20 à 9 bits
sensors.setResolution(sondeHaut, precision);
sensors.setResolution(sondeMilieu, precision);
sensors.setResolution(sondeBas, precision);
//ajout n°2 : fin
}
//=========================================================
//boucle principale
//=========================================================
void loop() {
//ajout n°3 : début
//récupération de la date et heure
// DateTime now = rtc_ds1307.now();
// char heure[10];
//affichage de la date et heure retournée par le module RTC
// Note : le %02d permet d'afficher les chiffres sur 2 digits (01, 02,...)
// sprintf(heure, "Il est %02d:%02d:%02d", now.hour(), now.minute(), now.second());
// Serial.println(heure);
// affiche_date_heure(now);
//ajout n°3 : fin
//on déclare une mesure de distance
//initialiser le pinTrig à LOW pendant 5 microsecondes
digitalWrite(pinTrig, LOW);
delayMicroseconds(5);
//déclencher le pinTrig ) HIGH pendant 10 microseocndes
digitalWrite(pinTrig, HIGH);
delayMicroseconds(10);
//remettra le pinTrig à LOW
digitalWrite(pinTrig, LOW);
//lecture de la durée de l'écho ultrason (longueur de l'impulsion) en microsecondes
duree = pulseIn(pinEcho, HIGH);
//ajout n°1 : debut
//lecture de l'humidité
humidite = dht.readHumidity();
//lecture de la température
temperature = dht.readTemperature();
//calcul de la température ressentié
temperature_ressentie = dht.computeHeatIndex(temperature, humidite, false); //False pour dire qu'on en en Celcius
//ajout n°1 : fin
Serial.println("=============================");
Serial.print("Durée = ");
Serial.print(duree);
Serial.println(" ms");
//ajout n°1 : debut
//affichage de l'humidité
Serial.print("Humidité = ");
Serial.print(humidite);
Serial.println(" %");
//affichage de la température
Serial.print("Température = ");
Serial.print(temperature);
Serial.println(" °C");
//affichage de la température ressentie
Serial.print("Température ressentie = ");
Serial.print(temperature_ressentie);
Serial.println(" °C");
//ajout n°1 : fin
//si le temps est > 25000 ms
if (duree > 25000) {
Serial.println("Echec de la mesure");
}
else {
//diviser le temps par 2 car le signal fait un aller/retour
duree = duree / 2;
//ajout n°1 : debut
//calculer la vitesse du son en fonction de la température
vitesse_son = 331,3 + ( 0,606 * temperature );
//ajout n°1 : fin
//calcule de la distance en cm
//ajout n°1 : debut
// distance = duree * 340 / 10000;
distance = duree * vitesse_son / 10000;
//ajout n°1 : fin
//affichage de la distance
Serial.print("Distance = ");
Serial.print(distance);
Serial.println(" cm");
//ajout n°1 : debut
//affichage de la vitesse du son
Serial.print("Vitesse son = ");
Serial.print(vitesse_son);
Serial.println(" m/s");
//ajout n°1 : fin
}
//ajout n°2 : debut
//commande de lecture de la température sur toutes les sondes Dallas DS18B20
sensors.requestTemperatures();
//récupération de la température sur la sonde en haut de l'aquarium
tempHaut = sensors.getTempC(sondeHaut);
//récupération de la température sur la sonde au milieu de l'aquarium
tempMilieu = sensors.getTempC(sondeMilieu);
//récupération de la température sur la sonde en bas de l'aquarium
tempBas = sensors.getTempC(sondeBas);
//ajout n°2 : fin
//ajout n°2 : debut
//affichage de la température de la sonde Dallas DS18B20 du haut de l'aquarium
Serial.print("T° aquarium Haut : ");
Serial.print(tempHaut);
Serial.println("°C");
//affichage de la température de la sonde Dallas DS18B20 du milieu de l'aquarium
Serial.print("T° aquarium Milieu : ");
Serial.print(tempMilieu);
Serial.println("°C");
//affichage de la température de la sonde Dallas DS18B20 du bas de l'aquarium
Serial.print("T° aquarium Bas : ");
Serial.print(tempBas);
Serial.println("°C");
//ajout n°2 : fin
//attente de 1 seocnde
delay(2000);
}
//Ajout n°3 : début
//procédure pour afficher la date et l'heure
//==========================================
void affiche_date_heure(DateTime datetime) {
String jour = donne_jour_semaine(datetime.dayOfTheWeek())
+ " "
+ Vers2Chiffres(datetime.day())
+ "/"
+ Vers2Chiffres(datetime.month())
+ "/"
+ String(datetime.year(), DEC);
String heure = " ";
heure = Vers2Chiffres(datetime.hour())
+ ":"
+ Vers2Chiffres(datetime.minute())
+ ":"
+ Vers2Chiffres(datetime.second());
Serial.print("Date : ");
Serial.print(jour);
Serial.print(", Heure : ");
Serial.print(heure);
Serial.println(".");
}
//Procédure permettant d'afficher les nombres sur 2 chiffres
String Vers2Chiffres(byte nombre) {
String resultat = "";
if ( nombre < 10 ) {
resultat = "0";
}
return resultat += String(nombre, DEC);
}
//procédure convertissant le numéro du jour de la semaine en jour de la semaine
String donne_jour_semaine(uint8_t j) {
switch (j) {
case 0: return "Dimanche";
case 1: return "Lundi";
case 2: return "Mardi";
case 3: return "Mercredi";
case 4: return "Jeudi";
case 5: return "Vendredi";
case 6: return "Samedi";
default: return " ";
}
}
//ajout n°3 : fin