[Résolu] ESP32 TTGO Lora32 : capteur d'humidité du sol en Wifi

Bonjour,
Le matériel que j’utilise en électronique est pour le moment rudimentaire:
-une carte ESP32
-un capteur d’humidité du sol Iduino ME110
-une led

Mon projet est de mettre au point un système d’arrosage pour des murs végétalisés avec récupération des eaux de pluies qui soit automatisé. Sur le long terme, je veux que le système d’arrosage soit optimisé avec les capteurs d’humidité au sol d’une part, et avec une API météo d’autre part. Pour le moment, j’ai travaillé sur un programme qui permet d’utiliser un capteur d’humidité, utilisant le port n°15 comme entrée analogique afin d’établir une tension entre 0 (humide) et 4095 (sec), puis convertissant en une valeur comprise entre 0 et 100 (pour plus de lisibilité des données).

Je n’en suis pas encore au stade de définir le seuil établissant le stress hydrique de la plante, j’ai donc choisi la valeur 35 au hasard, en dessous de quoi une led s’allume (afin de simuler l’activation de l’électrovanne pour procéder à l’arrosage du mur végétalisé). Comme tel, ça fonctionne bien. Cependant, quand je veux faire communiquer ma carte ESP32 avec la Gateway Dragino pour plus tard travailler sur Arduino, je me rends compte que la valeur de l’entrée analogique devient nulle (j’ai automatiquement 0 comme résultat). Cet aspect de côté, la connexion wifi se passe normalement et l’ensemble paraît bien tourner (même si j’ai encore des lacunes pour bien communiquer avec la Gateway, mais je m’efforce d’apprendre étape par étape).

J’ai recherché où je le pouvais des solutions. J’en ai trouvé une pour les capteurs de température DHT11, qui utilise “DHT dht(DHTYPE,DHTPIN)”, se reposant à ce titre sur la librairie DHT sensor. Cependant, les librairies que j’ai trouvé pour les capteurs d’humidité au sol ne me semblent pas avoir quelque chose de comparable. Quelqu’un aurait-il la solution pour m’aider à dépasser ce blocage ?

Merci à vous !

#include <WiFi.h>  // Utilisation de la librairie WiFi.h
#include <WiFiMulti.h>
#include <Arduino.h>
#include <HTTPClient.h>
#include "gravity_soil_moisture_sensor.h"

#define USE_SERIAL Serial
#define MSTYPE ME110 // Là, j'essaye d'imiter la librairie DHT sensor en mettant le type du "Moisture Sensor", mais je ne suis pas convaincu par l'utilisation
#define gravity_sensor_pin 15 // définition du port pour l'entrée analogique du capteur

GravitySoilMoistureSensor gravity_sensor;
WiFiMulti wifiMulti;
HTTPClient http; // va créer un objet qui s'appelle HTTPClient qui va permettre de lancer des requêtes en HTTP

const char* ssid = "ssid";  // Mettre votre SSID Wifi
const char* password = "mdp";  // Mettre votre mot de passe Wifi

int PinLed=2;

void setup() {

pinMode(PinLed,OUTPUT);
Serial.begin(115200);
uint8_t PinCap = 15;

if (!gravity_sensor.Setup(PinCap)) {
Serial.println("Le capteur d'humidité au sol n'a pas été détecté.");
while(1);
} 
else {
Serial.println("Le capteur d'humidité au sol est opérationnel !");
    }

Serial.println("\n");

WiFi.begin(ssid,password);  // Initialisation avec WiFi.begin / ssid et password
Serial.print("Attente de connexion ...");  // Message d'attente de connexion
while(WiFi.status() != WL_CONNECTED)  // Test connexion
{Serial.print(".");  // Affiche des points .... tant que connexion n'est pas OK
delay(100);}
Serial.println("\n");
Serial.println("Connexion établie !");  // Affiche connexion établie
}

