From 5c865367fda19ea7638ced2de405d14614dd4ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20NEDJAR?= Date: Fri, 13 Mar 2026 06:26:20 +0100 Subject: [PATCH 1/2] hts221: Auto-trigger one-shot conversion in power-down mode. --- lib/hts221/hts221/const.py | 14 +++++++++++++ lib/hts221/hts221/device.py | 41 ++++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/lib/hts221/hts221/const.py b/lib/hts221/hts221/const.py index 8ea1e648..beb86fc8 100644 --- a/lib/hts221/hts221/const.py +++ b/lib/hts221/hts221/const.py @@ -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) diff --git a/lib/hts221/hts221/device.py b/lib/hts221/hts221/device.py index fdacc307..0c40ef69 100644 --- a/lib/hts221/hts221/device.py +++ b/lib/hts221/hts221/device.py @@ -1,4 +1,5 @@ from machine import I2C +from time import sleep_ms from hts221.const import * @@ -84,8 +85,32 @@ 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() + # 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 @@ -93,11 +118,25 @@ def temperature(self): # 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 + def get(self): - return [self.humidity(), self.temperature()] + h, t = self.read() + return [h, t] From 54b9e0c662bc915d5e59af56fd6468580b1c5193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20NEDJAR?= Date: Fri, 13 Mar 2026 13:36:55 +0100 Subject: [PATCH 2/2] hts221: Add hardware test for auto-trigger after poweroff. --- tests/scenarios/hts221.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/scenarios/hts221.yaml b/tests/scenarios/hts221.yaml index c0adacde..dbfcfd62 100644 --- a/tests/scenarios/hts221.yaml +++ b/tests/scenarios/hts221.yaml @@ -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: