SHT30-D and SHT31-D Humidity Sensors

The Sensirion SHT31-D [1] sensor reads humidity and temperature with an accuracy of ±2% over the range 0 to 100% RH, and ±0.2 °C over the range 0 to 90°C.

The functionally equivalent Sensirion SHT30-D sensor has an accuracy of ±3% over the range 10% to 90% RH, and ±0.3 °C over the range 0 to 65°C.

They will operate on between 2.4 V and 5.5 V.

A breakout board is available from Adafruit [2]:

SHT31-D.jpg

They provide two I2C addresses; the default is #x44 or 68.

Reading the humidity and temperature

The following routine reads both the temperature and humidity:

(defun sht31-temp-humid ()
  (let ((rdword 
         (lambda (s)
           (logior (ash (read-byte s) 8) (read-byte s)))))
    ; High repeatability mode
    (with-i2c (s #x44)
      (write-byte #x24 s)
      (write-byte #x00 s)
      (delay 20)
      (restart-i2c s 5)
      (let* ((temp (rdword s))
             (checksum (read-byte s))
             (humid (rdword s)))
      (list
       (- (/ (* temp 175) 65535) 45)
       (/ (* humid 100) 65535))))))

It returns the values as a list of two floating-point numbers. For example:

>  (sht31-temp-humid)
(20.132 38.1659)

The last two lines of the routine could probably be rewritten to return 16-bit fixed-point values, to make it compatible with 8/16-bit uLisp platforms.

Enabling the heater

The sensor also incorporates a heater, to combat condensation. Here's a routine to enable or disable the heater:

(defun sht31-heater (on)
  (with-i2c (s #x44)
    (write-byte #x30 s)
    (write-byte (if on #x6D #x66) s)))

To turn the heater on call:

(sht31-heater t)

or to turn if off call:

(sht31-heater nil)

  1. ^ SHT-3xD Datasheet on Adafruit.
  2. ^ Adafruit Sensirion SHT31-D Temperature & Humidity Sensor Breakout on Adafruit.