void loop() {
uint16_t value = gravity_sensor.Read(gravity_sensor_pin);
int a = 40.95;
int b = 100;
float sensorConvert = value / a;
float sensorConvert1 = b - sensorConvert; // conversion mathématique rudimentaire pour passer de 0/4095 à 0/100 => plus on est proche de 0, plus le pourcentage d'humidité est élevé
Serial.printf("Valeur de l'entrée analogique du capteur : %d\n", value);
Serial.print("Ce qui donne ");
Serial.print(sensorConvert1);
Serial.println("% d'humidité.");
if (sensorConvert1 < 35) {digitalWrite(PinLed,HIGH);} // si le pourcentage d'humidité est inférieure à 35%, la petite led s'allume (simulation de l'électrovanne qui s'active)
else {digitalWrite(PinLed,LOW);}

int h = sensorConvert1;


if ((wifiMulti.run() == WL_CONNECTED)) { // Si c'est connecté, ça fait ce qu'il y a en dessous
USE_SERIAL.println("[DEBG] " + String(h));
USE_SERIAL.print("[HTTP] begin...\n");
      // configure traged server and url
      //http.begin("https://www.howsmyssl.com/a/check", ca); //HTTPS
http.begin("https://adresseserveur/h/" + String(h)); //HTTP => démarre connexion vers le serveur mentionné

USE_SERIAL.print("[HTTP] GET...\n");
      // start connection and send HTTP header
int httpCode = http.GET(); // soumet une requête de type "get", puis récupère résultat qui sera collée dans HTTP

      // httpCode will be negative on error
if (httpCode > 0) { // si c'est supérieur à 0, il refait un test)
      // HTTP header has been send and Server response header has been handled
USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

      // file found at server
if (httpCode == HTTP_CODE_OK) {
      // Si ça s'est bien passé, il refait une variable où il met le getString puis affiche à l'écran
String payload = http.getString();
USE_SERIAL.println(payload);
if (payload == "ON") {
digitalWrite(4, HIGH);
}
if (payload == "OFF") {
digitalWrite(4, LOW);
}
}
} 
else { 
      // sinon, il dit que ça ne fonctionne pas
USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}

http.end();    }

delay(5000);
}

Bonsoir

içi un exemple de code basique (sans librairie) pour cette sonde analogique rudimentaire qui n'a rien à voir avec un capteur numérique tel qu'un DHT11

https://asset.conrad.com/media10/add/160267/c1/-/en/001616242ML01/bedienungsanleitung-1616242-iduino-me110-bodenfeuchtesensor.pdf

Bonsoir, le problème n'est pas de faire fonctionner la sonde analogique qui constitue le corps de base de mon code initial. Le problème est que l'ajout de la partie pour utiliser ce capteur via connexion wifi rend caduque ce code basique, ne donnant plus comme résultat sur le moniteur que 0. Ce que j'identifie comme souci (peut-être à tort, mais il n'y a que sur un code utilisant du DHT11 où ce souci a été relevé et solutionné, d'après mes recherches), c'est que dans le loop, le réveil ne prend pas en compte le pin du capteur (pour cela, il faudrait apparemment créer un objet dans le loop pour que la fonction analogRead tourne bel et bien => ce que je ne sais pas faire en l'état).

edit : je précise que l'ESP32 que j'utilise a le wifi et le lora d'intégré, à toutes fins utiles.

Sur ESP32 certaines pins sont utilisées pour le fonctionnement du Wi-Fi ou lors du boot. Autant éviter de les utiliser si tu en as d'autres qui sont disponibles. De mémoire, il y a la 15, la 2 et peut-être la 10, je ne sais plus.

Essaye de changer de pin pour la lecture analogique.

Plus précisément l'ADC2 ne peut pas être utilisé en même temps que le WiFi. Il fait donc oublier les pins ADC2. Prends une pin à partir de la 32

|500x336

Bonjour

Plus précisément l'ADC2 ne peut pas être utilisé en même temps que le WiFi.

Bien vu !!

L'ESP32 a beacoup de ressources matérielles mais elles se marchent parfois sur les pieds ! Voici un lien indiquant les pins associées au premier ou au second convertisseur analogique/numérique https://microcontrollerslab.com/adc-esp32-measuring-voltage-example/

Voir également le schéma de la carte utilisée pour repérer les pins restant disponibles (la puce LoRa et peut être d'autres composants ajoutés sur cette carte, carte SD, afficheur... réduisent fortement les possibilités)

Il n'est pas normal qu'un simple AnalogRead() sur une entrée analogique libre reliée à ADC1 perturbe le fonctionnement, contrairement à la pin15 (liée à ADC2)

Merci beaucoup ! J'ai branché mon capteur sur le pin 33 et ça fonctionne bien ! Je note également la documentation qui me permet d'utiliser l'ADC2 mais avec un programme mieux structuré (qu'il me faudrait travailler pour l'adapter). En effet, l'ADC2 ne peut être utilisé qu'après le démarrage des pilotes Wifi. Il est donc possible de basculer entre les deux ressources, ce que je pourrai explorer à l'avenir grâce à la documentation d'al1fch. En attendant, je peux enfin progresser vers l'étape suivante pour mon projet. Encore merci pour le soutien !