Créer votre sonde d'humidité du sol autonome et solaire pour Home Assistant : La Version 2

Si vous avez lu mon précédent tutoriel sur la création d’une sonde d’humidité connectée, vous savez à quel point ce petit projet est redoutable pour automatiser l’arrosage du potager avec Home Assistant.

Mais après quelques mois d’utilisation de ma version 1 (basée sur un ESP32 WROOM classique et une grosse pile 18650), l’envie de l’améliorer a été la plus forte. L’objectif de cette Version 2 ? Réduire drastiquement la taille du boîtier et optimiser la consommation électrique pour le rendre 100% autonome et invisible dans le jardin.

Adieu le gros cylindre, place à la miniaturisation absolue avec le petit ESP32-C3, une batterie LiPo extra-plate et un boîtier imprimé en 3D sur mesure !

C’est ainsi qu’est née la Sonde DIY V2. Exit le vieux ESP32 WROOM et les batteries 18650 encombrantes, place à la miniaturisation absolue avec l’ESP32-C3, une batterie LiPo plate, et un boîtier sur-mesure imprimé en 3D !

Ce tutoriel vous guidera pas à pas, du choix des composants à la configuration logicielle, pour que vous puissiez vous aussi surveiller la santé de votre jardin intelligemment.

🛠️ Le matériel nécessaire pour la V2​

Pour réussir cette cure d’amincissement, j’ai revu l’ensemble des composants :

  • Le cerveau : ESP32-C3 SuperMini. C’est la véritable star de cette V2. Basé sur l’architecture RISC-V, ce microcontrôleur est minuscule (de la taille d’une pièce de monnaie) et consomme beaucoup moins d’énergie en veille (deep sleep) que son grand frère.

  • Un Shield d’expansion (Optionnel mais recommandé). Pour éviter de souder directement sur la minuscule carte, j’utilise une petite carte d’expansion sur laquelle l’ESP vient s’enficher.

  • La sonde : Capacitive Soil Moisture Sensor V2.0. (Modèle noir HW-390). Cette version intègre un meilleur régulateur matériel pour des mesures plus stables.

  • L’alimentation : Module de charge TP4056 + Batterie LiPo. J’ai troqué la cellule 18650 contre une batterie LiPo plate de 3.7V (2000mAh). Le petit module TP4056 va gérer la recharge solaire et protéger la batterie.

  • Un mini panneau solaire 5V.

  • Deux résistances de même valeur (ex: 100 kΩ ou 10 kΩ) pour créer un pont diviseur de tension.

  • Un connecteur d’alimentation étanche (Prise Jack femelle).

⚡ Le Câblage détaillé : Relier les éléments étape par étape​

Pour que notre sonde V2 soit totalement autonome et préserve sa batterie, chaque branchement a son importance. Voici comment connecter simplement tous les composants entre eux, sans faire d’erreur.

1. La gestion de l’énergie (Panneau, Batterie et TP4056)

Le petit module bleu TP4056 est le gestionnaire d’énergie du projet. C’est lui qui va s’occuper de recharger la batterie grâce au soleil et de l’empêcher de se décharger trop profondément.

  • Le Panneau Solaire : Connectez ses deux fils aux entrées IN+ (positif) et IN- (négatif) du TP4056.

  • La Batterie LiPo : Branchez-la directement sur les bornes B+ et B- du TP4056.

  • Alimenter la carte ESP32 : Partez des sorties du TP4056. Reliez le OUT+ à la broche d’alimentation principale 5V de votre shield (la carte d’expansion noire), et le OUT- à une broche de masse GND.

2. La Sonde d’humidité (Le secret de l’économie d’énergie)

Il y a un piège classique avec les shields d’expansion : toute la colonne rouge fournit du courant en permanence. Si vous y branchez la sonde, elle tournera 24h/24 et videra votre batterie en quelques jours ! Pour que l’ESP32 puisse allumer la sonde uniquement quand il se réveille, il faut l’alimenter via une broche de signal :

  • Alimentation (Fil Rouge de la sonde) : Branchez-le sur le GPIO1 (sur la rangée jaune de votre shield, dédiée aux signaux).

  • Données (Fil Jaune de la sonde) : Branchez-le sur le GPIO0 (rangée jaune).

  • Masse (Fil Noir de la sonde) : Branchez-le sur n’importe quelle broche GND du shield (rangée noire).

3. La lecture du niveau de batterie (Le fameux pont diviseur)

Pour afficher le pourcentage de batterie dans Home Assistant, l’ESP32 doit « lire » la tension de la pile. Cependant, l’ESP32-C3 ne tolère pas plus de 2.5V sur ses entrées, alors que notre batterie atteint 4.2V. Si on la branche en direct, on grille la puce ! Il faut donc diviser cette tension par deux en utilisant deux résistances de valeur identique (ex : deux résistances de 100 kΩ ou 10 kΩ) :

  • Résistance 1 : Soudez une extrémité directement sur la sortie OUT+ du TP4056. Reliez l’autre extrémité à la broche GPIO4 de votre shield (rangée jaune).

  • Résistance 2 : Partez de ce même GPIO4 et reliez l’autre extrémité à une broche de masse GND.

Résultat : la tension est physiquement coupée en deux, protégeant votre ESP32. Notre code ESPHome se chargera simplement de la multiplier par deux informatiquement pour vous donner la vraie valeur !

📦 L'impression 3D : Un écrin sur-mesure de 6x6 cm

Qui dit composants miniatures, dit boîtier miniature. J’ai modélisé et imprimé en 3D un boîtier spécifique (en PETG pour résister au soleil) d’un encombrement total d’à peine 60×60 mm !

  • Design anti-pluie : Le dessus du boîtier a une forme d’arche. L’eau glisse naturellement sans jamais stagner.

  • Intégration millimétrée : L’intérieur est tout juste assez grand pour glisser la batterie LiPo au fond, le module TP4056 à la verticale, et le shield de l’ESP32-C3 par-dessus.

  • Connectique soignée : À l’arrière, un trou cylindrique accueille la prise Jack femelle étanche reliée au panneau solaire. Les fils de la sonde sortent par une petite encoche, scellée ensuite au silicone.

  • Fermeture : Une plaque inférieure vient s’emboîter par le dessous pour refermer et protéger le circuit des insectes et de l’humidité du sol.

💻 Le Code ESPHome final

Voici le code complet à injecter. Il a été spécialement optimisé pour la puce ESP32-C3. Son comportement est le suivant : il se réveille toutes les heures, allume le GPIO1 pour alimenter la sonde, attend 15 secondes qu’elle chauffe, lit l’humidité (GPIO0) et la batterie (GPIO4), envoie tout à Home Assistant, coupe le courant de la sonde et retourne dormir.

Il intègre également une sécurité (le bouton input_boolean.deep_sleep côté Home Assistant) permettant de garder la puce éveillée lors d’une mise à jour logicielle (OTA).

esphome:
  name: sonde-jardin-diy-2
  friendly_name: Sonde Jardin DIY 2
  on_boot:
    priority: -100
    then:
      - output.turn_on: gpio_sensor # Allume la sonde au démarrage
      - wait_until:
          condition:
            api.connected:
      - component.update: moisture
      - component.update: battery
      - component.update: battery_voltage
      - component.update: wifisignal
      - script.execute: deep_sleep_evaluation

esp32:
  board: esp32-c3-devkitm-1
  variant: esp32c3
  framework:
    type: arduino

logger:

api:
  encryption:
    key: "VOTRE_CLE_API"

ota:
  - platform: esphome
    password: "VOTRE_MOT_DE_PASSE"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.0.176
    gateway: 192.168.0.1
    subnet: 255.255.255.0
  fast_connect: true

substitutions:
  sleep_duration: 1h
  moisture_min: "2.6070" # Calibration à sec (À adapter à votre sonde !)
  moisture_max: "0.9350" # Calibration dans l'eau (À adapter à votre sonde !)

deep_sleep:
  id: deep_sleep_enabled
  sleep_duration: ${sleep_duration}

# Permet d'empêcher la mise en veille depuis HA (pour les MAJ OTA)
binary_sensor:
  - platform: homeassistant
    id: prevent_deep_sleep
    entity_id: input_boolean.deep_sleep
    publish_initial_state: true

output:
  - platform: gpio
    pin: GPIO1 # Alimentation de la sonde
    id: gpio_sensor

sensor:
  - platform: wifi_signal
    name: "WiFi Signal"
    id: "wifisignal"
    
  - platform: adc
    pin: GPIO0 # Lecture humidité
    name: "Moisture"
    id: "moisture"
    icon: "mdi:watering-can"
    device_class: 'moisture'
    state_class: 'measurement'
    attenuation: 11db # Le C3 nécessite 11db max
    accuracy_decimals: 2
    unit_of_measurement: '%'
    filters:
      - calibrate_linear:
          - ${moisture_min} -> 0.0
          - ${moisture_max} -> 100.0

  - platform: adc
    pin:
      number: GPIO4 # Lecture Batterie (via pont diviseur)
      allow_other_uses: true
    name: "Battery"
    id: "battery"
    device_class: 'battery'
    attenuation: 11db
    unit_of_measurement: '%'
    filters:
      - multiply: 2 # Compense la division par 2 physique du pont
      - calibrate_linear:
          - 3.0 -> 0
          - 3.3 -> 5
          - 3.5 -> 15
          - 3.65 -> 30
          - 3.75 -> 45
          - 3.85 -> 60
          - 3.95 -> 75
          - 4.1 -> 90
          - 4.2 -> 100

  - platform: adc
    pin:
      number: GPIO4
      allow_other_uses: true
    name: "Battery Voltage"
    id: "battery_voltage"
    attenuation: 11db
    unit_of_measurement: "V"
    icon: "mdi:battery-high"
    device_class: "voltage"
    state_class: "measurement"
    accuracy_decimals: 2
    filters:
      - multiply: 2

script:
  - id: deep_sleep_evaluation
    mode: queued
    then:
      - output.turn_on: gpio_sensor
      - delay: 15s # Temps de chauffe
      - component.update: moisture
      - component.update: battery
      - component.update: battery_voltage
      - component.update: wifisignal
      
      # Boucle de surveillance pour la mise à jour OTA
      - while:
          condition:
            binary_sensor.is_on: prevent_deep_sleep            
          then:
            - logger.log: 'Deep Sleep désactivé par Home Assistant. En attente...'
            - delay: 30s
            
      # Séquence d'endormissement
      - logger.log: 'Deep Sleep activé. Extinction de la sonde...'
      - output.turn_off: gpio_sensor # On coupe l'alimentation de la sonde !
      - delay: 3s
      - deep_sleep.enter: deep_sleep_enabled

Explications clés du code

  • deep_sleep : c’est la fonction magique ! L’ESP32 va se réveiller toutes les heures (sleep_duration: 1h), se connecter au Wi-Fi, envoyer ses données, puis se rendormir. La consommation pendant le sommeil est infime (quelques microampères).

  • output: gpio_sensor : on configure le GPIO26 comme un interrupteur. Dans le script, on allume ce port (output.turn_on) juste avant la mesure et on l’éteint (output.turn_off) juste avant de dormir. Cela permet de ne pas alimenter la sonde d’humidité en continu, économisant ainsi de précieux milliampères.

  • Calibrage de la sonde (calibrate_linear) : cette partie est essentielle. Pour obtenir un pourcentage d’humidité fiable, vous devez calibrer la sonde.

    1. Flashez une première fois le code en commentant (avec un #) les lignes unit_of_measurement: '%' et le filtre calibrate_linear pour lire la tension brute.

    2. Notez la valeur (moisture_min) quand la sonde est à l’air libre (complètement sèche).

    3. Notez la valeur (moisture_max) quand la sonde est plongée dans un verre d’eau.

    4. Reportez ces valeurs dans la section substitutions et décommentez les lignes.

  • Mesure de la batterie (multiply: 2) : le module de charge intègre un pont diviseur de tension pour ne pas envoyer plus de 3.3V à l’ESP32. Le filtre multiply: 2 rétablit la tension réelle de la batterie (qui peut monter jusqu’à 4.2V). On utilise ensuite un autre calibrate_linear pour transformer cette tension en un pourcentage plus parlant.

Intégration à Home Assistant et fiabilité

  • Une fois votre ESP32 flashé et connecté à votre Wi-Fi, Home Assistant le découvrira automatiquement via l’intégration ESPHome. Vous n’aurez plus qu’à l’ajouter et toutes les entités (humidité, batterie, température…) apparaîtront.

    Sur la fiabilité, ce montage a fait ses preuves.

    • Le choix d’une sonde capacitive évite la corrosion et garantit des mesures stables sur le long terme.

    • Le boîtier étanche est indispensable pour protéger l’électronique de la pluie et de l’humidité.

    • L’autonomie est excellente. Même avec plusieurs jours de temps gris, la batterie et la très faible consommation due au deep sleep permettent au système de continuer à fonctionner sans interruption. En été, la batterie reste constamment à 100%.

    Vous voilà avec une sonde sur-mesure, économique, et parfaitement autonome pour prendre soin de votre jardin comme un pro ! N’hésitez pas à poser vos questions en commentaire si vous vous lancez dans l’aventure. Bon bricolage !