Skip to content

Commit cd19b9d

Browse files
committed
hts221: Add two-point temperature calibration methods.
1 parent ca5e4a5 commit cd19b9d

2 files changed

Lines changed: 67 additions & 6 deletions

File tree

lib/hts221/hts221/device.py

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,18 @@ def __init__(self, i2c, address=HTS_I2C_ADDR):
1616
self.writebuffer = bytearray(1)
1717
self.readbuffer = bytearray(1)
1818

19-
self.calibrate_temperature()
20-
self.calibrate_humidity()
19+
self._temp_gain = 1.0
20+
self._temp_offset = 0.0
21+
22+
self._read_temperature_calibration()
23+
self._read_humidity_calibration()
2124

2225
# set av conf: T=4 H=8
2326
self.setAv(0x81)
2427
# set CTRL_REG1: PD=1 BDU=1 ODR=1
2528
self.setODR(0x85)
2629

27-
def calibrate_temperature(self):
30+
def _read_temperature_calibration(self):
2831
# HTS221 Temp Calibration registers
2932
self.T0_OUT = int16(self._read_reg16(HTS221_T0_OUT_L))
3033
self.T1_OUT = int16(self._read_reg16(HTS221_T1_OUT_L))
@@ -33,7 +36,7 @@ def calibrate_temperature(self):
3336
self.T0_degC = (self._read_reg(HTS221_T0_degC_x8) + (t1 % 4) * 256) / 8
3437
self.T1_degC = (self._read_reg(HTS221_T1_degC_x8) + ((t1 % 16) / 4) * 256) / 8
3538

36-
def calibrate_humidity(self):
39+
def _read_humidity_calibration(self):
3740
# HTS221 Humi Calibration registers
3841
self.H0_OUT = self._read_reg16(HTS221_H0_T0_OUT_L)
3942
self.H1_OUT = self._read_reg16(HTS221_H1_T0_OUT_L)
@@ -112,9 +115,10 @@ def _ensure_data(self):
112115
def temperature(self):
113116
self._ensure_data()
114117
t = self._read_reg16(HTS221_TEMP_OUT_L)
115-
return self.T0_degC + (self.T1_degC - self.T0_degC) * (t - self.T0_OUT) / (
118+
factory = self.T0_degC + (self.T1_degC - self.T0_degC) * (t - self.T0_OUT) / (
116119
self.T1_OUT - self.T0_OUT
117120
)
121+
return self._temp_gain * factory + self._temp_offset
118122

119123
# calculate Humidity
120124
def humidity(self):
@@ -132,11 +136,41 @@ def read(self):
132136
humidity = self.H0_rH + (self.H1_rH - self.H0_rH) * (h - self.H0_OUT) / (
133137
self.H1_OUT - self.H0_OUT
134138
)
135-
temperature = self.T0_degC + (self.T1_degC - self.T0_degC) * (t - self.T0_OUT) / (
139+
factory = self.T0_degC + (self.T1_degC - self.T0_degC) * (t - self.T0_OUT) / (
136140
self.T1_OUT - self.T0_OUT
137141
)
142+
temperature = self._temp_gain * factory + self._temp_offset
138143
return humidity, temperature
139144

145+
# Temperature calibration
146+
147+
def set_temp_offset(self, offset_c):
148+
"""Set a temperature offset in °C (gain remains 1.0).
149+
150+
Args:
151+
offset_c: offset value in degrees Celsius.
152+
"""
153+
self._temp_gain = 1.0
154+
self._temp_offset = float(offset_c)
155+
156+
def calibrate_temperature(self, ref_low, measured_low, ref_high, measured_high):
157+
"""Two-point calibration from reference measurements.
158+
159+
Computes gain and offset so that the sensor reading is adjusted
160+
to match reference values at two temperature points.
161+
162+
Args:
163+
ref_low: reference temperature at the low point (°C).
164+
measured_low: sensor reading at the low point (°C).
165+
ref_high: reference temperature at the high point (°C).
166+
measured_high: sensor reading at the high point (°C).
167+
"""
168+
delta = float(measured_high - measured_low)
169+
if delta == 0.0:
170+
raise ValueError("measured_low and measured_high must differ")
171+
self._temp_gain = float(ref_high - ref_low) / delta
172+
self._temp_offset = float(ref_low) - self._temp_gain * float(measured_low)
173+
140174
def get(self):
141175
h, t = self.read()
142176
return [h, t]

tests/scenarios/hts221.yaml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,33 @@ tests:
109109
expect_not_none: true
110110
mode: [mock]
111111

112+
- name: "Temperature with offset"
113+
action: script
114+
script: |
115+
dev.set_temp_offset(-2.0)
116+
result = dev.temperature()
117+
expect_not_none: true
118+
mode: [mock]
119+
120+
- name: "Temperature with two-point calibration"
121+
action: script
122+
script: |
123+
t_before = dev.temperature()
124+
dev.calibrate_temperature(20.0, t_before, 30.0, t_before + 10.0)
125+
result = dev.temperature()
126+
expect_range: [19.0, 21.0]
127+
mode: [mock]
128+
129+
- name: "Read applies temperature calibration"
130+
action: script
131+
script: |
132+
dev.set_temp_offset(-2.0)
133+
_, temp = dev.read()
134+
t_no_offset = dev.temperature() + 2.0
135+
result = abs(temp - (t_no_offset - 2.0)) < 0.1
136+
expect_true: true
137+
mode: [mock]
138+
112139
- name: "Auto-trigger after poweroff"
113140
action: hardware_script
114141
script: |

0 commit comments

Comments
 (0)