Capteur humidité du Sol pour moins de 5€

SNAG-000119Dans ma lancé, après le capteur de niveau d’eau dans ma cuve de récupération je vais vous présenter un nouveau capteur très simple à réaliser pour mesurer l’humidité de votre sol et l’envoyer à domoticz.

Matériel :

  • RF transmiter : 433Mhz WL RF Transmitter (1€)
  • ATTINY85-20PU Pour ATMEL DIP-8 Tiny85-20PU  (6€ les 5 soit 1.20€ pièce)
  • Boite De Connexion Raccordement Etanche Plastique Electronique 100x60x25mm (1.15€)
  • 8 Pin Socket Solder Prototype Circuit Adaptor PCB Attiny85 (2.20€ les 10, soit 0.22€/pièce)
  • Une résistance de 100kΩ

(le matériel est quasiment identique à celui utilisé pour le capteur de niveau d’eau).

Schémas des connexions :

 

capteur_hum

Connexion Arduino / attiny85 pour capteur humidité pour domoticz

Code  :

Le code est disponible ici :  soil_moisture_sensors.ino

Dans Domoticz :

Si tout fonctionne correctement vous devriez vous apparaître dans domoticz un nouveau dispositif :

SNAG-000120

Ajoutez ce dispositif et déclarez le en compteur avec une unité « / 1024 » (car les données envoyées sont codé de 0 a 1024).

SNAG-000121

Cela va apparaître ensuite dans domoticz comme cela :SNAG-000122

Pour ma part j’ai créé ensuite un capteur virtuel de type « Humidité de surface » :

SNAG-000123

Capteur de type humidité dans domoticz

 

et j’ai créer un petit script /home/pi/domoticz/scripts/lua/script_device_hum_sol.lua pour l’alimenter et ajuster le résultat pour qu’il soit entre 0 et 100% :

commandArray = {}
--Cette fonction calcule la difference de temps (en secondes) entre maintenant
--et la date passee en parametre.
function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 16)
  seconds = string.sub(s, 18, 19)
  t1 = os.time()
  t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
  difference = os.difftime (t1, t2)
  return difference
end


if (timedifference(otherdevices_lastupdate['Capt_Hum_Sol_1']) < 30 and timedifference(otherdevices_lastupdate['Capt. Hum 1']) > 50)
then

   val = tonumber(otherdevices_svalues['Capt_Hum_Sol_1']);
   val1 = math.floor(100*(val/1024));
   --commandArray['UpdateDevice']='idx|nValue|sValue  nvalue=HUM&svalue=HUM_STAT
   commandArray['UpdateDevice']='354|'..val1..'|0';

   print('Capt. Hum 1 - '..val1..' %'.."  "..val)
end
return commandArray

Ici 354 correspond au numéro de capteur virtuel crée.

Et voila ce que ça donne dans domoticz :

les deux capteurs

A droite le capteur virtuel a gauche le capteur qui reçoit les données de la sonde.

Par la suite vous pouvez cachez la capteur « Capt_Hum_Sol_1 » en utilisant les $Hidden Devices.

Et dans le monde réel voici mon capteur : Les sondes sont faites avec du câble coaxial dont l’âme est partiellement dénudée, à priori ça fonctionne plutôt bien…

Comme le cuivre a tendance à s’oxyder rapidement j’ai étamer avec de l’étain les deux sondes.

Capteur

Capteur humidité du sol Aduino / Attiny85

Après quelques jours de mesure 

Après quelques jours de mesure

Les références qui m’ont aidé sur internet :

 

Cet article vous a plus, vous avez des commentaire / amélioration à apporter ? laissez un commentaire 🙂

 

 

 

