Dans 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 :
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 :
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).
Cela va apparaître ensuite dans domoticz comme cela :
Pour ma part j’ai créé ensuite un capteur virtuel de type « Humidité de surface » :
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 :
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.
Les références qui m’ont aidé sur internet :
- Capteur pour Plantes DIY
- Capteur maison arduino
- echofab.org
- DIY : un montage à base d’Arduino pour arroser vos plantes
Cet article vous a plus, vous avez des commentaire / amélioration à apporter ? laissez un commentaire 🙂
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)] .
Après mise a jour Domoticz plus de problème tout fonctionne.
merci.
Bonjour,
Quel est la durée de vie des piles en le laissant 24h/24?
Merci
Bonjour,
Ça fait plus d’un an que je l’utilise et il est toujours fonctionel.
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.
Bonsoir, l’auteur de l’article vient il toujours sur le site car au bout d’un mois toujours pas de réponse???
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.
Je n’y arrive pas non plus. Mon RFXcom ne voit pas les trames…
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
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 🙂
Bonjour,
Comment je dois faire si je veux une mesure toutes les six heures ?
Merci d’avance
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é.
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 ?
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.
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.
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 ?
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
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.
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 !
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
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
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.
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
Bonjour,
J’aimerai bien voir ses codes car je n’ai jamais réussi à faire fonctionner ce montage. Peut tu l’envoyer par mail ?
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.
Super merci beaucoup
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 …
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
Ping : Arrosage Autonome et Automatique #1 Liste des courses | Domotic and stupid geek stuff
Ping : Arrosage Autonome et Automatique – Présentation | Domotic and stupid geek stuff
Ping : Arrosage Autonome et Automatique #2 Schémas | Domotic and stupid geek stuff
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!
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.)
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
}
Bonjour
Beau travail. Est il possible d’avoir une ou des photos des sondes réalisées avec du coaxial ?
Merci
SP
Oui c’est effectivement des bouts de cable coaxial !