@@ -16,6 +16,9 @@ def __init__(self, i2c, address=ISM330DL_I2C_DEFAULT_ADDR):
1616 self ._accel_scale = ACCEL_FS_2G
1717 self ._gyro_scale = GYRO_FS_250DPS
1818
19+ self ._temp_gain = 1.0
20+ self ._temp_offset = 0.0
21+
1922 self .check_device ()
2023 self .reset ()
2124 self .configure_accel (ACCEL_ODR_104HZ , ACCEL_FS_2G )
@@ -149,8 +152,28 @@ def gyroscope_rads(self):
149152 return tuple (v * pi / 180.0 for v in dps )
150153
151154 def temperature_c (self ):
152- raw = self .temperature_raw ()
153- return TEMP_OFFSET + raw / TEMP_SENSITIVITY
155+ factory = TEMP_OFFSET + self .temperature_raw () / TEMP_SENSITIVITY
156+ return self ._temp_gain * factory + self ._temp_offset
157+
158+ def set_temp_offset (self , offset_c ):
159+ """Set a temperature offset in °C (gain remains 1.0)."""
160+ self ._temp_gain = 1.0
161+ self ._temp_offset = float (offset_c )
162+
163+ def calibrate_temperature (self , ref_low , measured_low , ref_high , measured_high ):
164+ """Two-point calibration from reference measurements.
165+
166+ Args:
167+ ref_low: reference temperature at the low point (°C).
168+ measured_low: sensor reading at the low point (°C).
169+ ref_high: reference temperature at the high point (°C).
170+ measured_high: sensor reading at the high point (°C).
171+ """
172+ delta = float (measured_high - measured_low )
173+ if delta == 0.0 :
174+ raise ValueError ("measured_low and measured_high must differ" )
175+ self ._temp_gain = float (ref_high - ref_low ) / delta
176+ self ._temp_offset = float (ref_low ) - self ._temp_gain * float (measured_low )
154177
155178 def orientation (self ):
156179 ax , ay , az = self .acceleration_g ()
0 commit comments