Je souhaite mesurer l'humidité relative et la température avec précision

Problème : Je souhaite mesurer l'humidité relative et la température avec précision.

Solution : Utiliser un capteur avec une très grande résolution avec comme avantages

  • Cout
  • Disponibilité
  • Facilité de mise en oeuvre
  • Faible encombrement (nombre de broches nécessaires, taille du capteur)
  • Faible consommation énergétique

Un capteur qui satisfait tous les critères listés ci-dessus est le Si7021 de Sillicon Labs.

Ce capteur nous permet de mesurer avec précision

  • l'humidité de 0% a 80% avec une dérive max de + où - 3% théorique. Plage de mesure mini et maxi de 0% a 100%
  • la température de -10°C a 80°C avec une dérive de 0.4°C théorique. Plage de mesure mini et maxi de -40°C a 140°C

Il est interfaçable seulement en liaison série i2c, une tension d'alimentation de 3.3V max est nécessaire pour le piloter.
Mise en oeuvre : Pour la réalisation j'utiliserais une carte Arduino Pro Mini alimentée en 3.3V, pour le "debuggage" le module UART et un analyseur logique pour snifer les trames i2c font un parfait combo.

Synthèse de la documentation constructrice : Pour récupérer les valeurs de l'humidité relative et de la température, nous devons suivre le protocole listé par le constructeur.

  • Condition de Start.
  • Adresse de l'esclave avec bit de lecture ou écriture.
  • Adresse du registre | commande
  • Demande d'un nombre x d'octets dans le cas d'une lecture
  • Écriture du registre dans le cas d'une demande d'écriture
  • Condition de stop.

Pour notre capteur la procédure est similaire seulement que nous avons a récupéré plus de bits du fait de sa résolution, nous utiliserons seulement le mode HOLD MASTER a traduire par le maitre garde toujours la main du bus i2c.

Les registres contenant les résultats des mesures sont accessibles en envoyant une commande spécifique au capteur, en outre les commandes nous permettent aussi de configurer 2 registres de contrôle dont un qui gère le heater, une résistance chauffante incorporée dans le composant qui permet de chasser la condensation si besoin.

Programmation : Apres avoir synthétiser la datasheet nous pouvons désormais passé a la programmation.

Dans un premier temps nous incluons la libraire Wire qui gère le bus i2c.

#include <Wire.h>

Nous définissons l'adresse de 7 bits de notre capteur avec les valeurs des commandes de manière transparente.

#define SI7021_Addr 0x40

#define RESET                                  0xFE
#define HTRE                                   0x04
#define MEASURE_RH_HOLD_MASTER                 0xE5
#define MEASURE_RH_NO_HOLD_MASTER              0xF5
#define MEASURE_TEMPERATURE_HOLD_MASTER        0xE3
#define MEASURE_TEMPERATURE_NO_HOLD_MASTER     0xF3
#define MEASURE_TEMPERATURE_PREVIOUS_RH        0xE0
#define WRITE_RHT_USER_REGISTER                0xE6
#define READ_RHT_USER_REGISTER                 0xE7
#define WRITE_HEATER_CONTROL_REGISTER          0x51
#define READ_HEATER_CONTROL_REGISTER           0x11

Initialisation des variables globales où l'on récupèrera l'humidité et la température, à noter qu'il est fortement recommandé d'utiliser un type de variable réel pour une question de précision.

float temperature, humidity;

Voici la fonction Si7021_WRITE_REG qui a pour fonction d’écrire des paramètres dans un registre de contrôle.

void SI7021_WRITE_REG(byte reg, byte value) {
  Wire.beginTransmission(SI7021_Addr);
  Wire.write(reg);
  Wire.write(value);
  Wire.endTransmission();
  }

La fonction SI7021_READ_RH nous permet d'effectuer une mesure de l'humidité relative.
int rhlsb et int rhmsb sont 2 variables locales (comme toutes celles entre accolades) qui on pour but de stocker le LSB et le MSB renvoyés après une conversion, unsigned int rh_code combinera rhlsb et rhmsb, double rh est la variable retourner par la fonction après le calcul mathématique elle contiendra l'humidité relative.

A noter que la fonction prend pour paramètre une des commandes listées ci-dessus 'voir datasheet pour plus de details).

float SI7021_READ_RH(unsigned char rhSetting) {
  int rhlsb, rhmsb; 
  unsigned int rh_code;
  double rh; 
  
  Wire.beginTransmission(SI7021_Addr);
  Wire.write(rhSetting);
  Wire.endTransmission();
  Wire.requestFrom(SI7021_Addr, 2);
  if (Wire.available()) {
  rhmsb = Wire.read(); 
  rhlsb = Wire.read();
  }
  Wire.endTransmission();
  
  rh_code = (rhmsb << 8) | rhlsb;
  return rh = ((125.0 * rh_code) / 65536) - 6;
  }

Le principe de fonctionnement de SI7021_READ_TEMP est similaire a celle précédemment expliqué.

float SI7021_READ_TEMPERATURE(unsigned char tempSetting) {
  int templsb, tempmsb, temp_code;
  double temp;
  
  Wire.beginTransmission(SI7021_Addr);
  Wire.write(tempSetting);
  Wire.endTransmission();
  
  Wire.requestFrom(SI7021_Addr, 2);
  if (Wire.available()) {
  tempmsb = Wire.read(); 
  templsb = Wire.read();
  }
  Wire.endTransmission();
  
  temp_code = (tempmsb << 8) | templsb;
  return temp = ((175.72 * temp_code) /  65536) - 46.85;
  }

Pour finir la programmation, il nous reste plus qu'à mettre en application nos fonctions, le paramètre MEASURE_TEMPERATURE_PREVIOUS_RH nous permet de récupérer la température lors de prise de l'humidité relative, un gain de temps considérable.

humidity = SI7021_READ_RH(MEASURE_RH_HOLD_MASTER);
température = SI7021_READ_TEMPERATURE(MEASURE_TEMPERATURE_PREVIOUS_RH);

Bonjour

Intéressant ce module

Mais "facilité de mise en œuvre" me laisse un peu perplexe, au plan hardware.
Ce module fait 3mmx3mm et est packagé en DFN.

Pas trop galère la jonction électrique avec l'arduino ?

Moi qui suis le spécialiste des pâtés d'étain, je ne vois pas trop comment souder ça à la main. :slight_smile:

Par facilité de mise en oeuvre je souhaite dire qu'il est tres facile a mettre en marche (obtenir l'humidité et la température).

A moins d'avoir la machine, les outils et surtout la technique oui je confirme c'est très dur de souder ça.

Mais rappelons que nous faisons seulement du prototypage la plus part du temps c'est capteur sont sous forme de "breakout"

Oui effectivement, j'ai vu que ce capteur se vend aussi sur un petit circuit imprimé avec connecteurs classiques, ce qui nettement plus à notre portée.

C'est une bonne alternative au DHT22 (AM2302).
A performaces équivalentes il possède une "vraie" datasheet et la commande est normalisée contrairement au DHT22 qui utilise un protocole personnalisé quelque peu trop rapide pour les fonctions digitalRead().

Le point négatif est pour le moment la disponibilité et le prix.
Je viens de regarder sur Ebay (CI monté sur carte):
Un produit à ~ 3€ et un autre à ~ 7 €
C'est peu mais à surveiller.

Ce capteur est comme même récent, avec la demande le prix chutera.
Je projete de faire quelques autres tuto sur des capteurs numérique sur les quels j'ai déjà travaillé.

Avis très personnel : je préfère un document sous forme de fichier au format odt

  1. C'est plus facile à maintenir pour l'auteur
  2. C'est plus facile à archiver pour l'utilisateur.
  3. Il est possible de l'adapter à ses besoins.

Mon premier tuto était en odt, j'ai eu une levée de bouclier : "C'est quoi ce format on peut pas le lire" alors que c'était le seul format réellement ISO. J'ai cédé à la demande et j'ai publié des pdf.

Quelques années plus tard on peut espérer que les choses ont évolué d'autant que µ$Word gère obligatoirement ce format.

Ce n'est que mon avis.

Pourquoi pas, c'est une bonne idée, je prend en compte pour les futur tuto.

Ajout d'une librairie très simple pour l'IDE Arduino :

Si7021_Library_V1.0

Les jeunes vous vous compliquez l'existance pour le plaisir

Pourquoi se faire ch**r à passer par Gogole ?
Les quelques kilo octets peuvent passer en pièces jointes sur ce forum.
Le plus simple c'est d'éditer ton premier message et d'y joindre la dernière version de ta bibliothèque.

Cela dit c'est une très bonne initiative .
Merci.

Mais Google Drive me facilite la vie, je peut programmer et sauvegarder mes codes ou que se soit, avec mon pc de bureau ou le portable, mais bon c'est vrais que le coup de la pièces jointes j'y est jamais pensé !

mais bon c'est vrais que le coup de la pièces jointes j'y est jamais pensé !

Pas de chance pour toi nous c'est aux pièces jointes qu'on pense en premier :grin: