Skip to content

Commit 090210f

Browse files
committed
hts221: Add HTS221 Driver
1 parent f8f6529 commit 090210f

6 files changed

Lines changed: 203 additions & 0 deletions

File tree

lib/hts221/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# MicroPython Driver for the HTS221 Humidity Sensor
2+
3+
This library is a port of the [MicroPython Driver for the HTS221 Humidity Sensor](https://github.com/jposada202020/MicroPython_HTS221/tree/master).
4+
5+
The examples could be easily tested with [mpremote](https://docs.micropython.org/en/latest/reference/mpremote.html) with the following command :
6+
7+
```sh
8+
mpremote mount . run examples/humidity.py
9+
```

lib/hts221/examples/humidity.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from machine import I2C
2+
from hts221 import HTS221
3+
from time import sleep_ms
4+
import pyb
5+
6+
i2c = I2C(1)
7+
8+
sleep_ms(1000)
9+
10+
sensor = HTS221(i2c)
11+
12+
led_red = pyb.LED(1)
13+
led_green = pyb.LED(2)
14+
led_blue = pyb.LED(3)
15+
16+
17+
def red() -> None:
18+
led_red.on()
19+
led_green.off()
20+
led_blue.off()
21+
22+
23+
def green() -> None:
24+
led_red.off()
25+
led_green.on()
26+
led_blue.off()
27+
28+
29+
def blue() -> None:
30+
led_red.off()
31+
led_green.off()
32+
led_blue.on()
33+
34+
35+
while True:
36+
sleep_ms(1000)
37+
38+
temp = sensor.temperature()
39+
humi = sensor.humidity()
40+
41+
print("Temperature : % .1f °C, Humidity : % .1f %% " % (temp, humi), end="")
42+
43+
if temp > 25:
44+
red()
45+
print("🥵")
46+
elif temp > 16 and temp <= 25:
47+
green()
48+
print("😃")
49+
else:
50+
blue()
51+
print("🥶")

lib/hts221/hts221/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from hts221.device import HTS221
2+
3+
__all__ = [
4+
"HTS221",
5+
]

lib/hts221/hts221/const.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from micropython import const
2+
3+
# HTS221 I2C address
4+
HTS_I2C_ADDR = const(0x5F)
5+
6+
# HTS221 register mapping
7+
HTS221_WHO_AM_I = const(0x0F)
8+
HTS221_AV_CONF = const(0x10)
9+
HTS221_CTRL_REG1 = const(0x20)
10+
HTS221_CTRL_REG2 = const(0x21)
11+
HTS221_CTRL_REG3 = const(0x22)
12+
HTS221_STATUS_REG = const(0x27)
13+
HTS221_HUMIDITY_OUT_L = const(0x28)
14+
HTS221_HUMIDITY_OUT_H = const(0x29)
15+
HTS221_TEMP_OUT_L = const(0x2A)
16+
HTS221_TEMP_OUT_H = const(0x2B)
17+
HTS221_H0_rH_x2 = const(0x30)
18+
HTS221_H1_rH_x2 = const(0x31)
19+
HTS221_T0_degC_x8 = const(0x32)
20+
HTS221_T1_degC_x8 = const(0x33)
21+
HTS221_T1T0_msb = const(0x35)
22+
HTS221_H0_T0_OUT_L = const(0x36)
23+
HTS221_H0_T0_OUT_H = const(0x37)
24+
HTS221_H1_T0_OUT_L = const(0x3A)
25+
HTS221_H1_T0_OUT_H = const(0x3B)
26+
HTS221_T0_OUT_L = const(0x3C)
27+
HTS221_T0_OUT_H = const(0x3D)
28+
HTS221_T1_OUT_L = const(0x3E)
29+
HTS221_T1_OUT_H = const(0x3F)

lib/hts221/hts221/device.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
from machine import I2C
2+
3+
from hts221.const import *
4+
5+
6+
def int16(d):
7+
return d if d < 0x8000 else d - 0x10000
8+
9+
10+
class HTS221(object):
11+
def __init__(self, i2c, address=HTS_I2C_ADDR):
12+
self.i2c = i2c
13+
self.address = address
14+
15+
self.writebuffer = bytearray(1)
16+
self.readbuffer = bytearray(1)
17+
18+
self.calibrate_temperature()
19+
self.calibrate_humidity()
20+
21+
# set av conf: T=4 H=8
22+
self.setAv(0x81)
23+
# set CTRL_REG1: PD=1 BDU=1 ODR=1
24+
self.setODR(0x85)
25+
26+
def calibrate_temperature(self):
27+
# HTS221 Temp Calibration registers
28+
self.T0_OUT = int16(self.get2Reg(HTS221_T0_OUT_L))
29+
self.T1_OUT = int16(self.get2Reg(HTS221_T1_OUT_L))
30+
31+
t1 = self.getReg(HTS221_T1T0_msb)
32+
self.T0_degC = (self.getReg(HTS221_T0_degC_x8) + (t1 % 4) * 256) / 8
33+
self.T1_degC = (self.getReg(HTS221_T1_degC_x8) + ((t1 % 16) / 4) * 256) / 8
34+
35+
def calibrate_humidity(self):
36+
# HTS221 Humi Calibration registers
37+
self.H0_OUT = self.get2Reg(HTS221_H0_T0_OUT_L)
38+
self.H1_OUT = self.get2Reg(HTS221_H1_T0_OUT_L)
39+
self.H0_rH = self.getReg(HTS221_H0_rH_x2) / 2
40+
self.H1_rH = self.getReg(HTS221_H1_rH_x2) / 2
41+
42+
def setReg(self, dat, reg):
43+
self.writebuffer[0] = dat
44+
self.i2c.writeto_mem(self.address, reg, self.writebuffer)
45+
46+
def getReg(self, reg):
47+
self.i2c.readfrom_mem_into(self.address, reg, self.readbuffer)
48+
return self.readbuffer[0]
49+
50+
def get2Reg(self, reg):
51+
lowerByte = self.getReg(reg)
52+
higherByte = self.getReg(reg + 1)
53+
return (higherByte << 8) + lowerByte
54+
55+
# Device identification
56+
def whoAmI(self):
57+
return self.getReg(HTS221_WHO_AM_I)
58+
59+
# get STATUS register
60+
def status(self):
61+
return self.getReg(HTS221_STATUS_REG)
62+
63+
# power control
64+
def poweroff(self):
65+
t = self.getReg(HTS221_CTRL_REG1) & 0x7F
66+
self.setReg(t, HTS221_CTRL_REG1)
67+
68+
def poweron(self):
69+
t = self.getReg(HTS221_CTRL_REG1) | 0x80
70+
self.setReg(t, HTS221_CTRL_REG1)
71+
72+
# get/set Output data rate
73+
def getODR(self):
74+
return self.getReg(HTS221_CTRL_REG1) & 0x03
75+
76+
def setODR(self, odr=0):
77+
t = self.getReg(HTS221_CTRL_REG1) & 0xFC
78+
self.setReg(t | odr, HTS221_CTRL_REG1)
79+
80+
# get/set Humidity and temperature average configuration
81+
def getAv():
82+
return self.getReg(HTS221_AV_CONF)
83+
84+
def setAv(self, av=0):
85+
self.setReg(av, HTS221_AV_CONF)
86+
87+
# calculate Temperature
88+
def temperature(self):
89+
t = self.get2Reg(HTS221_TEMP_OUT_L)
90+
return self.T0_degC + (self.T1_degC - self.T0_degC) * (t - self.T0_OUT) / (
91+
self.T1_OUT - self.T0_OUT
92+
)
93+
94+
# calculate Humidity
95+
def humidity(self):
96+
t = self.get2Reg(HTS221_HUMIDITY_OUT_L)
97+
return self.H0_rH + (self.H1_rH - self.H0_rH) * (t - self.H0_OUT) / (
98+
self.H1_OUT - self.H0_OUT
99+
)
100+
101+
# get Humidity and Temperature
102+
def get(self):
103+
return [self.humidity(), self.temperature()]

lib/hts221/manifest.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
metadata(
2+
description="Driver of APDS9960 RGB, ambient light, proximity and gesture sensor.",
3+
version="0.0.1",
4+
)
5+
6+
package("apds9960")

0 commit comments

Comments
 (0)