Si7021

Salut

j'utilise ce superbe capteur depuis peu, et il est vraiment très professionnel, j'ai lu avec attention ce tutoriel, mais j'ai pas bien compris la différence entre ces différents commandes :

-Standby:

#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

actuellement je n'utilise aucune

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

oui ca marche (+/- ... j'ai un problème de rapidité de rafraîchissement ... trop rapide !) ... mais est ce que c'est pas mieux si j’utilise une de ces commandes ?

Merci

mon problème est le suivant

mon programme c'est une boucle qui affiche l'heure, la température et l'humidité

j'utilise la commande

ti = millis();
while ((millis() - ti) < 5000) {

.....

}

pour chaque partie d'affichage

intéressant nous à l'affichage de la température

si je place la lecture en dehors de la boucle while

temp = sensor.readTemperature();
while ((millis() - ti) < 5000) {

.....

}

ca marche, mais durant le temps d'affichage il n'y a pas de mise a jour de l'information du capteur

si je place la lecture dans la boucle while

while ((millis() - ti) < 5000) {
temp = sensor.readTemperature();

.....

}

il y a mise a jour, mais j'ai un problème au niveau de mon affichage multiplexé, vibration de l'affichage et diminution de la luminosité

ce que je veux c'est une mise a jours pas trop rapide (disons toute les seconde), et surtout pas ce problème d'affichage

est ce que c'est possible ?

j'essai d'ajouter une boucle de lecture dans à des instants bien déterminer.

disons la phase d'affichage de la température dure 5 secondes, et je vais effectuer la lecture chaque seconde

  while ((millis() - ti) < 5000) { //Timer of 5 seconds for the Temperature

if (((millis() - ti) == 0) or ((millis() - ti) == 1000) or ((millis() - ti) == 2000) or ((millis() - ti) == 3000) or ((millis() - ti) == 4000)) {
  temp = sensor.readTemperature();
  }

Marche pas :frowning:

je fatigue là :cold_sweat: :cold_sweat:

hello

testes ce code et inspire t'en pour la suite

unsigned long ti=0;
float temp=0;
void setup() {
 Serial.begin(115200);
 ti=millis();
}

void loop() {
temp = sensor.readTemperature();
if (millis()-ti>5000)
{
Serial.print("temperature = ");
Serial.println(temp);
ti=millis();
}
}

Bonsoir,

j'ai lu avec attention ce tutoriel, mais j'ai pas bien compris la différence entre ces différents commandes :

Ces différentes commandes servent au paramétrage du capteur. La datasheet consacre deux excellents paragraphes à ce sujet.

actuellement je n'utilise aucune

humidity = SI7021_READ_RH();

température = SI7021_READ_TEMPERATURE();

SI7021_READ_RH() et SI7021_READ_TEMPERATURE() sont deux fonctions qui retournent l'humidité et la température.

En revanche elles doivent avoir un paramètre d'entrée, car il existe différentes manières pour acquérir l'humidité et la température, encore une fois la datasheet est explicite.

bon ... j'ai allégé le code (j'ai changer l'affichage multiplexé par un affichage dans la console) ... le code est le suivant :

#include <TimeLib.h>        //Time Library
#include <DS3232RTC.h>   //Real Time Clock Library
#include "Adafruit_Si7021.h"
#include <Wire.h>        //Auxiliary Library for DS1307RTC (Real-Time Clock) - Pins to Arduino UNO: A4 (SDA), A5 (SCL)

Adafruit_Si7021 sensor = Adafruit_Si7021();


int hora, minuto;
int temp, umid;
int unidadeHora, unidadeMinuto, dezenaHora, dezenaMinuto;
int unidadeTemp, dezenaTemp, centmTemp, unidadeUmid, dezenaUmid, centmUmid;
unsigned long ti;


time_t t = now();

void setup() {
  sensor.begin(); 
  Serial.begin(115200);
  
  setSyncProvider(RTC.get);   // Update the time with data of RTC (Real Time Clock)

}

void loop()  {
  //-------------------------------------------------------------------------------------------------
  //----------------------------Display Time---------------------------------------
  ti = millis(); // Initial time for the Timer of Hour/Time

  while ((millis() - ti) < 5000) { //Timer of 5 seconds to show the Hour

  hora = hour();
  minuto = minute();
  unidadeHora = hora % 10;
  dezenaHora = hora / 10;
  unidadeMinuto = minuto % 10;
  dezenaMinuto = minuto / 10;

 Serial.print("TEMPS = ");
 Serial.print(dezenaHora);
 Serial.print(unidadeHora);
 Serial.print(" : ");
 Serial.print(dezenaMinuto);
 Serial.println(unidadeMinuto);
    }
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
  delay(100);  //Wait for half second before go ahead to show the next feature
   Serial.println(" ------------------------------------ ");
//-------------------------------------------------------------------------------------------------
//------------------------------------Display Temp----------------------------------------------
  ti = millis(); //Initial time for the Timer of Temperature
 
 temp = 10 * (sensor.readTemperature());
 
  while ((millis() - ti) < 5000) { //Timer of 5 seconds for the Temperature
 
  dezenaTemp = temp / 100;
  unidadeTemp = (temp/10) % 10;
  centmTemp = temp % 10;

 Serial.print("TEMPERATURE = ");
 Serial.print(dezenaTemp);
 Serial.print(unidadeTemp);
 Serial.print(".");
 Serial.print(centmTemp);
 Serial.println(" °C ");
  
}
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
 delay(100);  //Wait for half second before go ahead to show the next feature
  Serial.println(" ------------------------------------ ");
//---------------------------------------------------------------------------------
//----------------------------Display Humd------------------------------------------

  ti = millis(); //Initial time for the Timer of Humidity

 umid = 10 * (sensor.readHumidity());
      
  while ((millis() - ti) < 5000) { //Timer of 5 seconds for the Humidity

      dezenaUmid = umid / 100;
      unidadeUmid = (umid/10) % 10;
      centmUmid = umid % 10;

 Serial.print("HUMIDITE = ");
 Serial.print(dezenaUmid);
 Serial.print(unidadeUmid);
 Serial.print(".");
 Serial.print(centmUmid);
 Serial.println(" % ");
}
 //-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
 delay(100);  //Wait for half second before go ahead to show the next feature
  Serial.println(" ------------------------------------ ");
//---------------------------------------------------------------------------------

}

la commande de lecture du sensor Si7021 à l'extérieur de la boucle while, ce qui implique que le code ne fait qu'une seule lecture de la température et de l'humidité ...

si je déplace la commande de lecture à l'intérieur de la boucle while, j'ai une mise à jour instantané, intéressant mais qui n'est pas bien digéré par mon affichage multiplexé

l'idéale c'est une mise à jour des valeur du sensor Si7021 chaque seconde ... sans que ca implique de problème sur mon affichage multiplexé ...

si vous avez une idée .. Merci

Merci

-Standby:
Bonsoir,

Ces différentes commandes servent au paramétrage du capteur. La datasheet consacre deux excellents paragraphes à ce sujet.

SI7021_READ_RH() et SI7021_READ_TEMPERATURE() sont deux fonctions qui retournent l'humidité et la température.

En revanche elles doivent avoir un paramètre d'entrée, car il existe différentes manières pour acquérir l'humidité et la température, encore une fois la datasheet est explicite.

OK ... je fais un peu de lecture ... c'est le bon datasheet ??