Serre à semis

Labricole14
jeu, 02/16/2017 - 13:35
Bonjour,
J'ai commencé un programme pour piloter ma serre, qui actuellement fonctionne avec 2 thermostats électronique du type STC100.
Un thermostat commande le chauffage pour maintenir la température a 20° C.
L'autre me sert a piloter le vérin électrique qui ouvre la porte en grand quand T > 25°.
Ce vérin est équipé de 2 fins de courses qui coupe l'alimentation électrique dans les 2 positions extrêmes.
Et la referme quand T< --°
La carte "ARDUINO MEGA 2560" que je compte utiliser pour ouvrir la porte mais par palier.
Quand T > 25° C je donne un ordre ouverture pendant 5 secondes, je temporise 1 minutes pour laisser le temps à la température de se stabiliser et je reprend la boucle.
J'ai commencé ce code en utilisant mes recherche sur le Net.
//*****************************************************************************************************
#include <OneWire.h> // Inclusion de la librairie OneWire
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 2 // Broche utilisée pour le bus 1-Wire
#define relayChauffage 4 // Commande la résistance de chauffage
#define relayOuverture 5 // Commande ouverture de la porte
#define relayFermeture 6 // Commande la fermeture de la porte
#define relayPompe 7 // Démarre la pompe d'arrosage - Attente capteur humidité sol
#define relayBrumiseur 8 // Commande le brumisation piezzo pour l'engrais - Attente Horloge
#define buzzerPin 9 // Le buzzer sur 9
#define relayEclairage 10 // Commande la lumière - Attente cordon leds
#define tempBasse 20.5 // temp déclenchement allumage
#define tempHaute 25.0 // temp déclenchement extinction
#define alerteBasse 18.0 // temp déclenchement alerte basse buzzer
//#define alerteHaute 30.0 // temp déclenchement ouverture porte en grand
#define alerteHaute 35.0 // temp déclenchement buzzer
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
boolean etatChauffe; // attention : boolean etatChauffe = false.
boolean etatOuverture; // attention : boolean etatOuverture = false.
boolean etatFermeture; // attention : boolean etatFermeture = false.
// ne provoque pas d'erreur
// mais ne fonctionne pas.
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp) {
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté
if (!ds.search(addr)) { // Recherche un module 1-Wire
ds.reset_search(); // Réinitialise la recherche de module
return false; // Retourne une erreur
}
if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
return false; // Si le message est corrompu on retourne une erreur
if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
return false; // Si ce n'est pas le cas on retourne une erreur
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0x44, 1); // On lance une prise de mesure de température
delay(800); // Et on attend la fin de la mesure
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0xBE); // On envoie une demande de lecture du scratchpad
for (byte i = 0; i < 9; i++) // On lit le scratchpad
data[i] = ds.read(); // Et on stock les octets reçus
// Calcul de la température en degré Celsius
*temp = ((data[1] << 8) | data[0]) * 0.0625;
// Pas d'erreur
return true;
}
// setup()
void setup() {
Serial.begin(9600); // Initialisation du port série
pinMode (relayChauffage, OUTPUT); // Sortie
pinMode (relayOuverture, OUTPUT);
pinMode (relayFermeture, OUTPUT);
pinMode (relayPompe, OUTPUT);
pinMode (relayBrumiseur, OUTPUT);
pinMode (relayEclairage, OUTPUT);
pinMode (buzzerPin, OUTPUT);
digitalWrite (relayChauffage, LOW); // On met tout OFF
digitalWrite (relayOuverture, LOW); // On met tout OFF
digitalWrite (relayFermeture, LOW); // On met tout OFF
digitalWrite (relayPompe, LOW); // On met tout OFF
digitalWrite (relayBrumiseur, LOW); // On met tout OFF
digitalWrite (relayEclairage, LOW); // On met tout OFF
digitalWrite (buzzerPin, LOW); // On met tout OFF
etatChauffe = false; // la condition d’exécution fausse, L’exécution en boucle se terminera et ne reprendra que lorsque la condition redeviendra vraie.
etatOuverture = false; // la condition d’exécution fausse, L’exécution en boucle se terminera et ne reprendra que lorsque la condition redeviendra vraie.
etatFermeture = false; // la condition d’exécution fausse, L’exécution en boucle se terminera et ne reprendra que lorsque la condition redeviendra vraie.
}
// loop()
void loop() {
float temp;
float sinVal;
int toneVal;
// Lit la température ambiante à ~1Hz
if (getTemperature(&temp)) {
// Affiche la température
Serial.print("Temperature : ");
Serial.print(temp);
Serial.write(176); // caractère °
Serial.write('C');
Serial.println();
delay(5000); // tempo: 5 secondes
if ((temp > tempBasse) && (etatChauffe == false)) { //Température est supérieure à 20° & état de chauffe faux
Serial.println();// saut 1 ligne
Serial.println("Temperature > 20 , Chauffage a l'arret."); //Message: Temperature de maintien au maxi, coupure du Chauffage.
Serial.println();// saut 1 ligne
digitalWrite(relayChauffage, HIGH); // Chauffage enclenché .
etatChauffe = false;
}
if ((temp < tempBasse) && (etatChauffe == true)) {
Serial.println("Temperature < 20, Enclenchement du chauffage."); // Temperature de maintient trop basse, Enclencement du chauffage.
Serial.println();
digitalWrite(relayChauffage, LOW); // Chauffage à l'arret.
etatChauffe = true;
}
//****************************************************************//
if (temp > tempHaute) {
Serial.println();
Serial.println("Temperature > 25, ouverture de la porte, pendant 5 secondes."); // Message: Temperature supérieure à 25°C, ouverture de la porte.
Serial.println();
digitalWrite(relayOuverture, HIGH), delay (5000); // ouverture de la porte pendant 5 secondes .
digitalWrite(relayOuverture, LOW);
etatOuverture = false;
Serial.println("Tempo 1 mn, Message: Attente stabilisation de la Temperature."); //Message: Attente stabilisation de la Temperature.
Serial.println();// saut 1 ligne.
delay(60000); // tempo 1 mn pour que la température est le temps de changer.
}
if (temp < tempHaute) {
Serial.println("Temperature < 25, fermeture de la porte."); // Message:Temperature inférieure à 25°C .
Serial.println();
digitalWrite(relayFermeture, HIGH); // Ferture de la porte.
digitalWrite(relayFermeture,LOW);
etatOuverture = false;
}
//**********************************************************************//
// température anormale !
if ((temp < alerteBasse) || (temp > alerteHaute)) {
Serial.println("Temperature anormale !!!!!!!!"); // Message: Temperature anormale.
Serial.println();
for (int x=0; x<180; x++) {
sinVal = (sin(x * (3.1412 / 180)));
toneVal = 2000 + (int(sinVal * 1000));
tone(buzzerPin, toneVal);
delay(10);
}
noTone(buzzerPin);
}
else {
noTone(buzzerPin);
}
}
}
Nathan Garnier
lun, 03/20/2017 - 21:26
Et ici pour programmer les alarmes du rtc : lien.
Pages