Go Down

Topic: Using an HS1101 humidity sensor (Read 12425 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)

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

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;

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy