Skip to content

Commit 0b9b2e2

Browse files
committed
SI7021: temperature can be negative, clip at reasonable vlaues
1 parent 3167e46 commit 0b9b2e2

File tree

3 files changed

+16
-16
lines changed

3 files changed

+16
-16
lines changed

examples/ex14/ex14.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,12 @@ static void sAppTask(void *pArg)
6767
{
6868
sAppCnt++;
6969

70-
const uint16_t hum1 = si7021MeasHumidity();
71-
const uint16_t temp1 = si7021MeasTemperature();
72-
uint16_t hum2, temp2;
70+
const int16_t hum1 = si7021MeasHumidity();
71+
const int16_t temp1 = si7021MeasTemperature();
72+
int16_t hum2, temp2;
7373
si7021MeasHumidityAndTemperature(&hum2, &temp2);
7474

75-
DEBUG("RH=%.2f (%.2f), T=%.2f (%.2f)",
75+
DEBUG("H=%.2f (%.2f), T=%.2f (%.2f)",
7676
(float)hum1 * 0.01f, (float)hum2 * 0.01f,
7777
(float)temp1 * 0.01f, (float)temp2 * 0.01f);
7878

src/si7021.c

+6-6
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ void si7021Init(void)
125125
sn1, sn2, fw >> 4, fw & 0x0f);
126126
}
127127

128-
uint16_t si7021MeasHumidity(void)
128+
int16_t si7021MeasHumidity(void)
129129
{
130130
if (!sSi7021Ready)
131131
{
@@ -146,12 +146,12 @@ uint16_t si7021MeasHumidity(void)
146146
}
147147

148148
const uint16_t raw = ((uint16_t)resp[0] << 8) | resp[1];
149-
const uint16_t hum = (((uint32_t)raw * (125 * 100)) / 65536) - 600;
149+
const int16_t hum = (((int32_t)raw * (125 * 100)) / 65536) - 600;
150150

151151
return CLIP(hum, 0, 10000);
152152
}
153153

154-
uint16_t si7021MeasTemperature(void)
154+
int16_t si7021MeasTemperature(void)
155155
{
156156
if (!sSi7021Ready)
157157
{
@@ -172,14 +172,14 @@ uint16_t si7021MeasTemperature(void)
172172
}
173173

174174
const uint16_t raw = ((uint16_t)resp[0] << 8) | resp[1];
175-
const uint16_t temp = (((uint32_t)raw * (uint32_t)(175.72 * 100)) / 65536) - (uint32_t)(46.85 * 100);
175+
const int16_t temp = (((int32_t)raw * (int32_t)(175.72 * 100)) / 65536) - (int32_t)(46.85 * 100);
176176

177-
return temp;
177+
return CLIP(temp, -4600, 12800);
178178
}
179179

180180

181181

182-
bool si7021MeasHumidityAndTemperature(uint16_t *pHum, uint16_t *pTemp)
182+
bool si7021MeasHumidityAndTemperature(int16_t *pHum, int16_t *pTemp)
183183
{
184184
if (!sSi7021Ready)
185185
{

src/si7021.h

+6-6
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,19 @@
3232
void si7021Init(void);
3333

3434
//! temperature or humidity value to indicate no data available
35-
#define SI7021_NODATA 0xffff
35+
#define SI7021_NODATA 0x7fff /* = 32767 = INT16_MAX */
3636

3737
//! measure relative humidity
3838
/*!
39-
\returns the relative humidity value [0.01%], or #SI7021_NODATA on error
39+
\returns the relative humidity value [0.01%], value 0..10000 or #SI7021_NODATA on error
4040
*/
41-
uint16_t si7021MeasHumidity(void);
41+
int16_t si7021MeasHumidity(void);
4242

4343
//! measure temperature
4444
/*!
45-
\returns the temperature value [0.01C], or #SI7021_NODATA on error
45+
\returns the temperature value [0.01C], value -4600..12800 or #SI7021_NODATA on error
4646
*/
47-
uint16_t si7021MeasTemperature(void);
47+
int16_t si7021MeasTemperature(void);
4848

4949

5050
//! measure relative humidity and temperature at the same time
@@ -53,7 +53,7 @@ uint16_t si7021MeasTemperature(void);
5353
\param[out] pTemp the temperature value [0.01C], or #SI7021_NODATA on error
5454
\returns true if both measurements are available
5555
*/
56-
bool si7021MeasHumidityAndTemperature(uint16_t *pHum, uint16_t *pTemp);
56+
bool si7021MeasHumidityAndTemperature(int16_t *pHum, int16_t *pTemp);
5757

5858

5959
#endif // __SI7021_H__

0 commit comments

Comments
 (0)