Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions lib/hts221/hts221/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,17 @@
HTS221_T0_OUT_H = const(0x3D)
HTS221_T1_OUT_L = const(0x3E)
HTS221_T1_OUT_H = const(0x3F)

# CTRL_REG1 bits
HTS221_CTRL1_PD = const(0x80)
HTS221_CTRL1_BDU = const(0x04)
HTS221_CTRL1_ODR_MASK = const(0x03)

# CTRL_REG2 bits
HTS221_CTRL2_BOOT = const(0x80)
HTS221_CTRL2_HEATER = const(0x02)
HTS221_CTRL2_ONE_SHOT = const(0x01)

# STATUS_REG bits
HTS221_STATUS_H_DA = const(0x02)
HTS221_STATUS_T_DA = const(0x01)
41 changes: 40 additions & 1 deletion lib/hts221/hts221/device.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from machine import I2C
from time import sleep_ms

from hts221.const import *

Expand Down Expand Up @@ -84,20 +85,58 @@ def getAv(self):
def setAv(self, av=0):
self._write_reg(HTS221_AV_CONF, av)

# one-shot / auto-trigger helpers
def _is_power_down(self):
return (self._read_reg(HTS221_CTRL_REG1) & HTS221_CTRL1_PD) == 0

def _is_one_shot_mode(self):
ctrl1 = self._read_reg(HTS221_CTRL_REG1)
is_active = bool(ctrl1 & HTS221_CTRL1_PD)
odr = ctrl1 & HTS221_CTRL1_ODR_MASK
return is_active and odr == 0

def trigger_one_shot(self):
ctrl1 = self._read_reg(HTS221_CTRL_REG1)
ctrl1 |= HTS221_CTRL1_PD | HTS221_CTRL1_BDU
ctrl1 &= ~HTS221_CTRL1_ODR_MASK
self._write_reg(HTS221_CTRL_REG1, ctrl1)
ctrl2 = self._read_reg(HTS221_CTRL_REG2)
self._write_reg(HTS221_CTRL_REG2, ctrl2 | HTS221_CTRL2_ONE_SHOT)
sleep_ms(15)

def _ensure_data(self):
if self._is_power_down() or self._is_one_shot_mode():
self.trigger_one_shot()
Comment thread
nedseb marked this conversation as resolved.

# calculate Temperature
def temperature(self):
self._ensure_data()
t = self._read_reg16(HTS221_TEMP_OUT_L)
return self.T0_degC + (self.T1_degC - self.T0_degC) * (t - self.T0_OUT) / (
self.T1_OUT - self.T0_OUT
)

# calculate Humidity
def humidity(self):
self._ensure_data()
t = self._read_reg16(HTS221_HUMIDITY_OUT_L)
return self.H0_rH + (self.H1_rH - self.H0_rH) * (t - self.H0_OUT) / (
self.H1_OUT - self.H0_OUT
)

# get Humidity and Temperature
def read(self):
self._ensure_data()
h = self._read_reg16(HTS221_HUMIDITY_OUT_L)
t = self._read_reg16(HTS221_TEMP_OUT_L)
humidity = self.H0_rH + (self.H1_rH - self.H0_rH) * (h - self.H0_OUT) / (
self.H1_OUT - self.H0_OUT
)
temperature = self.T0_degC + (self.T1_degC - self.T0_degC) * (t - self.T0_OUT) / (
self.T1_OUT - self.T0_OUT
)
return humidity, temperature
Comment thread
nedseb marked this conversation as resolved.

def get(self):
return [self.humidity(), self.temperature()]
h, t = self.read()
return [h, t]
13 changes: 13 additions & 0 deletions tests/scenarios/hts221.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,19 @@ tests:
expect_not_none: true
mode: [mock, hardware]

- name: "Auto-trigger after poweroff"
action: hardware_script
script: |
from machine import I2C
from hts221.device import HTS221
i2c = I2C(1)
sensor = HTS221(i2c)
sensor.poweroff()
t = sensor.temperature()
result = 10.0 <= t <= 45.0
expect_true: true
mode: [hardware]

- name: "Temperature feels correct"
action: manual
display:
Expand Down
Loading