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 Labricole14

Bonjour,

Merci pour les corrections.

Je regarde pour les interruptions.

Bonne journée.

cordialement.

Portrait de Nathan Garnier

Et ici pour programmer les alarmes du rtc : lien.

Pages