utilisation capteur humidité HS1101LF

Bonjour, je souhaite utiliser le capteur HS1101LF pour mesurer l'humidité relative.

A l'aide du datasheet:

J'ai réalisé le montage spécifié mais avec une tension de 5V alors qu'il est spécifié 10 V max sur le datasheet. Je ne sais pas si cela a une incidence mais je n'ai pas de résultat en utilisant le code:

int getHr() {
  noInterrupts();
  unsigned long etat_haut = pulseIn(pinHr, HIGH); //mesure impulsion état haut
  interrupts();
  noInterrupts();
  unsigned long etat_bas = pulseIn(pinHr, LOW); //mesure impulsion état bas
  interrupts();
  if (etat_haut - etat_bas == 0) {
    long periode = (etat_haut + etat_bas); //total période du signal
    long frequence = 1 / (periode * 0.000001); //calcul de la fréquence
    Hr = (0, 00002427 * frequence ^ 2) - (0.4152 * frequence) + 1738.4; //détermination du taux d'humidité d'après la fréquence retournée par le capteur
    Serial.println("Duree etat haut : ");
  Serial.print(etat_haut);
  Serial.println("");
  Serial.println("Duree etat bas : ");
  Serial.print(etat_bas);
  Serial.println("");
  Serial.println("Periode : ");
  Serial.print(periode);
  Serial.println("");
  Serial.println("Frequence : ");
  Serial.print(frequence);
  Serial.println(" Hz");
  Serial.println("");
  } else {
    Hr = 0;
  }
    delay(1000);
  return Hr;
}

Mais ca ne fonctionne pas. C'est cablé sur la Pin A0 d'une MEGA.
J'ai donc essayer avec le code utilisant FreqCount:

int getHr() {
  if (FreqCount.available()) {
    unsigned long frequence = FreqCount.read();
    Serial.println("Fréquence=");
    Serial.println(frequence);
    Hr = (0, 00002427 * frequence ^ 2) - (0.4152 * frequence) + 1738.4; //détermination du taux d'humidité d'après la fréquence retournée par le capteur
  } else {
    Hr = 0;
  }
  Serial.print("taux d'humidité=");
  Serial.println(Hr);

  return Hr;
}

ne fonctionnant toujours pas. cablé sur l'entrée 47.
J'ai essayé le code utilisant freqcounter:

int getHr() {
  long int frq;
  FreqCounter::f_comp= 8;             // Set compensation to 12
  FreqCounter::start(100);            // Start counting with gatetime of 100ms
  // while (FreqCounter::f_ready == 0){         // wait until counter ready
  frq=FreqCounter::f_freq;            // read result
  Serial.println(frq);                // print result
  delay(20);
  }
  Hr = (0, 00002427 * frq ^ 2) - (0.4152 * frq) + 1738.4; //détermination du taux d'humidité d'après la fréquence retournée par le capteur
  return Hr;
  }

idem. toujours cablé sur la pin 47.

Il est probable que le montage ne soit pas bon certes et je vérifierai avec un oscilloscope quand j'en aurai un mais j'aimerais déjà savoir si le code est bon…

J'ai donc cherché un peu sur le forum et trouvé le code:

int sensorPin = 4;              // 220 or 1k resistor connected to this pin
long result = 0;
void setup()                    // run once, when the sketch starts
{
  Serial.begin(9600);
}

void loop()                     // run over and over again
{
  Serial.println( RCtime(sensorPin) );
  delay(1000);
}

long RCtime(int sensPin){
  long result = 0;
  pinMode(sensPin, OUTPUT);       // make pin OUTPUT
  digitalWrite(sensPin, HIGH);    // make pin HIGH to discharge capacitor - study the schematic
  delay(1);                       // wait a  ms to make sure cap is discharged

  pinMode(sensPin, INPUT);        // turn pin into an input and time till pin goes low
  digitalWrite(sensPin, LOW);     // turn pullups off - or it won't work
  while(digitalRead(sensPin)){    // wait for pin to go low
     result++;
  }

  result = map (result, 0, 122, 100, 0);
  
  return result;
}

avec un schéma par réellement clair sur:
https://forum.arduino.cc/index.php/topic,55812.msg401687.html#msg401687

tiré de:

La question la voilà:
Déjà mes codes sont ils bons où pas? peut-être que je me suis planté d'où le non fonctionnement du schéma du datasheet.

Ensuite pour l'utilisation du schéma RCTime, si je comprend bien je met un condo entre 1 nF et 0.1nF fonction de la résolution? comment on le détermine?
Et c'est un schéma pour les capteurs résistif alors que le HS1101LF est capacitif, ça à l'air de fonctionner pourtant pour les auteurs.

Le schéma produit par l'auteur du topic montre le capteur HS1101 en parallèle avec une résistance d'1MOhms qui attaque l'entrée de l'Arduino au travers d'une résistance de 220 Ohms et on ne sait pas ce qu'il met entre le 5V et le capteur… probablement un condo si je me réfère à la page RCTime…
L'avantage de ce montage est qu'il ne nécéssite pas bcp d'électronique…
Je souhaite donc votre avis… et pas de proposition pour un autre capteur je vous prie, c'est un composant imposé...

Bonjour

Vu la plage de fréquence attendue en sortie du 555 , la librairie FrequCount parait selon son auteur plus adaptée que FrequMeasure
Référence : FreqCount Library, for Measuring Frequencies in the 1 kHz to 5 MHz Range

Que donne l'exemple basique Serial_Output en câblant la sortie du 555 sur l'entrée numérique spécifique pour la carte Arduino utilisée ? (sous 5V le montage conseillé doit fonctionner)

Si cet exemple ne donne pas de résultat valable attendre le verdict de l'oscilloscope !!

Ensuite pour l'utilisation du schéma RCTime, si je comprend bien je met un condo entre 1 nF et 0.1nF fonction de la résolution? comment on le détermine?

RCTIme utilise un condensateur fixe au +5V et une résistance variable à la masse (=le capteur)
Il parait possible de faire le contraire : condensateur variable (=le capteur) au +5V et et résistance fixe à la masse.

Remarque : ce forum est souvent consulté avec un smartphone ou une tablette, des liens non cliquables n'y seront pas suivis

En reprennant le montage et le code freqcount, je suis bon me reste juste a calibre la mesure mais j’ai une indication de taux d’humidité relative!
En revanche j’ai un autre problème de boucle sur mon programme. C’est pour réaliser un autotest d’interrupteur, je demande à l’opérateur d’appuyer sur 8 boutons et si je détecte l’appuie je dis que c’est bon et sinon je dis que ce n’est pas bon. ca marchait mais j’ai remarqué que en cas de panne d’un bouton le test était bloqué la et je souhaite donc rajouter un timer pour que si l’opérateur appuie sur le bouton mais que celui ci est en rade, le programme passe au prochain step au bout de 5 s…
voila le bout de code:

//autotest commandes boite de raccordement EV:

for (int i = 0; i < nombreCommandes; i++) {
    genie.WriteStr(9, "appuyer sur Cde bte raccord EV");
    tempo = millis();
    while( millis() - tempo < 5000){
     evenement = lireEvenement(&numPoussoir);
      if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
        resultatAT++;
        genie.WriteStr(affCr[numPoussoir + 16], "OK");
      } else {
        genie.WriteStr(affCr[numPoussoir + 16], "NOK");
      }
      delay(10);
    }
  }

  //autotest des commandes déportées:
  for (int i = 0; i < nombreCommandes; i++) {
    genie.WriteStr(9, "appuyer sur Cde deportee EV");
    etatCev[i] = digitalRead(pinCEV[i]);
    if (etatCev[i] != 0) {
      tempo = millis();
      while (millis() - tempo < 5000 ) {
        etatCev[i] = digitalRead(pinCEV[i]);
        if (etatCev[i] == 0) {
          resultatAT++;
          genie.WriteStr(affCr[i + 24], "OK");
        } else {
          genie.WriteStr(affCr[i + 24], "NOK");
        }
      }
    } else {
      genie.WriteStr(affCr[i + 24], "NC");
    }
  }

La première partie du code test 8 boutons qui sont sur un seul fil, si au bout de 5s le bouton n’est pas détecté appuyé je passe au bouton suivant et ainsi de suite.

La deuxième partie ce sont des télécommandes déportées optionnelles du coup si je met à la masse la pin de mesure ca signifie que la télécommande n’est pas connectée… pour le reste c’est le même principe, je détecte un appui je met ok sinon je met nok.

Le problème est que la tempo marche sur toute la boucle for au lieu de fonctionner sur la while. Je souhaite en fait que pour chaque bouton, l’opérateur a 5s pour appuyé sinon on considère que le bouton est HS et on passe au bouton suivant. donc si on passe les 5 s je veux afficher NOK et incrémenter ma boucle for… alors que la, d’une je n’ai pas le NOK qui s’affiche et en plus j’ai 5s pour appuyé sur les 8 boutons en gros…

j’ai essayé aussi avec ce code:

//Autotest commandes boite de raccordement EV:
  for (int i = 0; i < nombreCommandes; i++) {
    genie.WriteStr(9, "appuyer sur Cde bte raccord EV");
    tempo = millis();
    evenement = lireEvenement(&numPoussoir);
    while( millis() - tempo < 5000 || evenement != EVENEMENT_PRESSE){
     evenement = lireEvenement(&numPoussoir);
      if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
        resultatAT++;
        genie.WriteStr(affCr[numPoussoir + 16], "OK");
      } else {
        genie.WriteStr(affCr[numPoussoir + 16], "NOK");
      }
      delay(10);
    }
  }
  
  //autotest des commandes déportées:
  for (int i = 0; i < nombreCommandes; i++) {
    genie.WriteStr(9, "appuyer sur Cde deportee EV");
    etatCev[i] = digitalRead(pinCEV[i]);
    if (etatCev[i] != 0) {
      tempo = millis();
      while (millis() - tempo < 5000 || etatCev[i] == 1) {
        etatCev[i] = digitalRead(pinCEV[i]);
        if (etatCev[i] == 0) {
          resultatAT++;
          genie.WriteStr(affCr[i + 24], "OK");
        } else {
          genie.WriteStr(affCr[i + 24], "NOK");
        }
      }
    } else {
      genie.WriteStr(affCr[i + 24], "NC");
      AT++;
    }
  }

j’ai ajouté une condition de plus pour mes boucles while c’est si j’appui effectivement sur mes boutons je passe au suivant mais du coup la tempo ne marche plus du tout…