Temperature & Humidity with the Sensirion SHT1x
Sensirion SHT11 or SHT15
A smart sensor for humidity and temperature available from Sensirion (http://www.sensirion.com). It comes from the factory in a tiny package that incorporates a precision analog to digital interface and a identical unit to unit calibration. All that a microcontroller has to do is read out the humidity and temperature values, via the two-sire digital serial interface. The only math required is a simple and offset and temperature compensation.
The photo to the left shows the sensor chip in relation to the great emancipator, and also the sensor chip mounted on an SMT carrier board so that it could be plugged into a DIP socket for experimentation. The top of the sensor chip carries a black plastic protective cover with a hole in the end to allow air to enter. Another photo below left shows the chip mounted on a SIP carrier board with the resistors and a bypass capacitor.
Sensirion also has sip package with pins on 0.05" centers (SHT7x). The sensor is located on the end of a long, thin neck with very good air flow and thermal characteristics. See below for how we have mounted that in a modified PG7 gland nut.
The circuit is simplicity itself. A pull-up resistor is required on the data signal line, which is open collector and can be asserted by either the microcontroller or the SHT1x. The 220 ohm resistor shown in series between the Stamp and the SHT15 is required in my setup, because both the Stamp and the SHT1x can potentially be outputs at the same time and in opposite states. The resistor is for protection. Sensirion recommends also a pulldown resistor on the clock signal line. Occasionally, without it, the chip can fail to initialize properly, when the power supply comes up slowly or with noise. The power supply bypass capacitor is highly recommended. Note that the pinout of t he SHT7x in the sip package is different from the pinout in the surface mount package. Refer to the data sheet available from the Sensirion web site.
SHTxx chip also has a provision to turn on an internal heater, which
is valuable for checking the operation and also for preventing
condensation. It remains to be seen how well this sensor will hold up in hostile
environments. The qualification data provided by Sensirion looks
good, in terms of recovery from condensation from other hostile
influences typically found in weather monitoring. (See the Sensirion
At EME Systems, we are working to provide an outdoor
packaging suitable for use with our OWL2 weather stations.
The photo on the left below shows the SHT75 mounted in a PG7
gland nut, sealed at the back and incorporating the resistors and
capacitor shown in the schematic. This arrangement can allow
for sealing to an enclosure, but with good air flow. The
second photo shows the PG7 gland mounted on an enclosure, with the
addition of a cap and water vapor permeable membrane. This protects the
sensor from hostile environments (e.g., seawater or agricultural
sprays), in trade for a much slower response time, which is not
important in many applications. Note that Sensirion can now
provide a Goretex cap for the model SHT1x sensor.
The diagram on the right shows the SHT15 mounted at the
bottom edge of a circuit board next to an OWL2pe data logger, part of a
custom pollution monitoring instrument.
Demo program. The following is a demo program for the BASIC Stamp II. It reads both the humidity and temperature from the SHT1x (or any of the chips in this line), and does the math to maintain the best resolution and to provide the temperature compensation. As usual with the serial interface chips, it is necessary to read the data sheet carefully to understand the serial protocol. The chip uses a protocol similar to I2C, but different. (You cannot use the BS2P I2C commands.) There is a start sequence and also an acknowledge after each byte, which the program below bit-bangs, for the rest it uses SHIFTIN and SHIFTOUT commands. A CRC is available to check the integrity of the data, but this program ignores it, which should be no problem on short data lines. Note in the photo that the pulldown resistor on the clock line is not there. I originally worked this out before Sensirion started recommending that resistor. Most of the time it works without it.
' SHT15.bs2 version C
' (c) 2002, 2004 Tracy Allen, http://www.emesystems.com
' access the Sensirion model sht11 or sht15
' humidity and temperature chip
' temperature to xx.x degrees Celsius, RH to xx.x %
' Repeatedly shows raw data and converted values on debug screen.
' version B, corrects glaring error in humidity computation
' also adjusts timeout to allow use with faster stamps too.
' version C updates the math for temperature compensation of %RH
' and enables display of negative temperatures
' hookup sht11 or sht15 as follows for this program
' STAMP SENSIRION
' p1 ----o-----/\/\---o--pin 3 sck, clock
' ;---/\/\-----' pull-down
' | 4.7k
' Vss--o-o---------------pin 1 common
' === 0.1uf
' Vdd--o-o---------------pin 4 +5 volts
' | 4.7k
' '---/\/\-----; pull-up
' 220 |
' p0 ----------/\/\---o--pin 2 dta, data
' The following code does not implement the CRC checking
sck PIN 1
dta PIN 0 ' note, 5k-10k pull-up, also 330ohm between the dta on stamp to dta on sht
dtain var in0
shtTR CON 3 ' read temperature
shtRH CON 5 ' read humidity
shtSW CON 6 ' status register write
shtSR CON 7 ' status register read
shtS0 CON 30 ' restore status register defaults (be sure to delay 11 milliseconds)
cmd VAR Byte
result VAR Word ' raw result from sht, also used as counter
r0 VAR result.byte0
r1 VAR result.byte1
degC VAR Word ' degrees Celsius * 100
RH VAR Word ' %RH * 10
RHtc VAR Word ' for temperature compensation of RH
GOSUB shtrst ' reset communication with sht
cmd=shtTR ' temperature command to sht
degC=result+5/10-400 ' from 100ths to 10ths of a degree with rounding
DEBUG tab,REP "-"\degC.bit15,DEC ABS degC/10,".",DEC1 ABS degC
cmd=shtRH ' humidity command to sht
' temperature compensation follows:
RHtc=655+(result*5)+(result**15917) ' intermediate factor
RHtc=(RHtc**(degC+2480))-(RHtc**2730)+RH ' compensated value
DEBUG tab, DEC result,tab,"%RH=",DEC RH/10,".",DEC1 RH
DEBUG tab,"%RHtc=",DEC RHtc/10,".",DEC1 RHtc,cr
' initializes communication with sht
' get 16 bits of data, enter with command in "cmd"
gosub shtcmd ' send the command "cmd"
gosub shtwait ' wait for command to finish
shiftin dta,sck,msbpre,[r1] ' msbyte
low dta ' acknowledge
shiftin dta,sck,msbpre,[r0] ' lsbyte
input dta ' terminate communication
' send start sequence and command
shtStart: ' send the start sequence
' dta: ~~~~~|_____|~~~~~~
' sck: ___|~~~|_|~~~~|____
' while dta is low, clock goes low and then high
input dta ' pullup high
shtcmd1: ' send the command
input dta ' allow acknowledge
' wait for sht to pull data pin low
' or for time out
LOOP WHILE dta & result.bit11
Math explanation: The math makes use of the ** operators to calculate the mulitplications times fractional values. The operators are explained in my tech note on BASIC Stamp math.
Here is the Sensirion formula that converts the raw result into relative humidity, a quadratic polynomial:RH = c1 + c2* result + c3 * result2
with constants as follows:c1 = -4
c2 = 0.0405
c3 = -2.8E-6
The formula can be rewritten as follows:RH = (c2 + (c3 * result)) * result + c1
The Stamp translation is the following. Each term is going to be multiplied times 10,in order to carry through one digit to the right of the decimal point.:RH=(26542-(54723**result+result))**result - 40
----- -------------------- -------- --
( c2 + c3 * result ) *result + c1
with constants as follows:10*c1 = -40 and on the stamp, that is the -40 at the end of the expression above
10*c2 = 0.405 on the stamp written as the fraction 26542/65536, (denominator implied)
or 26542 **
which will be used with the ** result that comes after adding... (the tricky one!)
(10*c3 * result) = -2.8E-5 * result
2.8E-5 * result is the same as the fraction 1.835/65536 * result
is the same as 1.85 * result / 65536
is the same as (0.85*result + result)/65536
is the same as (54723/65536 * result + result) / 65536
which on the Stamp is done with the denominator implied in the **.
(54723 ** result + result) **
Similar logic applies for the temperature compensation
From Sensirion, it involves the deviation of the temperature from 25 degrees Celsius, as well as the raw humidity value (result), added to the uncompensated humidity value:RHtc = (T - 25) * (0.01 + 0.00008 * result) + RH
Order of magnitude: The raw humidity variable "result" can have values from near zero up to about 3000. So the temperature conpensation factor calculated by the expression inside the second set of parentheses varies from 0.01 percent to 0.25 percent per degree Celsius. Suppose the humidity is near 100 percent. Then the humidity compensation could add or subtract 6 percent humidity over the zero to 50 degree Celsius range. Less compensation at lower humidities.
Negative values don't work with the Stamp integer math ** operator, so I transform the temperature to Kelvin, by adding 273.RHtc = ((T+273) - 25) * (0.01 + 0.00008 * result) - (273 * (0.01 + 0.00008 * result)) + RH
That might seem more complicated, adding the 273 at one point and subtracting it at another, but the benefit is that the quantity (T+248) is always positive, and will multiply using the ** operator .
Consider the factor that involves the raw humidity "result".(0.01 + 0.00008 * result)
It takes a treament just like the one above.0.01 on the Stamp is written as 655/65536
0.00008 * result is the same as 5.243/65536 * result
which is the same as (5* result + 0.243* result)/65536
which is the same as (5*result + 15917/65536 * result)/65536
which on the Stamp is done with the denominator 65536 implied in the ** operator
and combining the two terms, the factor to be multiplied times temperature is:
655 + (5*result) + (15917 ** result) ** (deviation of temperature from 25 Celsius)
In the above program, this factor is held temporarily in the variable RHtcRHtc=655+(result*5)+(result**15917)
For example, suppose result = 1742 when RH=58.0%. The factor is computed on a calculator as follows: (0.01 + 0.00008*1742) = (0.01+0.1394) = 0.1494. (that change in %RH per degree Celsius) And in Stampese,655 + (1742 * 5) + (1742 ** 15917) = 655 + 8710 + 423 = 655+9133 = 9788.
Observe that 9788/65536 = .14935, which is, as it should be, the same as the number computed on a scientific calculator. This is the number required for the ** operator.
The final formula is this:RHtc=(RHtc**(degC+2480))-(RHtc**2730)+RH ' compensated value
Going in, the factor we just calculated is held temporarily in variable RHtc. The temperature is held in variable degC, but recall that the value is actually ten times temperature. That is okay, because raw humidity variable RH is also holdes a value that is ten times the real value. The absolute value constant is 2730 in units of tenths of a degree.
A command-response interface. This is another program, sht1xdp.bsx. This one is able to turn the on-chip heater ON and OFF, and can also compute the dew point from the temperature and humidity values. Observe that the the program is specified for the BS2sx. Change the baud rate to use it with a slower stamp.
The interface is command driven. A prompt ">" appears on the left edge of the screen. To get a response, you enter the letter "s" (lower case) followed by a number at the keyboard:
The dew point calculation is quite a challenge for the integer brain of the Stamp. Another demo program, dewpoint.bsx, allows you to enter temperature and RH values at the keyboard, instead of taking them from the sensor.
Here are some problems one encounters when applying traditional humidity sensors, problems that are well addressed by the Sensirion product: