View previous topic :: View next topic |
Author |
Message |
Ömer Faruk
Joined: 15 Nov 2018 Posts: 42 Location: Çanakkale
|
HS1101 capacitance to humidity formula |
Posted: Sun Sep 13, 2020 3:07 pm |
|
|
Hello Everybody,
I am trying to measure humidity with HS1101 sensor. I am using CTMU unit on pic18f46k22. I have calibrated the constant current supply as 6.1 uA. I am getting reasonable readings from the sensor. The results are in pF. For example, I get 180pF but I can't turn it into humidity. I don't want to use a look up table. Here is the formula to get humidity with capacitance readings from sensor. When I use this formula I don't get 55% humidity.
Could you hep me on this issue ? Could you please check if the formula is true ?
https://ibb.co/82nbMtP |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Sep 13, 2020 3:30 pm |
|
|
Post your C source code that you wrote to implement that formula.
Or post the complete test program that you used. That would be better. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Sun Sep 13, 2020 4:22 pm |
|
|
re:
Quote: | I don't want to use a look up table. |
I have to ask why not ? PICs are not great at doing 'complicated' math and it'll take a LOT of time to compute the answer.
A lookup table, in this case just 100 entries will be very, very FAST... AND be very efficent in terms of code space (memory used). Doing FP math, even scaled integer math will take a LOT of memory space.
We need to see your code though.....we can't say 'why' you're not getting the correct answer until then.
Jay |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Mon Sep 14, 2020 12:42 am |
|
|
You realise you will need the reading at 55RH, to put into the formula.
This needs to be calibrated for each sensor. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Mon Sep 14, 2020 3:14 am |
|
|
The way it works is:
Have the capacitance reading at 55RH. Call this STD.
Then
X=current reading/STD.
RH=-3562.2*(X^3)+11037*(X^2)-10776*X+3356.5
It'd only give 55RH, if current reading == STD, which then makes X = 1
X=1
RH = -3562.2 + 11037 -10776 +3356.5 = 55.3
I've actually tweaked the parameters a little. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Mon Sep 14, 2020 5:33 am |
|
|
I got curious about the sensor...got the datasheet.
There's 2 possible ways for 'bad' readings.
1) the 180pf@55RH is +-3pf ( spec is 177-183). So if your sensor was really 177pf, then the %RH calculations will be slightly off ( about 2% ?)
2) PCB layout/wiring can add 'stray capacitance' according to datasheet. This can be a huge problem. If PCB traces aren't perfect and clean then coated, any moisture in the air can affect the reading.
Also might need to read the power spec as well, in case a small drop in VDD might cause bad readings. VDD can drop when sa an LED is turned on..this might affect the sensor reading. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Mon Sep 14, 2020 6:24 am |
|
|
No, not 2%.
This is the critical point. This value is massively critical. If you look at the
formula, and recalculate using the limit values, you get 45RH to 65RH.
So the +/-3% in capacitance value, gives +/-10%RH. This is why you
need to start with a 'known' figure for the capacitance at a particular RH
level, for the values to be useable.... |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Mon Sep 14, 2020 7:52 am |
|
|
yikes.....I didn't 'do the math', just a 'gut' feeling the number WOULD be off.
Didn't realize it'd be that bad..... |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Mon Sep 14, 2020 8:00 am |
|
|
The other thing is that he has not actually said how he is measuring the
capacitance. All solutions have potential errors, and some could be really
bad. Their example circuit uses a 0.5% resistor and a trim pot, to allow
the value to be tweaked to read correctly. |
|
|
Ömer Faruk
Joined: 15 Nov 2018 Posts: 42 Location: Çanakkale
|
|
Posted: Tue Sep 15, 2020 2:30 pm |
|
|
Code: | #include <18f46k22_mine.h>
#fuses HSH,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,PUT,NOCPD,NOWRT,NODEBUG,INTRC_IO,NOIESO,CCP2C1,CCP3E0,NOHFOFST,MCLR,STVREN,NOWRTB,NOEBTR,NOXINST,TIMER3C0
#device ADC=10
#use delay (clock=16000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#include <flexy_lcd.c>
#include <my_math.h>
#include <stdlib.h>
#define KESME 65535
#define DELAY delay_us(100);
unsigned int counter=0;
float max ;
float min ;
float cap;
char yazi[8];
float nem;
float humid;
float current;
float toplam2;
unsigned int16 digital;
#int_timer0
void timer0_kesme(void)
{
set_timer0(6);
}
#INT_RB
void detect_rb_change(void)
{
}
void nem_olc1()
{
min = 1024;
max = 0;
ADCON1 = 0x08;
ADON = 1;
CHS0 = 0;
CHS1 = 0;
CHS2 = 0;
CHS3 = 0;
CHS4 = 0;
delay_us(10);
CTMUEN = 1;
EDG1STAT = 0;
EDG2STAT = 0;
while(counter<18)
{
IDISSEN = 1;
DELAY
IDISSEN = 0;
EDG1STAT = 1;
DELAY
EDG1STAT = 0;
GO_DONE = 1;
while(GO_DONE);
digital = make16(ADRESH,ADRESL);
toplam2 = toplam2 + digital;
if (digital>max)
max=digital; //update max stored
if (digital<min)
min=digital; //update min stored
if (++counter==18)
{
toplam2 = toplam2 -max - min;
}
}
counter=0;
nem = toplam2/16 ;
toplam2=0;
CTMUEN = 0;
}
void main()
{
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256 | RTCC_8_bit);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED);
setup_timer_5(T5_DISABLED);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
setup_CCP3(CCP_OFF);
setup_CCP4(CCP_OFF);
setup_CCP5(CCP_OFF);
setup_SPI(SPI_SS_DISABLED);
set_tris_a(0x03); set_tris_b(0xFF); set_tris_c(0x01); set_tris_d(0x00); set_tris_e(0x00);
ANSELA=0x03;
ANSELB=0x02;
port_b_pullups(0xD);
port_e_pullups(0xFF);
output_d(0x00);
setup_timer_3(T3_EXTERNAL);
set_timer3(KESME);
enable_interrupts(INT_RB);
disable_interrupts(int_timer0);
disable_interrupts(int_timer3);
disable_interrupts(GLOBAL);
set_timer0(6);
VREFCON0 = 0xB0; // Fixed voltage reference module 4.096V
ADCON1 = 0x08; // Positive edge on FVR negative edge on Vss
ADCON2 = 0xE2; // 8 TAD time and Fosc/32
CTMUICON = 0x2E; // 5.5 uA current source selected and calibrated to 6.1uA 475K resistor used on the channel AN10 to calibrate the current source
lcd_init();
setup_oscillator(OSC_16MHZ | OSC_PLL_OFF | OSC_INTRC);
while(true)
{
nem_olc1();
itoa(CTMUICON ,2,yazi);
cap = (6.2*100)/(nem*0.004) -30;
humid = -0.000946337*cap*cap*cap + 0.491461*cap*cap- 81.9203*cap + 4395.84 ;
lcd_gotoxy(1,1);
printf(lcd_putc,"V=%f,C=%0.1fpF",nem*0.004,cap);
lcd_gotoxy(1,2);
printf(lcd_putc,"%s %.0f%c ",yazi,humid,37);
delay_ms(1000);
}
}
|
Sorry for the delay. The formula works well. But it was wrong one and i have found the right formula. It is in the code.
Last edited by Ömer Faruk on Tue Sep 15, 2020 2:37 pm; edited 1 time in total |
|
|
Ömer Faruk
Joined: 15 Nov 2018 Posts: 42 Location: Çanakkale
|
|
Posted: Tue Sep 15, 2020 2:35 pm |
|
|
temtronic wrote: |
2) PCB layout/wiring can add 'stray capacitance' according to datasheet. This can be a huge problem. If PCB traces aren't perfect and clean then coated, any moisture in the air can affect the reading.
|
There is a stray capacitance on the pad and the traces. But i haven't found the stray capacitance. But it can be calculated with CTMU model as stated in the datasheet. But i haven't figured it out yet. I subtract 30pf as stray capacitance to get reasonable results. The sensor responds quickly. When i blow my breath on the sensor the humidity rises.
https://ibb.co/m4cm7KK |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Wed Sep 16, 2020 12:50 am |
|
|
Two things here.
First your INT_RB routine, _must_ read the port B bits. Currently, since this
routine does not read the port, if this interrupt triggers, the chip will hang
permanently in this interrupt. INT_RB cannot be cleared till the port is read.
Result disaster. Either leave this interrupt disabled, or add code to the
handler to read the port.
Then your formula is wrong. No wonder it doesn't work!...
humid = -0.000946337*cap*cap*cap + 0.491461*cap*cap- 81.9203*cap + 4395.84 ;
Where are you getting this from?. This is not the formula at the site.
I suspect you are trying to scale the factors by the 180pF default for
the 55RH value?. This won't work. Because the factor is applied before
the cube and square calculations, it's effect will change as the value
changes.
The formula is:
Code: |
itoa(CTMUICON ,2,yazi);
cap = (6.2*100)/(nem*0.004) -30;
cap=cap/180;
humid = -(3465.6*cap*cap*cap) + (10732*cap*cap) - (10457*cap) + 3245.9 ;
|
Totally different from what you have posted.....
For your maths to 'work', your sensor would have to be reading about 128pF
at 55RH. This has to imply there is something radically wrong with the
capacitance measurement. Post the circuit used, and where the constants
you are using in the conversion come from. |
|
|
Ömer Faruk
Joined: 15 Nov 2018 Posts: 42 Location: Çanakkale
|
|
Posted: Mon Sep 21, 2020 1:17 pm |
|
|
Ttelmah wrote: |
cap=cap/180;
humid = -(3465.6*cap*cap*cap) + (10732*cap*cap) - (10457*cap) + 3245.9 ;
|
I just have realized that when i put 201pF in the equation it results in 125%.
Are you sure that the formula is correct ? I have checked the datasheet. It must be 100% when the capacitance is 201pF. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Mon Sep 21, 2020 1:37 pm |
|
|
The formula is based on 10KHz @25*C.
They supply a formula for frequency influence.
Ugh, more 'math'...
I don't know what the effect would be, but a spreadsheet might be the fastest way to 'see the numbers'.
Jay |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Tue Sep 22, 2020 5:55 am |
|
|
The formula is correct. Your capacitance reading is wrong, as I suspected
a long time ago. Their data gives the capacitance at 100RH as 193.1pF
201pF is well above this. |
|
|
|