HTU31D Humidity Sensor
The HTU31D [1] is an I2C digital humidity sensor with a typical accuracy of ±2% at 20% to 100% relative humidity. It also provides temperature with an accuracy of ±0.2°C from 0 to 100°C.
A breakout is available from Adafruit [2]:

The I2C address is #x40 or 64.
Reading the temperature
The following floating-point function reads the temperature in degrees Celsius:
(defun htu31d-temp ()
(with-i2c (s #x40)
(write-byte #x40 s) ; conversion
(restart-i2c s)
(delay 20)
(write-byte #x00 s) ; read temperature
(restart-i2c s 2)
(- (* 165
(/ (logior (ash (read-byte s) 8) (read-byte s)) 65535))
40)))
For example:
> (htu31d-temp) 22.3594
Reading the humidity
The following floating-point function reads the humidity in %RH:
(defun htu31d-humidity ()
(with-i2c (s #x40)
(write-byte #x40 s) ; conversion
(restart-i2c s)
(delay 20)
(write-byte #x10 s) ; read humidity
(restart-i2c s 2)
(* 100 (/ (logior (ash (read-byte s) 8) (read-byte s)) 65535))))
For example:
> (htu31d-humidity) 60.0412
Enabling the heater
The sensor also incorporates a heater, to combat condensation. Here's a routine to enable or disable the heater:
(defun htu31d-heater (on)
(with-i2c (s #x40)
(write-byte (if on #x04 #x02) s)))
To turn the heater on call:
(htu31d-heater t)
or to turn if off call:
(htu31d-heater nil)
- ^ HTU31D Datasheet on TTI.com.
- ^ Adafruit HTU31D Temperature & Humidity Sensor Breakout Board on Adafruit.
