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% 80% avec une dérive max de + où - 3% théorique. plage de mesure mini et maxi de 0% 100%
  • la température de -10°c 80°c avec une dérive de 0.4°c théorique. plage de mesure mini et maxi de -40°c 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 récupéré plus de bits du fait de sa résolution, nous utiliserons seulement le mode hold master 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é la programmation.

dans un premier temps nous incluons la libraire wire qui gère le bus i2c.
code: [select]
#include <wire.h>
 

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

code: [select]
#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.  
code: [select]
float temperature, humidity;

voici la fonction si7021_write_reg qui pour fonction d'écrire des paramètres dans un registre de contrôle.
code: [select]
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 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).  
code: [select]
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 celle précédemment expliqué.
code: [select]
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.
code: [select]
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.  :)


Arduino Forum > International > Français > Tutoriels et cours (Moderators: jfs, Snootlab) > Je souhaite mesurer l'humidité relative et la température avec précision


arduino

Comments