Go Down

Topic: Using an HS1101 humidity sensor (Read 14682 times) previous topic - next topic

robtillaart

Quote
just worked? Where's the fun in that?

Once and a while in the future you will wish for such "luck" ;)

The fun is now you can think of adding new functionalities, actions to be taken at certain humidity levels (motors valve, airco's etc)  , logging the levels and analyse them day vs night (add an RTC!!) ... There is always fun around the corner !

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

dpotthast

(using UNO)
Got this circuit working with code below.  Used a storebought humidity gauge to calibrate, according to Parallax datasheet, the function is linear.  Could have tried to calibrate using the result++, but I found the micros() method gave me better results.  Is this off base?  i am a newb.

Regardless, using a 2M pull down resistor, I get spot on humidity readings using a script that averages mulitple readings of the capacitor decay time in microseconds and is calibrated using a slope of .1667 and offset of -67.00.   -- The averaging gives much more consistent readings than one-off reads.

don't make readDelay too small or it will affect the sensor readings.  An accurate read could take a few seconds if your sample size is large.

thoughts?  i am sure this script could be tidied up a bit... would love feedback, I am just happy I am getting accurate reads!
Quote

int sensorPin1 = 4;

long result = 0;
unsigned long time1=0;
unsigned long time2=0;

long readingsPer=20.0;
long readDelay=200.0;

#define RH1(time) ((.1667*time)-67)

void setup()                    // run once, when the sketch starts
{

  Serial.begin(9600);
  Serial.println("start");      // a personal quirk
}
void loop()                     // run over and over again
{
  long H=RH1(evalHumid(readingsPer, sensorPin1));
  Serial.println("_____");
  Serial.println(H);
  Serial.println("_____");
  delay(1000);

}

long evalHumid(long samples, int sPin){
  long avgtime=0;
  for (int i=0;i<samples;i++){
    RCtime(sPin);
    avgtime+= decayTime(3);
  }
  avgtime=avgtime/samples; 
  return(avgtime);

}

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
  decayTime(1);  
  while(digitalRead(sensPin)){    // wait for pin to go low
    //result++;
  }
  decayTime(2);
  delay(readDelay);
  //return result;                   // report results   
}

long decayTime(int input){
  if (input==1){
    time1=micros();
  }
  if (input==2 ){
    time2=micros();
  }
  if (input==3){
    return (time2-time1);
  }
}


gmorchio

Hi there, I've been struggling with this sensor, I have used your code, but still I don't get the results done well. I'm comparing it to a SHT15 sensor.
My question is, how do you calculate the slope and the difference, in this case RH1(time) ((.1667*time)-67) ??
For example, for a 60% humidity, I get 242 as a reading. I have tried increasing the 67 to 247 to get the same results, but when I put it on a 75% humidity environment, the results goes to 108, which obviously is off the chart.

Please enlight my path!

Thanks
Greetings
Giovanni

sgargel


Hi there, I've been struggling with this sensor, I have used your code, but still I don't get the results done well....


Me too...

Code: [Select]

start
_____
226
_____
_____
225
_____
_____
224
_____


but... reading the device Documentation from here http://www.parallax.com/Portals/0/Downloads/docs/prod/sens/27920-HS1101-v1.0.pdf seems that getting the RH is simple as:

TDecay= 2.4•%RH + RHconstant

Code: [Select]

endTime=micros()-startTime;
endTime=endTime*10;
endTime=endTime-HS1101_RH_CONSTANT;
endTime=(endTime)/24;


also in this way readings seems meaningless... may be my hs1101 is broken? What happens if polarity is inverted?

pwillard

Quote
What happens if polarity is inverted


Hmm. I don't recall it having a polarity.  It is essentially a "humidity" variable non polarized capacitor.

hector915

This circuit is not  working for me =( , Can you please explain me  your circuit because I don't understand very well, you always have the hs1101 capacitor loaded by default if you connect the +5v directly ??...I implement this code

Code: [Select]
const float Vsupply=1024.0;
const int   analogHumidityPin = 4;

void setup()
{
Serial.begin(9600);
Serial.println("Configurando");      //Envio inicial

}

void loop()
{
Serial.println("Inicia Conversion");      //Envio inicial
float Vout = analogRead(analogHumidityPin);
float RelativeHumidity=(Vout/Vsupply)*100.0;
Serial.print((int)Vout);
Serial.print(" ");
Serial.print(RelativeHumidity);
Serial.println("%");
delay(500);
}


Thanks in advanced.

bomez

(using UNO)
Got this circuit working with code below.  Used a storebought humidity gauge to calibrate, according to Parallax datasheet, the function is linear.  Could have tried to calibrate using the result++, but I found the micros() method gave me better results.  Is this off base?  i am a newb.

 Regardless, using a 2M pull down resistor, I get spot on humidity readings using a script that averages mulitple readings of the capacitor decay time in microseconds and is calibrated using a slope of .1667 and offset of -67.00.   -- The averaging gives much more consistent readings than one-off reads.

don't make readDelay too small or it will affect the sensor readings.  An accurate read could take a few seconds if your sample size is large.

thoughts?  i am sure this script could be tidied up a bit... would love feedback, I am just happy I am getting accurate reads!
master, i want to ask. How make program to convert the serial data to RH and displays it at LCD??

milkay

Hi. Im having trouble with HS1101. I need it for my humidity controller. I just cant get the correct RH reading. I did every recommendations here but still cant get it. Do i need to replace the sensor? Any recommendations? Thanks :)

robtillaart

post your code and a picture/photo of your schema/wiring might help us to get started.

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

milkay

#24
Dec 26, 2014, 04:30 am Last Edit: Dec 26, 2014, 01:20 pm by robtillaart
Hi Sir Rob! Merry Christmas :)

Hardware setup:
HS1101 between common point and ground. 10m ohm resistor between charge pin and common point. 220 ohm resistor between discharge pin and common point. Then a wire between common point and analog pin (A/D input).

Code: [Select]

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define analogPin      0         
#define chargePin      13         
#define dischargePin   10       
#define resistorValue  10000000.0F 
                         
unsigned long startTime;
unsigned long chargeTime;
unsigned long dischargeTime;
float microFarads;             
float picoFarads;
float RHslope = 0.24;
float  RHconstant = 121.69;
float relhum;
float rh;
void setup(){
  pinMode(chargePin, OUTPUT);   
  digitalWrite(chargePin, LOW); 
  lcd.begin(16, 2);
       
}

void loop(){
  float avgcap;
  float samplehum;
  float avghum;
 
    for(int i = 0 ; i < 300; i++){
      digitalWrite(chargePin, HIGH);  // set chargePin HIGH and capacitor charging
      startTime = micros();
 
      while(analogRead(analogPin) < 648){       // 647 is 63.2% of 1023, which corresponds to full-scale voltage
      }

      chargeTime = micros() - startTime;
 
      // convert milliseconds to seconds ( 10^-3 ) and Farads to microFarads ( 10^6 ),  net 10^3 (1000) 
      microFarads = ((float)chargeTime / resistorValue);
   

      picoFarads = microFarads * 1000000.0;      // multiply by 1000 to convert to nanoFarads (10^-9 Farads)

      samplecap = samplecap + picoFarads;
 
      /* dicharge the capacitor  */
      digitalWrite(chargePin, LOW);             // set charge pin to  LOW
      pinMode(dischargePin, OUTPUT);            // set discharge pin to output
      digitalWrite(dischargePin, LOW);          // set discharge pin LOW
 
      while(analogRead(analogPin) > 0){         // wait until capacitor is completely discharged
      }
      pinMode(dischargePin, INPUT);            // set discharge pin back to input
     
    }
    avgcap = samplecap/300;
   
    samplehum = ((avgcap - RHconstant)/RHslope);

  lcd.setCursor(0,0);
  lcd.print(avgcap);
  lcd.setCursor(0,1);
   lcd.print("RH: " );
  lcd.print(samplehum);
  lcd.print("%" );
 
  delay(5000);
}

Thanks :)

abeltomillo

I've got it.

Code: [Select]
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;

leolectric

#26
Feb 23, 2015, 09:28 pm Last Edit: Feb 25, 2015, 06:05 pm by leolectric
Hy to all,

I have just started playing with this stuff, and i got abeltomillo code to work.

 I'm building a fan control but i''m having a problem to switch something on.

I was thinking something like:

if  (result  > 40){ digitalWrite (led,HIGH);}

But this doesn't seem to work. Any suggestions? I can't find a variable to connect something with.

Also, @ abeltomillo,

What does this line do? :

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

Go Up