[Domotique] Température et humidité dans la serre

Prototype pour surveiller la température, l’humidité ambiante ainsi que l’humidité de la terre; histoire de ne pas faire comme l’année dernière et laisser mes pieds de tomate se dessécher…

Équipement requis :

Le tout pour moins de 10€

Pour le montage :

Pour le code :

Ceci est une concaténation de code trouvé à droite et gauche sur les internets. Pour des sujets plus pointus cf les sources en bas de page.

#include <WiFi.h>
#include <SimpleDHT.h>
#include <HTTPClient.h>


// Pour le dht11 
int pinDHT11 = 15;
SimpleDHT11 dht11;

// Pour le YL69
int analog_pin = 34;  // lecture analogique
int ValeurSensor = 0;
int pourcentage = 0;

// constante de connexion
HTTPClient http;
const char* ssid = ""; // nom du wifi
const char* password =  ""; //mdp du wifi
const char* host = ""; // ip_domoticz
const int port = 8080;
const int   watchdog = 60000; // Fréquence d'envoi des données à Domoticz - Frequency of sending data to Domoticz
unsigned long previousMillis = millis(); 

//#######################################################

void connectToNetwork() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Establishing connection to WiFi..");
  } 
  Serial.println("Connected to network");
}


//#######################################################

void setup() {
  Serial.begin(9600);
  connectToNetwork();
  
  //pinMode(PinYL69alim, OUTPUT);
  //digitalWrite(PinYL69alim, LOW);

  Serial.println(WiFi.macAddress());
  Serial.println(WiFi.localIP());
 
  //WiFi.disconnect(true);
  Serial.println(WiFi.localIP());
}

//#######################################################
void loop() {
  // start working...
  Serial.println("=================================");
  Serial.println(WiFi.localIP());
  
  ValeurSensor = analogRead(analog_pin);

  pourcentage = ConvertEnPercent(ValeurSensor);
  AfficheValeurEtPourcentage();
  
  // read with raw sample data.
  byte temperature = 0;
  byte humidity = 0;
  byte data[40] = {0};
  if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
    Serial.print("Read DHT11 failed");
    return;
  }
  
  float t = int(temperature);
  float h = int(humidity);

  if ( isnan(t) || isnan(h) ) {
        Serial.println("DHT KO");
  } else {
        int hum_stat;
        if ( h > 70 ) {
          hum_stat = 3;
        } else if ( h < 30 ) {
          hum_stat = 2; 
        } else if ( h >= 30 & h <= 45 ) {
          hum_stat = 0;
        } else if ( h > 45 & h <= 70 ) {
          hum_stat = 1;
        }

        // modèle : /json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=TEMP;HUM;HUM_STAT
        // https://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Temperature.2Fhumidity
        
        String url = "/json.htm?type=command&param=udevice&idx=14&nvalue=0&svalue=";
        url += String(t); url += ";";
        url += String(h); url += ";";
        url += String(hum_stat); url += ";";
        sendDomoticz(url);
  }
  
  Serial.print((int)temperature); Serial.print(" *C, ");
  Serial.print((int)humidity); Serial.println(" %");
  
  // DHT11 sampling rate is 1HZ.
  delay(6000);
}

//#######################################################

void sendDomoticz(String url){
  Serial.print("connecting to ");
  Serial.println(host);
  Serial.print("Requesting URL: ");
  Serial.println(url);

  String complete_url = "http://";
  complete_url += String(host);
  complete_url += ":";
  complete_url += String(port);
  complete_url += String(url); 
  http.begin(host,port,url);
  int httpCode = http.GET();
    if (httpCode) {
      if (httpCode == 200) {
        String payload = http.getString();
        Serial.println("Domoticz response "); 
        Serial.println(payload);
      }else{
        String payload = http.getString();
        Serial.println("Domoticz not response ");
        Serial.println(String(httpCode));
        // pour interprétation des codes d'erreur : https://github.com/espressif/arduino-esp32/blob/master/libraries/HTTPClient/src/HTTPClient.h
        Serial.println(complete_url);
      }
    }
  Serial.println("closing connection");
  http.end();
}

//#######################################################
// pour l'humidité en terre
int ConvertEnPercent(int value){
 int ValeurPorcentage = 0;
 ValeurPorcentage = map(value, 4095, 1813, 0, 100);
 return ValeurPorcentage;
}

// pour l'humidité en terre
void AfficheValeurEtPourcentage(){
 Serial.println("-----------");
 Serial.print("Valeur: ");
 Serial.println(ValeurSensor);
 Serial.print("Pourcentage: ");
 Serial.print(pourcentage);
 Serial.println("%");
}

Le rendu :

c’est moche mais ça fonctionne

Et après :

Rajouter l’humidité de la terre dans Domoticz, et programmer des alertes via Télégram, mais bon j’ai encore le temps avant l’été. L’autre problématique sera l’alimentation de l’esp32 (panneau solaire, batterie etc.) et enfin imprimer un jolie boitier (une fois que j’aurai réparé l’imprimante 3D).

Sources :