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);
}
}
}
Labricole14
lun, 02/27/2017 - 18:10
Bonsoir,
Actuellement j'ai 2 thermostats STC100 1 pour le chauffage et 1 pour la commande ouverture fermeture de ma porte.
Mais avec le thermostat la porte s'ouvre en grand et se referme quand la température chute
Cordialement.
Nathan Garnier
lun, 02/27/2017 - 19:28
d'accord sinon savez vous combien il faut de temps pour une ouverture complete de la porte ?
Labricole14
lun, 02/27/2017 - 20:24
Ouverture de la porte en 32s secondes.
C'est pour cela que j'ai prévu des ouvertures de 5 secondes
Cordialement
Nathan Garnier
lun, 02/27/2017 - 20:25
d'accord donc maximum 6 cycle d'ouverture merci
Labricole14
lun, 02/27/2017 - 20:27
Oui 6 cycles c'est correct, vue que le vérin est équipé de fins de courses.
Cordialement
Nathan Garnier
lun, 02/27/2017 - 20:28
d'accord genial je fais une chose aux petits onion alors (si vous voulez je peut juste vous montrez le modele comme sa c'est vous qui programmer ; ) ce sera plus instructif que si c'est moi qui le fait...
Labricole14
lun, 02/27/2017 - 20:31
Ok vous voulez créer un compteur de cycle?
Je suis partant pour toute solutions je suis là pour apprendre même à mon age!!!
Cordialement
Nathan Garnier
lun, 02/27/2017 - 20:33
Vous allez voir... j'ai bientot fini d'ici 10 minute c'est bon
Nathan Garnier
lun, 02/27/2017 - 20:49
voila :
Labricole14
lun, 02/27/2017 - 20:59
Si je comprends bien vous créez une nouvelle variable pour stocker les délais.
Vous partez à 0 et a chaque cycle d'ouverture vous incrémentez de+5.
Si bien qu'au bout de 6 cycles nous avons 30 et c'est la fin de l'ouverture.
Et en fin de fermeture on remet la variable Alldelay à 0 pour pouvoir recommencer un cycle.
Je modifie mon code et je vous tiens au courant du résultat.
Encore merci pour le temps que vous me consacrez.
Cordialement.
Nathan Garnier
lun, 02/27/2017 - 21:24
Oui c'est exactement sa
Et avec grand plaisir
Labricole14
mar, 02/28/2017 - 13:28
Bonjour,
Il y a encore des problèmes:
Alldelay ne s'incrémente pas.
alldelay +5 ; //permet de compter le nombre de cycle et en plus le temps de fermeture quand l'on voudra fermer
Si je mets alldelay ++ j'ai une incrémentation de 1 avec +5 alldelay reste à zéro.
J'ai ajouter: Serial.println(alldelay); // pour contrôler l'incrémentation de la variable.
De plus la tempèrature variable temp n'est pas mise à jour elle garde la valeur qu'elle a quand on entre dans la boucle.
Et je n'ai jamais la fermeture de la porte.
Cordialement.
Je vous joint mon fichier modifié et le contenu du moniteur série.
Cordialement
Labricole14
mar, 02/28/2017 - 13:44
J'ai trouver pour l'incrémentation:
alldelay = alldelay+5 ;//permet de compter le nombre de cycle.
Il faut que je trouve comment raffraichir la variable temp si non la porte s'ouvre en grand et tout nos efforts ne servent à rien.
Et écrire porte ouverte en grand en fin de boucle d'ouverture.
@+
Nathan Garnier
mar, 02/28/2017 - 16:56
Bonjour
Ah oui mince désolé pour l'incrementation en 5, petite lacune :/
Et pour rafraichir la température il faudrait créé une fonction température (un void temp par exemple) que l'on appelerait a chaque fois que l'on veut la température ou si une fonction de la librairie permet de lire directement la température il faudrait la mettre à l'intérieur du while()
Nathan Garnier
mar, 02/28/2017 - 16:57
Ah quoi sert la fonction getTemperature(&temp)?
Labricole14
mar, 02/28/2017 - 20:11
Bonsoir j'ai modifié encore un peu.
Je vous joint les fichiers code & série.
La fermeture de la porte ne fonctionne car je ne comprends pas pourquoi "etatOuverture" est à 0 donc faux alors qu'il devrait être à 1.
Je pense que c'est ce qui empêche la fermeture de la porte..
Cordialement.
Nathan Garnier
mar, 02/28/2017 - 21:41
Alors pour eviter la repetition des message d'ouverture il faudrait mettre la ligne a l'interieur de la boucle While comme sa quand sa ouvre sa affiche et si sa n'ouvre pas sa n'affiche pas
Ah ben oui pour l'etatOuverture c'est == alors que pour attribuer une valeur c'est juste un seul =.
Bon on va y arriver cette fois
Nathan Garnier
mar, 02/28/2017 - 21:57
Quelque correction mineur comme le ==
Labricole14
mer, 03/01/2017 - 07:19
Bonjour,
Je pense que pour la régulation de température c'est bon.
Je vais écrire le code pour les autres fonctions et je reviens vers vous.
Bonne fin de semaine.
Cordialement.
Nathan Garnier
mer, 03/01/2017 - 12:13
Bonjour,
Ah enfin :D
Bonne fin de semaine a vous aussi et a bientôt
Labricole14
sam, 03/04/2017 - 10:50
Bonjour,
J'ai ajouté la commande de mon extracteur d'air qui ce met en fonction quand la température dépasse 30°.
Et doit s'arrêter quand quand la température descend à 28°.
Et ne fonctionne que porte ouverte!!!
L'extrateur démarre bien mais ne s'arrête pas.
Voici le bout de code:
Je ne vois pas ou est l'erreur!!!!
Je n'ai pas d'erreur quand je compile le code.
Cordialement.
Nathan Garnier
sam, 03/04/2017 - 11:55
Bonjour,
Pouvez vous envoyer le code? Comme sa sa me permet de regarder directement dans l'ide
Merci d'avance
Labricole14
sam, 03/04/2017 - 12:35
Voici le code
Cordialement
Nathan Garnier
lun, 03/06/2017 - 20:58
Bonsoir, desolé pour l'attente j'ai été occupé tout le week-end.
Pour le code j'ai juste sortie les boucles d'activation et descativation de l'aspiration de la boucle tempHaute.
Labricole14
mer, 03/08/2017 - 09:00
Bonjour,
J'ai testé il fonctionne,
J'ai ajouté un compteur pour n'avoir qu'une seule fois l'affichage dans le moniteur série: extracteur ON & OFF
Je me penche sur le module DS3231 pour enclencher le brumisateur ou la pompe d'arrosage.
J'ai a afficher l'heure et le jour mais je n'ai pas compris comment on active l'alarme pour par exemple arroser à 8h00 puis 12h00 par exemple.
"alarme" c'est bien cette fonction qu'il faut utiliser.
Je pense que pour la durée d'arrosage il faut utiliser "delay"
Si vous avez un exemple commenté de cette fonction je suis preneur pour essayer de comprendre.
Je n'ai pas encore intégré le module temps je fais des essais sur des fichier séparés.
Cordialement.
Nathan Garnier
mer, 03/08/2017 - 13:57
Bonjour,
Je n'ai pas non plus compris le fonctionnement de cette librairie ...et pour la durée d'arrosage tout depend combien de temps vous voulez arroser si ce n'est que 10seconde sa 'e devrai pas poser grand problème
Nathan Garnier
mer, 03/08/2017 - 14:04
J'ai trouvé cette librairie qui a l'air bien plus simple...
Labricole14
mer, 03/08/2017 - 20:39
Bonsoir,
J'ai modifié du code pour la commande de la pompe d'arrosage en utilisant un module DS3231.
Il y a un problème dans mon code et je ne vois pas ou.
Mon relais est ON alors qu'il devrait être OFF
"digitalWrite(relayPompe, LOW); //On met tout OFF"
Je ne vois pas ou ce trouve l'erreur.
Pour avoir plusieurs période d'arrosage je multiplie le code pour chaque période ou j'incrémente du type:
int heure = 0 puis
int heure = heure + 4. => heure devient 4 - 8 - 12 - 16 - 20 et remettre à 0
Merci de votre aide.
Cordialement.
Nathan Garnier
jeu, 03/09/2017 - 08:43
Bonjour,
Chez moi avec mon module RTC cela fonctionne avec ce code (je l'ai inclus dans votre code a vous).
Labricole14
jeu, 03/09/2017 - 09:51
Bonjour,
Chez moi je suis obligé de mettre:
" digitalWrite(relayPompe, 1)" pour que mon relais soit OFF
Je ne comprend pas.
OK pour le changement d'heures auto merci.
Je vais essayé d'intégrer ce code dans le code de la serre.
A bientôt.
Cordialement.
Nathan Garnier
jeu, 03/09/2017 - 10:06
Ah d'accord enfaite votre relai est inversé il suffit de brancher votre pompe sur l'autre broche de votre relai
Labricole14
jeu, 03/09/2017 - 13:18
Arduino : 1.8.0 (Windows 10), Carte : "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"
Serre_version_08_e:174: error: expected unqualified-id before 'if'
if (getTemperature(&temp)) {
^
exit status 1
expected unqualified-id before 'if'
Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.
Je ne comprend pas pourquoi
Merci de votre aide.
Cordialement.
Nathan Garnier
jeu, 03/09/2017 - 13:55
C'est juste parce que vous n'avez pas enlever le } qui ferme la void loop() après le delay 1000 de la lecture du RTC
Labricole14
jeu, 03/09/2017 - 19:06
Plus compliqué que ça.
Maintenant :
L'assemblage de 2 codes différents n'as pas l'air aussi simple.
@+
Labricole14
ven, 03/10/2017 - 08:53
Bonjour,
J'avance doucement:
J'ai ajouté: #define show_time_and_date().
Maintenant l'erreur est:
macro "show_time_and_date" passed 1 arguments, but takes just 0
Je continue mes recherches.
Si vous avez des tuyaux!!
Merci.
Cordialement.
Nathan Garnier
ven, 03/10/2017 - 20:58
Bonsoir,
Après avoir relu le code, j'ai compris les problèmes que vous obtenez, les accolade ne sont pas a la bonne place et surtout il ne sont pas bien placé.
Nathan Garnier
ven, 03/10/2017 - 20:58
Je vous corrige cela et je vous envoie le fichier
Nathan Garnier
lun, 03/13/2017 - 20:28
Bonsoir, me revoila alors par quoi commencer ...
Le probleme avec votre horloge RTC c'est que si un delay est actif durant l'heure d'arrosage alors l'arrosage ne s'effetuera pas. Il y a deux solutions a ce probleme une tres simple et une plus complexe et surtout peut etre imossible :
Utiliser une autre arduino pour gerer l'heure et l'arrosage
Ou si votre module possede une broche d'alarme programmable alors il faut parametrer cette broche et creer une interruptions dans le programme pour lancer l'arrosage (ce n'est pas une tres bonne option car l'on ne gere plus la temperature...)
Moi j'utiliserais une autre arduino pour gerer l'arrosage par soucis de simplicité et donc pas desoin de refaire un programme juste utilisé le precedent.
Tenez-moi au courant.
A bientôt
Labricole14
mar, 03/14/2017 - 07:22
Bonjour,
OK, je n'insiste pas, je vais installer un ARDUINO avec le code pour la régulation de température et mettre une prise programmable pour l'arrosage.
Est-il possible en utilisant l'horloge RTC au lieu de "delay" de faire cohabiter les 2 codes?
Merci pour votre aide si précieuse.
Cordialement.
Nathan Garnier
mar, 03/14/2017 - 11:33
Remplacer les delay par la RTC doit être possible mais je ne vois pas en quoi se serai mieux autant faire une interruption comme décrite au dessus et comme sa lorsque la broche d'alarme change d'état on active la pompe puis on defini une nouvelle heure d'alarme au module et on reviens au programme principal.
Voilà...
Labricole14
mar, 03/14/2017 - 12:10
C'est quoi une interruption? une pause.
Le temps d'arrosage de mes barquettes de semis ne devrait pas être supérieur à 30 s voir 1 mn maxi.
Je ne pense pas que la régulation de température va être trop perturbée.
Cordialement.
Nathan Garnier
mar, 03/14/2017 - 19:32
Allez voir par ici c'est une fonction assez utile comme pour ici par exemple si votre module DS3231 possede une broche d'alarme programmable alors l'utilisation de l'interruption peut permettre de tout concentre dans une seule arduino.
Labricole14
mer, 03/15/2017 - 07:59
Bonjour,
Je pense que le code devient trop complexe pour moi je suis un débutant!!!!
J'ai bien la doc du DS3231 mais après mettre en oeuvre une interruption c'est une autre affaire.
Bonne journée
Cordialement.
Labricole14
mer, 03/15/2017 - 17:20
Bonsoir,
J'ai trouvé https://www.youtube.com/watch?v=eny5Q0f-kYw sur le Net.
C'est ce type de commande que vous me conseillé?
L'interruption il faut la faire sur la régulation de température?
Merci de votre réponse.
Cordialement.
Nathan Garnier
mer, 03/15/2017 - 17:40
Oui c'est sa il suffit de bien definir la fonction interrupt et lorsque la broche INT/SQW du module RTC passe a LOW (FALLING dans notre cas) l'interruption s'effectue quoi que le programme fasse.
pour cela il faut crée une nouvelle fonction void par exemple void arrosage qui sera appeler seulement lors d'une interruption.
voir ici pour les interruptions
Labricole14
mer, 03/15/2017 - 19:44
Ok je regarde et je reviens vers vous .
Bonne soirée.
Labricole14
lun, 03/20/2017 - 09:59
Bonjour,
Pour intégrer l'interruption il faut que je démarre avec un code sans erreurs, hors pour l'instant il me reste une erreur ligne 282.
Je ne vois pas ou elle est.
Merci de votre aide
Cordialement.
Nathan Garnier
lun, 03/20/2017 - 20:11
Bonsoir, sans vouloir être méchant vous avez quelques problèmes avec les accolades :) vous ne les placez pas au bonne endroit ou vous en oublier quelques unes mais bon c'est pas bien grave ...
Je vous le corrige si vous voulez et pour l'interruption surtout n'hésitez pas a demander ;)
Nathan Garnier
lun, 03/20/2017 - 20:35
Eh hop voici le programme sans erreur et l'interruption a compléter (en bas)
Labricole14
mar, 03/21/2017 - 07:04
Bonjour,
Merci pour les corrections.
Je regarde pour les interruptions.
Bonne journée.
cordialement.
Pages