36 réflexions sur « Capteur humidité du Sol pour moins de 5€ »

  1. lan

    Bonjour j ai essayé , mais un probleme dans le script [in /home/pi/domoticz/scripts/lua/script_device_hum_sol.lua: /home/pi/domoticz/scripts/lua/script_device_hum_sol.lua:5: bad argument #1 to ‘sub’ (string expected, got nil)] .

    Répondre
  2. spike

    Bonsoir, n’y aurait il pas une erreur sur le schéma de câblage au niveau de l’émetteur 433?
    il est indiqué :
    vcc émetteur sur Pin 3 ATtiny
    Data émetteur sur vcc 4,5v
    et gnd sur gnd
    ne faudrait il pas relier vcc émetteur sur 4,5v et data sur la pin 3 ATtiny ??
    Merci.

    Répondre
  3. Nicolas

    Bonjour,
    J’ai suivi votre tuto a la lettre mais je ne parviens pas a voir quoi que ce soit dans domoticz. Je me demande si la bibliotheque x10 fonctionne bien avec Arduino 1.6.7.

    Répondre
  4. Kham

    Bonjour,

    Peut on faire un serveur domoticz avec le récepteur 433 mhz (le même style que cet éméteur) avec les gpio

    Merci d’avance

    Répondre
  5. Djé

    Bonsoir, je me demandais si il est possible de faire la même chose avec une liaison sur un gpio ou bien ce n’est pas possible du fait de la limite des gpio à 0 ou 1??
    Ps: désolé si ma question peut paraitre celle d’un noob, mais je débute effectivement avec la domotique et raspberry….
    Merci d’avance 🙂

    Répondre
    1. Manu Auteur de l’article

      Bonjour,

      le délais d’envois des données est géré dans le fichier soil_moisture_sensors.ino

      ici :

      // Sleep for 8 s 8 x 75 = 600 s = 10m
      for (int i=0; i<75; i++){
      system_sleep();
      }

      il suffit donc de remplacer dans la boucle for 75 par la valeur qui va bien en fonction du temps que vous souhaitez entre 2 envois des données.

      1 = 8 S
      75 = 8 x 75 s = 600s = 10 min

      6 h = 21600 secondes
      21600 / 8 = 2700

      Donc dans le for() ... si vous remplacez 75 par 2700 il y aura l'envois des données toutes les 6h.

      En espérant vous avoir aidé.

      Répondre
      1. Dominiuqe

        Super merci de m’avoir répondu. J’ai lu que les sondes s’oxydaient vite si on relevait trop souvent les lectures. Avez vous eu ce problème ?

        Répondre
        1. Manu Auteur de l’article

          Non pas jusqu’à ce jour mais effectivement ça peux arriver.
          Pour augmenter la durée de vie des sonde vous pouvez également étamer avec de l’étain les sondes que vous plantez en terre.

          Répondre
          1. Dominiuqe

            Il y a longtemps, dans une revue d’électronique il écrivait que on pouvait récupérer les électrodes centrales des piles en graphite pour en faire des capteurs d’humidité. Elles ne s’oxydent pas parait il. A voir, je vais essayer.

  6. Dominique

    Dites il n’y aurait pas une erreur dans le schéma ? l’émetteur est branché dans le bon sens. Vous mettez le + sur l’entrée data ?

    Répondre
  7. Pouilloux Daniel

    Bonjour,
    Après avoir installé les bibliothèques Attiny85 et X10RF, je constate les erreurs suivantes lors de la compilation du croquis soil_moisture_sensor.ino avec ARDUINO 1.8.5 :
    In file included from E:\InstallDELL\Arduino\libraries\x10rf-master\x10rf.cpp:15:0:
    E:\InstallDELL\Arduino\libraries\x10rf-master\x10rf.h:25:19: error: expected ‘)’ before ‘tx_pin’
    x10rf(uint8_t tx_pin, uint8_t led_pin, uint8_t rf_repeats);
    E:\InstallDELL\Arduino\libraries\x10rf-master\x10rf.h:27:19: error: ‘uint8_t’ has not been declared
    void RFXmeter(uint8_t rfxm_address, uint8_t rfxm_packet_type, long rfxm_value);
    ….
    Une solution ?
    Cette solution fonctionne-t-elle avec un RFLINK 433 à la place d’un RFXCOM 433 ?
    D’avance merci,
    D. Pouilloux

    Répondre
  8. LaurentC

    Salut,

    Tout d’abord merci pour ces tutos bien fait notamment pour les modules a base de ATtiny :-D.

    Je m’en inspire pour faire un module de niveau a mesure ultrasons.
    Ca se passe bien mais…. Je récupère n’importe quoi comme valeur dans mon RFXmeter de domoticz.

    En effet la mesure se passe bien, la variable « mavaleur » est bonne mais mauvaise dans domoticz.

    Il n’y a pas de valeur a convertir en hexa? un truc du genre?
    Du coup quelques questions sur ton code

    x10rf myx10 = x10rf(RF_OUT,0,5);

    0 correspond a ?
    5 correspond a ?

    myx10.RFXmeter(3,0,ma_valeur);

    3 correspond a ?
    0 correspond a ?

    Merci de tes lumières car j’ai l’impression que j’interprète mal tout ça et je m’embourbe dans mon idée. et du coup je fait mal.

    Répondre
  9. Sty_X

    Bonjour,

    Bricoleur et avec quelques connaissances en informatique, je suis par contre absolument débutant dans la domotique et dans la programmation. Je souhaiterais cependant faire un projet similaire de capteur d’humidité du sol et le faire communiquer avec Domoticz installé sur un RPi. Mais directement en filaire.

    De là j’aurais plusieurs interrogations s’il est possible d’avoir un petit coup de pouce :
    – Quelles seraient les modifications à apporter au montage et au script ?
    – Faut-il une « unité de programmation » pour programmer le Attiny ou tout ce fait-il via le script stocké sur le RPi ?

    Merci de votre aide !

    Répondre
  10. Pouilloux

    Bonjour,
    J’ai personnellement opté pour une autre solution plus ouverte et facile à mettre avec DOMOTICZ.
    Elle est basée sur un soc Esp (Wemos D1 coût 5€), et le firmware open source ESPEASY. La communication avec DOMOTICZ se fait via WiFi (pas besoindde RFX) et le firmware supporte nativement une large variété de capteurs (en plus des entrées GPIO) dont un capteur d’humidité. L’installation est très facile et il  » y a ensuite que du paramétrage à effectuer.
    J’utilise cette solution depuis 18 mois sans problème problème avec plusieurs type de sondes ou actionneurs (capteur température, humidité, lumière, distance, contacts secs).
    Cordialement,
    D. pouilloux

    Répondre
    1. LaurentC

      Bonjour

      Oui tout à fait,

      J’en ai fait un thermostat de chaudière, un capteur extérieur particules, Co2, et lux. Un capteur particules, Co2 et polluant intérieur.

      Ça va plus vite en effet mais le côté WiFi n’est pas l’idéal à chaques fois

      Répondre
  11. Nicolas

    Bonjour,

    Je viens d’essayer votre solution, sans succès. Mon RFXCom ne reçois rien.
    Pourtant mes autres programmes à base de X10RF fonctionne sans soucis avec les mêmes composants.
    J’ai raccourcis le délais du sleep à 8sec pour être certains de ne pas louper la valeur mais ça n’envoie vraiment rien.

    Si je trouve une solution, j’ajouterais un commentaire.

    Répondre
  12. Laurent

    Salut Nicolas !

    Je m’en suis finalement sorti, j’ai dompté le 85. J’ai conçu deux capteurs à ultrasons pour le niveau de mon ruisseau et d’un réservoir d’eau. En x10.

    J’ai également fait un dérivé en x10 aussi pour me dire si j’ai du courrier dans ma boîte au lettres. Fonctionne comme un charme.

    Le tout sous domoticz.

    J’aimerai bien partager les codes mais je ne sais pas comment faire. Je n’ai pas de schéma non plus.

    Mais ca serai un partage volontier

    Répondre
    1. dominique

      Bonjour,

      J’aimerai bien voir ses codes car je n’ai jamais réussi à faire fonctionner ce montage. Peut tu l’envoyer par mail ?

      Répondre
      1. LaurentC

        Hello,

        Oui pas de problème je te fais ça demain avec quelques captures d’implémentation dans domoticz. Le temps de rendre ça lisible.

        Répondre
    2. Nico Ker49

      Bonjour Laurent,
      J’ai suivi ce Blog qui m’a bien aidé pour quelques réalisations.
      En lisant ton commentaire, un projet m’intéresse tout particulièrement.
      J’ai essayé, sans succès à ce jour, de réaliser un « détecteur » d’ouverture de ma boite aux lettres. En effet, celle-ci est assez loin de mon logement et j’aimerais savoir si le facteur est passé (oui, oui, je sais cela donne l’impression de fainéantise mais bon c’est le but du jeu avec la domotique !).
      Donc ton aide sur ta réalisation me serait plus qu’utile.
      Serait-il possible d’échanger par mail pour avoir plus d’explications ?
      Merci par avance pour ton retour et bonne journée à toi comme aux autres lecteurs de ce super site

      PS :
      Si d’autres souhaitent réaliser le même projet, mettons en commun nos idées …

      Répondre
    3. Ker49

      Bonjour,
      Je suis ce blog avec beaucoup d’intérêt.
      Je serais intéressé Laurent par votre solution pour votre boîte aux lettres.
      J’ai déjà testé certaines possibilités, pas concluantes.
      Pourriez-vous m’indiquer vos démarches ?
      Merci par avance pour votre aide,
      Nicolas

      Répondre
  13. Ping : Arrosage Autonome et Automatique #1 Liste des courses | Domotic and stupid geek stuff

  14. Ping : Arrosage Autonome et Automatique – Présentation | Domotic and stupid geek stuff

  15. Ping : Arrosage Autonome et Automatique #2 Schémas | Domotic and stupid geek stuff

  16. Laurent

    Hi!

    Facile! (sur le principe) mais quand ca fonctionne ça fonctionne super bien!

    Alors:

    J’alimente mon circuit attiny85 avec un bloc de 4 piles.

    1 – J’alimente mon capteur via une PIN de l’Attiny

    il s’agit d’un KY-032 / FC-51 placé sur le plafond de ma boite au lettre, en bas de la boite au lettre un sticker réfléchissant.

    2 – Je lis la retour du capteur (0 ou 1) sur une autre patte de mon attiny.

    3 – je coupe l’alim du capteur

    4 – j’alimente mon TX 433MH

    5 – via la librairie X10 j’envois en 433mhz On ou Off a ma domotique

    6 – Je coupe l’alim de mon TX

    7 – Je met l’attiny en sommeil.

    Cette solution, je l’utilise pour:

    – capteur a ultrason, surveillance niveau d’un Ru dans mon jardin, niveau d’eau dans ma cave
    – thermocouple, température de mon insert afin de gérer mes radiateurs comme il faut si je fait un feu.
    – capteur de pression pour mes récupérateurs d’eau
    – capteur humidité du sol (avec capteurs inductifs)
    – capteur de pluie

    Je tiens environ 1an pour les capteurs extérieurs et bien plus pour les capteurs en intérieur.

    NB 1: Il faut parfois laisser du temps entre l’alimentation du capteur et sa lecture (je temporise Entre 4 et 6 secondes en général)

    NB2 : Selon la conso des capteurs il faut les alimenter non pas directement via une pin du attiny mais via un transistor piloté par une patte de l’Attiny (cas du thermocouple)

    tcho!

    Répondre
    1. Laurent

      Pour info,

      fiable a 95%. Je ne m’en lasse pas. Domoticz est connecté a une tablette tactile dans l’entrée de la maison pour gérer les températures, l’alarme, store banne etc.

      Elle m’envois un petit message vocal des que le facteur est passé. (je check la boite toutes les 8 minutes pour info.)

      Répondre
  17. Laurent

    Pour info le code tel quel.
    C’est du pompé et adapté.

    /*Capteur courrier boite au lettre 433mhz pour domiticZ
    * 16/08/2018
    * pour puce Attiny85
    */

    #include
    #include

    // including low power consuption libraries // by default in Arduino library
    #include
    #include

    // consuption libraries function define
    #ifndef cbi
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #endif
    #ifndef sbi
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    #endif

    int PowerSensor = 1; //Alimentation capteur reflexion
    int PowerTX = 0; //Alimentation TX 433Mhz
    int ReadPin = 3; // pin de lecture du capteur
    int State = 0; //Variable d’état retour capteur reflexion

    #define tx 4 // Pin number 433mhz transmitter
    #define reps 8 // répétition de l’envois par le RF 433mhz
    #define ledpin 0 // Pin for the led that blinks when a command is send. (0 = no blink)

    volatile boolean f_wdt = 1;

    x10rf myx10 = x10rf(tx,reps,reps);

    void setup() {
    //Define inputs and outputs
    pinMode(ReadPin, INPUT);
    pinMode(PowerSensor, OUTPUT);
    pinMode(PowerTX, OUTPUT);

    myx10.begin();

    setup_watchdog(9); // Approximately 8 seconds sleep

    }

    void loop() {

    //Alimentation du capteur
    digitalWrite(PowerSensor, HIGH);
    delay (20000);

    //On recupere l’état dans une variable (State)
    State=digitalRead(ReadPin);
    delay (500);
    //On desalimente le capteur
    digitalWrite(PowerSensor, LOW);

    //on traite le message a envoyer.
    //On alimente le TX 433mhZ
    digitalWrite(PowerTX, HIGH);
    delay (3000);

    if(State==0)
    {
    // on envois le message cas 0
    myx10.x10Switch(‘A’,4, 0); // Switch B4 on
    }
    else
    {
    // on envois le message cas 1
    myx10.x10Switch(‘B’,3, 0); // Switch B4 on

    }
    delay (1000);
    //on désalimente le capteur
    digitalWrite(PowerTX, LOW);
    delay (500);

    // Sleep for 8 s 8 x 52 = 420 s = 7m
    for (int i=0; i 9 ) ii=9;
    bb=ii & 7;
    if (ii > 7) bb|= (1<<5);
    bb|= (1<<WDCE);
    ww=bb;

    MCUSR &= ~(1<<WDRF);
    // start timed sequence
    WDTCR |= (1<<WDCE) | (1<<WDE);
    // set new watchdog timeout value
    WDTCR = bb;
    WDTCR |= _BV(WDIE);
    }

    // Watchdog Interrupt Service / is executed when watchdog timed out
    ISR(WDT_vect) {
    f_wdt=1; // set global flag

    }

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

 

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.