Go Down

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


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)


(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!

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.println("start");      // a personal quirk
void loop()                     // run over and over again
  long H=RH1(evalHumid(readingsPer, sensorPin1));


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


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
  //return result;                   // report results   

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


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!



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]


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]


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


What happens if polarity is inverted

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


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.println("Configurando");      //Envio inicial


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

Thanks in advanced.

Go Up