Serre à semis

Portrait de Labricole14

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

Portrait de Nathan Garnier

Bonjour,

J'ai pas trés bien compris ... vous voulez remplacer les capteurs STC100 par cela ds18b20 c'est sa ?

Si oui pourquoi vous metté un bout du code en dehors des voidSetup et voidLoop ?

Je suis curieux d'apprendre plus sur ce projet.

A bientot

Portrait de Labricole14

Bonjour,

Oui, je veux remplacer les thermostats par une régulation programmé sous ARDUINO

En utilisant comme capteur de température un DS18B20.

Je veux pouvoir réguler la température de la serre en ouvrant la porte par palier.

Je n'ai pas trouver comment insérer le code  entre les balises.

Cordialement,

Portrait de Nathan Garnier

J'ai trouvé sa , sa a l'air de s'implifier pas mal l'obtention de la température après il suffit de faire des if comme vous l'avez fait dans votre prgrm initial.

Portrait de Labricole14

Pour le problème ce trouve dans les if.

La température fonctionne bien.

C'est la gestion des if  avec les délais qui monopolise  l'ARDUINO

Je cherche comment passé outre.

De même la fermeture de la porte quand la température est inférieur à 25° ne fonctionne pas correctement.

Cordialement

Portrait de Nathan Garnier

Ah d'accord enfaite vous voulez que lorsque la porte s'ouvre durant les x secondes de l'ouverture l'arduino ne soit pas bloqué mais continue a regardé la temperature et si la temperature redescend sa referme la porte avant les x secondes c'est sa ?

Si oui la fonctions millis pourrait etre utile dans ce genre probleme

Portrait de Labricole14

Merci je vais explorer la fonction millis elle va me permettre d'avancer.

Je dois ajouter un module DS3231  pour déclencher mon brumisateur pour l'engrais.

Faut-il toujours utiliser la fonction millis ou il y a une autre fonction a utiliser dans la librairie du DS3231

Merci pour tes réponses

Cordialement,

Portrait de Nathan Garnier

Avec grand plaisir

Vous utilisez quel librairie pour ce module DS3231?

Et pour la fonction millis elle est très simple le seul problème c'est le faite qu'au bout d'environ 70 jours le compteur reviens a 0 donc sa peut créé un petit bug (un reset de la carte tt les 30jours permet d'éviter sa)

Portrait de Labricole14

Bonjour,

Je regarde la fonction millis et ne trouve pas que c'est si simple pour un débutant.

Je pense utiliser la librarie RTC pour mon DS3231, mais vous avez peut-être une autre librairie a me proposer?

Et je n'ai pas compris quand il faut utiliser delay plustôt que millis.

Cordialement,

Portrait de Nathan Garnier

Vous aurez le lien de cette librairie ? (Moi j'utilise le DS1307 comme module RTC).

Pour millis sa rajoute 2 variables dans le code :

-previousMillis (unsigned-long)

-delai = 10000 (juste pour l'exemple)(un int standard)

-currentMillis (unsigned long)

Et on joue avec cette fonction je m'explique :

D'abord on fais :

currentMillis = millis()

Puis pour voir si les 10 secondes ce sont écoulés :

If ( currentMillis - previousMillis >= delai){

previousMillis = currentMillis; //remet a zero le "compteur"

//On fait ce qu'on a a faire

}

Ce petit bout de code va donc activée l'intérieur du If une fois tt les 10secondes

Pour votre utilisation il faut donc faire pareil mais rajouter un If qui vient vérifiée la température et si la température redescend avant vos x secondes ce ne sera pas le If de "temps" qui s'activera mais le If de "température"

Je sais pas si j'ai été clair dans mes explications ...

Portrait de Labricole14

Bonsoir,

Je vais faire des essais et je reviens vers vous si besoin.

Merci pour votre aide

Cordialement;

Portrait de brossden

Bonjour

Pour palier le problème des Delay(x)  dans les if qui "bloquent" le programme à un endroit déterminé, je te propose de mettre une tempo de 1 seconde à la fin de la boucle et à chaque fois que tu veux une tempo en court de route mets un compteur et lorsque ton compteur arrive à la valeur voulue tu déclenches l'action de ton choix cela ne pénalisera pas tes autres tempos, qui continueront à s'incrémenter ou pas selon ton désir.

Principe ;

Int Tempo1 = 0;
Int Tempo2 = 0;

void setup() {
  // Mets ici les paramètres de ton choix
}

void loop() {
  If (acquisition1 = 1) ; //acquisition1 represente le déclenchement d'une tempo avant action1

  { Tempo1 = Tempo1 + 1;
    If (Tempo1 >= Valeur_de_tempo1)
    {
      action1 = 1
    }
  }
  If (action1 = 1)
  { Tempo2 = Tempo2 + 2;
    If (Tempo2 >= Valeur_de_tempo2)
    {
      action2 = 1;
    }

    If (action2 = 1)
    { Tempo2 = Tempo2 + 2;
      If (Tempo2 >= Valeur_de_tempo2)
      {
        action2 = 1;
      }
    }
    //etc...

  Delay(1000);
  }

Ceci est un principe pas un programme !

Portrait de Labricole14

Bonjour,

J'ai repris mon programme, mais je n'ai sûrement pas tout compris car la tempo d'une minute ne s'enclenche pas.

/*  le 17/02/2017 code extrait du Net
    Ancienne armoire réfrigérée vitrée 4 faces transformée en serre à semis
    Ouverture de la porte par un actionneur linéaire 24v= qui est équipé de 2 fins de course d'origine et interne
    carte Agrduino MEGA 2560
    DS3231 horloge pour gérer le temps
    DS18B20 sonde température
    Module relais pour toute commande tout ou rien
    Un fin de course sur la porte pour savoir quand elle est fermée.
    Il coupera la commande de fermeture et autorisera la mise en service du chauffage
*/

//*****************************************************************************************************

#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 fdcPorte 3        // Fin de course porte fermée
#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 relayBrumisateur 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 alerteBasse 18.0  // temp déclenchement alerte basse buzzer
#define tempBasse 20.5    // temp déclenchement allumage
#define tempHaute 25.0    // temp déclenchement extinction
#define tempTresHaute 30.0  // temp déclenchement extracteur d'air
#define alerteHaute 35.0  // temp déclenchement buzzer  

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds

const long Time_1 = 1000; //1 secondes
const long Time_2 = 5000; //5 secondes
const long Time_3 = 10000; //10 secondes
const long Time_4 = 32000; //32 secondes
const long Time_5 = 60000; //1 minute

boolean etatChauffe;      // attention : boolean etatChauffe = false.
boolean etatOuverture;    // attention : boolean etatOuverture = false.
boolean etatFermeture;    // attention : boolean etatFermeture = false.

unsigned long previousMillis_1 = 0;        //
unsigned long previousMillis_2 = 0;
unsigned long previousMillis_3 = 0;        // 
unsigned long previousMillis_4 = 0;
unsigned long previousMillis_5 = 0;

// 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);    // Initialisé en sortie
  pinMode (relayOuverture, OUTPUT);
  pinMode (relayFermeture, OUTPUT);
  pinMode (relayPompe, OUTPUT);
  pinMode (relayBrumisateur, 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 (relayBrumisateur, 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() {
   unsigned long currentMillis = millis();
  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();
    //if ((millis() - temps) > 5000)
     //delayMicroseconds(500000); // tempo: 5 secondes

    //********************        Chauffage         ******************//
      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;
    }

    //**********************  Régulation température      ******************************************//

    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 .
      if (currentMillis - previousMillis_2 >= Time_2)
      {
       previousMillis_2 = currentMillis;
 
      {
        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.
        
        if (currentMillis - previousMillis_5 >= Time_5) {
       previousMillis_5 = currentMillis;
        {
          //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); // Fermeture de la porte.
          if (currentMillis - previousMillis_4 >= Time_4) {
       previousMillis_4 = currentMillis;
          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);
        }
      }
    }
  }
}
}
}
}

Je ne trouve pas ou j'ai fais une erreur.

Mais je n'ai d'erreur en compilant le code.

Cordialement.

Portrait de Nathan Garnier

Bonjour,

Je ne comprend pas bien ce bout j'ai l'impression qu'il ya une erreur...

//********************        Chauffage         ******************//
      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;
    }

Et pour millis sa ne sert a rien de creer autant de variable previous_millis juste 1 suffit pour tt le code

Portrait de Labricole14

Bonsoir,

 //********************        Chauffage         ******************//
      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, LOW); // Chauffage déclenché .
        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, HIGH); // Chauffage à l'arret.
      etatChauffe = true;

C'est mieux comme ça?

Cordialement.

Portrait de Nathan Garnier

Je pense que oui mais il faut aussi inverse l'etat de chauffe dans les if car si la temperature est plus haute on doit eteindre le chauffage que si il est allumé (premier If) et inversement pour le deuxieme if

Vous me permettez d'éditer le programme chez moi pour commenter directement le code ?

Portrait de Labricole14

Bonjour,

Il n'y a pas de problème, ce code est libre d'accès.

Si vous pouvez m'aider a résoudre les problèmes c'est super car je vais devoir commencer mes semis.

Cordialement.

Portrait de Nathan Garnier

Pourriez-vous m'envoyer les liens de vos librairies one wire et pour votre module RTC ?

Portrait de Labricole14

Bonsoir,

Voici les liens

https://github.com/rodan/ds3231  One wire

https://github.com/rodan/ds3231  RTC

Merci pour votre aide

Cordialement;

Portrait de Nathan Garnier

Bonsoir,

il ne manque pas la librairie One Wire ? 

Je voudrai juste le compiler afin de vous donner un code sans erreur c'est mieux quand même

Desolé du derangement... 

Portrait de Nathan Garnier

Bon impossible de compiler le programme en le copiant pouvez vous envoyer le .ino directement ?

Portrait de Labricole14

Bonjour, je vous joints le fichier.

Merci de votre aide.

Cordialement.

Portrait de Nathan Garnier

Bonjour,

Merci beaucoup je fais sa aujourd'hui sa tombe bien j'ai TPE :)

Portrait de Nathan Garnier

Bonjour, voici le code edité je n'ai rien changé mis a part l'organisation des boucles et les If d'attente j'espere qu'il fonctionnera 

Portrait de Labricole14

Bonjour,

Merci pour votre retour de code.

Il ne fonctionne pas, l'ordre d'ouverture de porte reste activé même après la tempo de 5s  et est toujours activé à 21°C

Cordialement;

Portrait de Nathan Garnier

Bonjour désolé j'ai fais une erreur toute bête, je vous explique dans le code j'ai mis un

previouMillis = millis();// pour avoir un delay plus proche des 5 secondes

sauf que le problème c'est que cette commande s'execute tout le temps vue qu'on est a l'interieur d'une boucle donc millis n'arrivait jamais a dépasser previousMillis de plus de quelques millisecondes. Donc j'ai mis une petite condition + j'ai remis les delay(5000) pour l'attente de la fermeture / ouverture car il n'y a pas besoin de la condition avec millis,parce que dans tout les cas on attend sans rien faire. voila voila en espérant que cette fois-ci cela fonctionne bien.

Portrait de Labricole14

Bonjour,

Ok la tempo des 5 secondes d'ouverture de la porte fonctionne, mais pas la tempo d'une minute pour que la température est le temps de se stabiliser l'ouverture de la porte redémarre de suite.

Merci pour votre aide

cordialement.

Portrait de Nathan Garnier

Je m'y remet alors ;D

Portrait de Nathan Garnier

si vous chaufer avec vos doigt la sonde de temperature est ce que la porte reste plus lomgtemps ouverte ?

Portrait de Nathan Garnier

quelque petite correction

Portrait de Labricole14

Il y a toujours le problème e la tempo 1 minute qui ne s'enclenche pas

Temperature : 22.62°C
Temperature : 23.06°C
Temperature : 24.62°C
Temperature : 25.62°C

Temperature > 25, ouverture de la porte, pendant 5 secondes.

Tempo 1 mn, Message: Attente stabilisation de la Temperature.

Temperature : 25.87°C

Temperature > 25, ouverture de la porte, pendant 5 secondes.

Tempo 1 mn, Message: Attente stabilisation de la Temperature.

Temperature : 25.69°C

Temperature > 25, ouverture de la porte, pendant 5 secondes.

Tempo 1 mn, Message: Attente stabilisation de la Temperature.

Temperature : 26.06°C

Temperature > 25, ouverture de la porte, pendant 5 secondes.

Tempo 1 mn, Message: Attente stabilisation de la Temperature.

Temperature : 26.75°C

Temperature > 25, ouverture de la porte, pendant 5 secondes.

Tempo 1 mn, Message: Attente stabilisation de la Temperature.

Temperature : 26.81°C

Temperature > 25, ouverture de la porte, pendant 5 secondes.

Tempo 1 mn, Message: Attente stabilisation de la Temperature.

Temperature : 27.06°C

Temperature > 25, ouverture de la porte, pendant 5 secondes.

Tempo 1 mn, Message: Attente stabilisation de la Temperature.

Temperature : 27.12°C

Temperature > 25, ouverture de la porte, pendant 5 secondes.

Tempo 1 mn, Message: Attente stabilisation de la Temperature.

Temperature : 26.94°C

Temperature > 25, ouverture de la porte, pendant 5 secondes.

Je vous ai collé une partie de l'affichage du moniteur série.

Cordialement

Portrait de Labricole14

Même si je garde la sonde dans la mains la température monte et les ordres d'ouverture de porte s'enchaînent sans la tempo d'une minute.

Cordialement.

Portrait de Nathan Garnier

mmmh...

la porte ne se ferme meme pas ?

Portrait de Labricole14

Non il n'y a pas d'ordre de fermeture de porte qui passe!!

Portrait de Nathan Garnier

J'ai trouvé une autre façon de faire l'attente il suffit de mettre une boucle while qui regarde si la temperature n'est pas en dessous de 24°C enfin voici le fichier et cette fois sa marche

Enfin je crois ;)

Portrait de Nathan Garnier

En même temps sa c'est beau :D

Portrait de Labricole14

Maintenant, j'ai un clignotement entre les ordres d'ouvertures de porte et fermetures.

Voir fichier joint.

Portrait de Nathan Garnier

donc la temperature ne redescent pas sa c'est louche ...

Portrait de Labricole14

Non l'ordre de fermeture de la porte est donné même en montée de température.

Portrait de Nathan Garnier

mmh j'essaie quelque chose je reviens dans 5 minute

Portrait de Nathan Garnier

J'espere que la ce sera mieux

Portrait de Labricole14

Là nous avons bien l'ordre de fermeture de la porte tant que la température ne dépasse pas 22°,

Puis un ordre d'ouverture pendant 5 secondes et plus rien.

Portrait de Labricole14

j'ai fais une modification en définissant temp25 - temp26 - temp27...

Je vous joint le fichier code et séries

Le problème est que quand la température est sup à 25 ordre d'ouverture pendant 5s

puis quand elle monte à 26° il y a de nouveau l'ordre 25° et puis l'ordre de 26°

C'est là je ne sais  lui dire de ne pas prendre la température 25°

Portrait de Nathan Garnier

Mais sinon on peut fais sans ouverture, il faut alumer et eteindre le chauffage en prenant en compte la latence de temps entre la chauffe et l'obtention par le capteur

Portrait de Labricole14

Pas possible la serre est en extérieur et c'est le soleil qui fait varier la chauffe.

La résistance de chauffage n'est là que pour la nuit ou en hiver quand les températures sont inférieures à 20°

Je l'ai utilisé l'année dernière régulé avec 2 thermostats.

le problème est que la régulation de température n'est pas assez linéaire.

Portrait de Nathan Garnier

ah d'accord tout s'explique mais une porte qui s'ouvre suffit pour refroidir? il faudrait un ventilateur non ?

Portrait de Labricole14

Il y a un ventilateur qui brasse l'air de la serre en permanence pour rendre la température la plus homogène.

Je vais mettre en plus un extracteur en partie haute qui démarrera si la température monte au dessus de 30°

Portrait de Nathan Garnier

D'accord donc enfaite ce que vous voulait c'est que la porte s'ouvre un peu si la temperature ne baisse pas elle s'ouvre plus et etc c'est sa ?

Portrait de Labricole14

exactement, je la fait ouvrir pendant 5 s quand la température est sup 25°, si elle continue a monter 26° je veux redonner un ordre d'ouverture de 5s  ainsi de suite jusqu'a l'ouverture totale.

Je voulais mettre une tempo d'une minute entre chaque ouverture pour laisser le temps à la température de se stabiliser.

Portrait de Nathan Garnier

d'accord d'accord mais par souci de simpliciter il faudrai mieux agir sur l'extracteur directement plutot que sur l'ouverture des portes car l'on ne gére pas l'entrée d'air et donc la temperature ne sera pas stable non plus sauf si vous avez un climat tres regulier.

Portrait de Labricole14

L'extracteur d'air ne peut fonctionner que quand la porte est ouverte en grand, il souffle par la porte ouverte.

donc en dernier recours si je n'arrive pas a réguler avant.

Pages