• Première étape
  • Matériel et accessoires ; GPIO
  • Projets
  • Logiciel
    • Serveur Web
  • Arduino & ESP8266
  • Automatisation de la maison
  • Sonstiges
    • News
Facebook Twitter YouTube
Tutorials for Raspberry Pi Tutorials for Raspberry Pi
  • Matériel et accessoires ; GPIO
  • Projets
  • Logiciel
  • Serveur Web
  • Première étape
  • Automatisation de la maison
  • Anglais
  • Allemand
Tutorials for Raspberry Pi Tutorials for Raspberry Pi
Home»Matériel et accessoires ; GPIO»Lire la gravité du capteur capacitif d’humidité du sol DFROBOT sur le Raspberry Pi

Lire la gravité du capteur capacitif d’humidité du sol DFROBOT sur le Raspberry Pi

Facebook Twitter LinkedIn Tumblr Email Reddit
Capacitive Moisture Sensor Raspberry Pi
Share
Facebook Twitter LinkedIn Email Tumblr Reddit Telegram WhatsApp

Dans le cadre de la mesure de l’humidité du sol sur un Raspberry Pi, il existe des capteurs résistifs et capacitifs, qui présentent chacun des avantages et des inconvénients. L’innovante machine à couler Raspberry Pi / DFROBOT Gravity ou capteur « Giess-o-Mat » fournit une mesure capacitive précise et permanente, qui peut notamment être très intéressante dans notre serre Raspberry Pi.

Ce tutoriel traite de la structure de la machine à couler Raspberry Pi ainsi que de la lecture de la fréquence, à l’aide de laquelle l’humidité relative du sol peut être calculée.

Comme plusieurs utilisateurs me l’ont demandé et qu’il n’y a pas beaucoup de matériel sur le sujet (en ce qui concerne le Raspberry Pi), j’espère que ce tutoriel rendra son utilisation un peu plus facile.

 

Pièces détachées nécessaires

Pour cela, j’ai pris les pièces ou composants matériels suivants :

  • Raspberry Pi 4
  • Capteur d’humidité capacitif DFROBOT Gravity ou « Giess-o-Mat ».
  • Facultatif : diviseur de fréquence
  • alternativement : plusieurs résistances de 100kΩ
  • Câble Jumper
  • Fer à souder + soudure

Je recommande de prendre tout de suite la version enrobée de la carte, sinon, il faudra de toute façon la sceller à la main. Les composants fournis de la carte/capteur (listés ci-dessous) sont au format SMD et ne conviennent donc pas vraiment aux débutants. Avec un peu d’habileté, la taille ne devrait pas être un problème.

Le diviseur de fréquence peut également être remplacé par une résistance. Dans ce cas, la résistance 100kΩ en position R3 (voir ci-dessous) est remplacée par une résistance plus grande : Si la fréquence est divisée par deux, on prend une résistance deux fois plus grande, etc. Il est bien sûr possible de combiner plusieurs résistances.

 

Avantages par rapport aux capteurs d’humidité résistifs

Resistive earth moisture sensor
Les capteurs d’humidité à terre résistive ne durent souvent pas longtemps.

Dans un précédent tutoriel, nous avons connecté et lu un capteur d’humidité du sol à très bas prix sur le Raspberry Pi. Cependant, cette conception présente un problème qui survient avec le temps : la corrosion. Après une utilisation prolongée avec la même polarité, les capteurs se décomposent souvent partiellement. Cela n’est pas bon pour le comportement de mesure ni pour les valeurs du sol.

Ce danger n’existe pas avec les capteurs capacitifs. Dans ce cas, cependant, aucun signal analogique n’est émis, qui peut être lu avec un ADC MCP3008, mais une fréquence qui varie en hauteur – en fonction de l’humidité de la terre (plus elle est humide, plus elle est basse).

Le Raspberry Pi, c’est pourquoi nous utilisons un diviseur de fréquence qui la divise par un certain dividende, ou simplement une plus grande résistance. L’inconvénient d’un diviseur de fréquence est son prix, car une simple résistance ne coûte presque rien.

 

Montage de la machine de moulage Raspberry Pi

Le Giess-o-Mat n’est généralement pas livré monté, c’est pourquoi les composants SMD individuels n’ont pas encore été soudés sur la carte. Comme ils sont très petits, un regard sur l’étiquette aide. J’ai également essayé de documenter chaque étape avec des photos, afin que rien ne se passe mal.

Le capteur de gravité DFROBOT est plus facile à manipuler : Il n’y a pas de soudure à faire, vous pouvez donc ignorer cette étape.

La fiche d’aide suivante se trouve dans le sac des composants :

Description Type Étiquettes Fonction
T1 BC847B 1Ft od. 1FW Transistor
C1 10μF 10V Condensateur
IC1 74HC14D HC14 IC
D1 BZX84B5V6 T12 or Z3 Diode Zener 5v6
R1 1k 102 od. 1001 Résistance 1k
R2 100R 101 od. 1000 Résistance 100R
R3 100k 104 od. 1003 Résistance 100k

Commençons par le circuit intégré. Il est important que le côté avec la marque « up » montre où la petite encoche ronde est visible sur le PCB.

Le condensateur (C1) n’a pas d’étiquette et il importe peu de savoir quel côté est soudé à quel endroit :

Avec les résistances (R1, R2, R3) vous devez faire attention car l’inscription SMD ne correspond pas à la taille réelle. Sur cette page, vous pouvez simplement entrer la valeur imagée de la résistance SMD et obtenir le calcul de la taille réelle.

Si vous n’avez pas de diviseur de fréquence, vous pouvez également utiliser une résistance plus grande à la place de R3 (comme décrit ci-dessus).

 

Ensuite, il manque le seul transistor (T1) et la diode Zener (D1), qui ont la même forme. Ici encore, aide l’étiquette du dessus :

 

Monter le diviseur de fréquence (facultatif).

De la même manière que la machine de moulage, nous construisons également le diviseur de fréquence si nous en avons un.

D’abord la table :

Description Type Étiquettes Fonction
T1 BC847B 1Ft, 1F-, 1FW Transistor
C1 10μF 10V Condensateur
IC1 74HC4040 HC4040 IC
D1 BAS40 43t, 43-, 43p, 43W Diode Schottky
R1, R2 2k2 222, 2201 Résistance 2k2

Encore une fois, nous commençons par le circuit intégré, le condensateur et les résistances. La taille de R1 et R2 est identique.

frequency divider

Il manque toujours le transistor (T1) et la diode (D1). Faites à nouveau attention à l’étiquette, car le modèle est identique :

frequency divider 2

 

Enfin, les deux contacts de  » : 16″ sont soudés ensemble, ce qui donne une fréquence 16 fois plus basse.

En outre, j’ai soudé les deux cartes ensemble et soudé au diviseur de fréquence quelques contacts pour le câble jumper.

Raspberry Pi Giessomat

 

 

Un script pour lire la fréquence

Connectez d’abord V + et 3.3V au Raspberry Pi, GND à GND et OUT par exemple à GPIO21.

Pour lire la fréquence sur le Raspberry Pi, il y a la bibliothèque PiGPIO, qui apporte des bibliothèques pour C (++), Python, etc. Elle est déjà préinstallée sur les versions ordinaires de Raspbian (pas Lite), sinon on peut l’installer après :

sudo apt-get update
sudo apt-get install pigpio python-pigpio python3-pigpio

 

Ensuite, nous créons un nouveau fichier C, qui est là pour lire la fréquence :

sudo nano freq_count_1.c

Ce fichier a le contenu suivant (exemple d’ici). Enregistrez avec CTRL + O et renvoyez CTRL + X au terminal.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
 
#include <pigpio.h>
 
/*
2014-08-20
 
gcc -o freq_count_1 freq_count_1.c -lpigpio -lpthread
$ sudo ./freq_count_1  4 7 8
 
This program uses the gpioSetAlertFunc function to request
a callback (the same one) for each gpio to be monitored.
 
EXAMPLES
 
Monitor gpio 4 (default settings)
sudo ./freq_count_1  4
 
Monitor gpios 4 and 8 (default settings)
sudo ./freq_count_1  4 8
 
Monitor gpios 4 and 8, sample rate 2 microseconds
sudo ./freq_count_1  4 8 -s2
 
Monitor gpios 7 and 8, sample rate 4 microseconds, report every second
sudo ./freq_count_1  7 8 -s4 -r10
 
Monitor gpios 4,7, 8, 9, 10, 23 24, report five times a second
sudo ./freq_count_1  4 7 8 9 10 23 24 -r2
 
Monitor gpios 4, 7, 8, and 9, report once a second, sample rate 1us,
generate 2us edges (4us square wave, 250000 highs per second).
sudo ./freq_count_1  4 7 8 9 -r 10 -s 1 -p 2
*/
 
#define MAX_GPIOS 32
 
#define OPT_P_MIN 1
#define OPT_P_MAX 1000
#define OPT_P_DEF 20
 
#define OPT_R_MIN 1
#define OPT_R_MAX 10
#define OPT_R_DEF 5
 
#define OPT_S_MIN 1
#define OPT_S_MAX 10
#define OPT_S_DEF 5
 
static volatile int g_pulse_count[MAX_GPIOS];
static volatile int g_reset_counts;
static uint32_t g_mask;
 
static int g_num_gpios;
static int g_gpio[MAX_GPIOS];
 
static int g_opt_p = OPT_P_DEF;
static int g_opt_r = OPT_R_DEF;
static int g_opt_s = OPT_S_DEF;
static int g_opt_t = 0;
 
void usage()
{
   fprintf
   (stderr,
      "\n" \
      "Usage: sudo ./freq_count_1 gpio ... [OPTION] ...\n" \
      "   -p value, sets pulses every p micros, %d-%d, TESTING only\n" \
      "   -r value, sets refresh period in deciseconds, %d-%d, default %d\n" \
      "   -s value, sets sampling rate in micros, %d-%d, default %d\n" \
      "\nEXAMPLE\n" \
      "sudo ./freq_count_1 4 7 -r2 -s2\n" \
      "Monitor gpios 4 and 7.  Refresh every 0.2 seconds.  Sample rate 2 micros.\n" \
      "\n",
      OPT_P_MIN, OPT_P_MAX,
      OPT_R_MIN, OPT_R_MAX, OPT_R_DEF,
      OPT_S_MIN, OPT_S_MAX, OPT_S_DEF
   );
}
 
void fatal(int show_usage, char *fmt, ...)
{
   char buf[128];
   va_list ap;
 
   va_start(ap, fmt);
   vsnprintf(buf, sizeof(buf), fmt, ap);
   va_end(ap);
 
   fprintf(stderr, "%s\n", buf);
 
   if (show_usage) usage();
 
   fflush(stderr);
 
   exit(EXIT_FAILURE);
}
 
static int initOpts(int argc, char *argv[])
{
   int i, opt;
 
   while ((opt = getopt(argc, argv, "p:r:s:")) != -1)
   {
      i = -1;
 
      switch (opt)
      {
         case 'p':
            i = atoi(optarg);
            if ((i >= OPT_P_MIN) && (i <= OPT_P_MAX))
               g_opt_p = i;
            else fatal(1, "invalid -p option (%d)", i);
            g_opt_t = 1;
            break;
 
         case 'r':
            i = atoi(optarg);
            if ((i >= OPT_R_MIN) && (i <= OPT_R_MAX))
               g_opt_r = i;
            else fatal(1, "invalid -r option (%d)", i);
            break;
 
         case 's':
            i = atoi(optarg);
            if ((i >= OPT_S_MIN) && (i <= OPT_S_MAX))
               g_opt_s = i;
            else fatal(1, "invalid -s option (%d)", i);
            break;
 
        default: /* '?' */
           usage();
           exit(-1);
        }
    }
   return optind;
}
 
void edges(int gpio, int level, uint32_t tick)
{
   int g;
 
   if (g_reset_counts)
   {
      g_reset_counts = 0;
      for (g=0; g<MAX_GPIOS; g++) g_pulse_count[g] = 0;
   }
 
   /* only record low to high edges */
   if (level == 1) g_pulse_count[gpio]++;
}
 
int main(int argc, char *argv[])
{
   int i, rest, g, wave_id, mode;
   gpioPulse_t pulse[2];
   int count[MAX_GPIOS];
 
   /* command line parameters */
 
   rest = initOpts(argc, argv);
 
   /* get the gpios to monitor */
 
   g_num_gpios = 0;
 
   for (i=rest; i<argc; i++)
   {
      g = atoi(argv[i]);
      if ((g>=0) && (g<32))
      {
         g_gpio[g_num_gpios++] = g;
         g_mask |= (1<<g);
      }
      else fatal(1, "%d is not a valid g_gpio number\n", g);
   }
 
   if (!g_num_gpios) fatal(1, "At least one gpio must be specified");
 
   printf("Monitoring gpios");
   for (i=0; i<g_num_gpios; i++) printf(" %d", g_gpio[i]);
   printf("\nSample rate %d micros, refresh rate %d deciseconds\n",
      g_opt_s, g_opt_r);
 
   gpioCfgClock(g_opt_s, 1, 1);
 
   if (gpioInitialise()<0) return 1;
 
   gpioWaveClear();
 
   pulse[0].gpioOn  = g_mask;
   pulse[0].gpioOff = 0;
   pulse[0].usDelay = g_opt_p;
 
   pulse[1].gpioOn  = 0;
   pulse[1].gpioOff = g_mask;
   pulse[1].usDelay = g_opt_p;
 
   gpioWaveAddGeneric(2, pulse);
 
   wave_id = gpioWaveCreate();
 
   /* monitor g_gpio level changes */
 
   for (i=0; i<g_num_gpios; i++) gpioSetAlertFunc(g_gpio[i], edges);
 
   mode = PI_INPUT;
 
   if (g_opt_t)
   {
      gpioWaveTxSend(wave_id, PI_WAVE_MODE_REPEAT);
      mode = PI_OUTPUT;
   }
 
   for (i=0; i<g_num_gpios; i++) gpioSetMode(g_gpio[i], mode);
 
   while (1)
   {
      for (i=0; i<g_num_gpios; i++) count[i] = g_pulse_count[g_gpio[i]];
 
      g_reset_counts = 1;
 
      for (i=0; i<g_num_gpios; i++)
      {
         printf(" %d=%d", g_gpio[i], count[i]);
      }
 
      printf("\n");
 
      gpioDelay(g_opt_r * 100000);
   }
 
   gpioTerminate();
}
 
 

Ensuite, nous compilons les fichiers :

gcc -Wall -pthread -o freq_count_1 freq_count_1.c -lpigpio -lrt

Maintenant le programme peut déjà être appelé. Il faut seulement spécifier la broche GPIO correspondante, à laquelle « OUT » est connecté (par exemple 21) :

sudo ./freq_count_1 21

Ensuite, le numéro du GPIO suivi de la fréquence (en Hz) s’affiche. À titre de test, vous pouvez mettre le capteur dans un verre d’eau et observer la diminution de la fréquence.

Dans un projet comme la serre Raspberry Pi, il est maintenant important de trouver la valeur optimale. Cependant, cela dépend du sol, de l’irrigation et des plantes et ne peut donc pas être répondu clairement. Pour moi, l’humidité totale (verre d’eau) a donné une fréquence d’environ 1000Hz, avec une sécheresse totale (aucun matériau conducteur) environ 10kHz (avec un diviseur de fréquence de 16).

Si vous utilisez un script Python, vous pouvez également étendre/raccourcir le programme C supérieur et l’intégrer dans votre script Python.

 

Autres informations sur Giess-o-Mat

Des informations supplémentaires sur la machine de moulage sont disponibles e.a. sur les pages suivantes, dont la plupart sont à utiliser avec Arduino et/ou ESP8266 et moins avec le Raspberry Pi. Néanmoins, je pense que cela peut valoir la peine de lire des liens pour les personnes intéressées :

  • https://www.mikrocontroller.net/articles/Giess-o-mat
  • https://github.com/Zentris/erdfeuchtemessung
  • http://www.n8chteule.de/zentris-blog/category/erdfeuchtemessung/
  • https://wwwvs.cs.hs-rm.de/vs-wiki/index.php/Internet_der_Dinge_WS2015/SmartPlant#Messmethode_2:_Kapazitiv

Si vous connaissez une autre bonne source, vous pouvez la poster en commentaire afin que je puisse élargir la liste.

Fréquence Giess-o-Mat humidité Humidité Humidité du sol Hygromètre Mesure de l'humidité Module de détection Moisture
Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
Previous ArticleModule GSM Raspberry Pi – Internet mobile (LTE, 3G, UMTS)
Next Article 3D-Druck Server: Auf dem Raspberry Pi OctoPrint mit Livecam einrichten

Related Posts

Connecter un clavier Raspberry Pi – Code Lock

Construire un capteur de porte / fenêtre Raspberry Pi avec Reed Relais

MCP3008 : Lire des signaux analogiques sur le Raspberry Pi

Contrôler le module RTC de Raspberry Pi – Horloge temps réel I2C

Leave A Reply Cancel Reply

7 segments d’affichage (anode) avec MAX7219 / MAX7221 et Raspberry Pi

Création d’un certificat SSL Raspberry Pi gratuit avec Let’s Encrypt

Comment configurer caméra de sécurité Raspberry Pi Livestream

Contrôlez les prises sans fil Raspberry Pi (433MHz) – Tutoriel

Mesure de la température avec un capteur de température Raspberry Pi (1-Wire)

Construisez votre propre boussole Raspberry Pi (HMC5883L)

ABONNEZ-VOUS MAINTENANT
Et recevez de nouveaux tutoriels dans votre boîte de réception.
Cliquez ici pour soumettre!

Merci!

Nous vous contacterons bientôt.

Tutorials for Raspberry Pi
Facebook Twitter YouTube
  • Politique de confidentialité
  • Conditions de service & Politique sur les cookies

Type above and press Enter to search. Press Esc to cancel.