1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
#include "project.h"
#define SHT20_ADDRESS 0x40
#define TRIGGER_TEMP_MEASURE_HOLD 0xE3
#define TRIGGER_HUMD_MEASURE_HOLD 0xE5
#define TRIGGER_TEMP_MEASURE_NOHOLD 0xF3
#define TRIGGER_HUMD_MEASURE_NOHOLD 0xF5
#define WRITE_USER_REG 0xE6
#define READ_USER_REG 0xE7
#define SOFT_RESET 0xFE
void
sht20_reset (void)
{
i2cb_start_transaction (SHT20_ADDRESS, I2C_WRITE);
i2cb_send_data (SOFT_RESET);
i2cb_stop();
delay_ms (100);
printf ("$SNTHR\n");
}
char *
sht20_temp_s (void)
{
u8 h, l, c, s;
s32 t, tf;
float f;
static char ret[8];
i2cb_start_transaction (SHT20_ADDRESS, I2C_WRITE);
i2cb_send_data (TRIGGER_TEMP_MEASURE_NOHOLD);
delay_ms (100);
i2cb_start_transaction (SHT20_ADDRESS, I2C_READ);
h = i2cb_read (0);
l = i2cb_read (0);
c = i2cb_read (1);
i2cb_stop();
t = h;
t <<= 8;
t |= l & 0xfc;
f = t;
f /= 65536.;
f *= 175.72;
f -= 46.85;
f *= 100.;
t = (s32) (f + .5);
ret[0] = '-';
if (t >= 0)
s = 1;
else {
s = 0;
t = -t;
}
tf = t % 100;
t = t / 100;
sprintf (&ret[1], "%ld.%02ld", t, tf);
return &ret[s];
}
char *
sht20_humid_s (void)
{
u8 h, l, c;
u32 t, tf;
float f;
static char ret[8];
i2cb_start_transaction (SHT20_ADDRESS, I2C_WRITE);
i2cb_send_data (TRIGGER_HUMD_MEASURE_NOHOLD);
delay_ms (100);
i2cb_start_transaction (SHT20_ADDRESS, I2C_READ);
h = i2cb_read (0);
l = i2cb_read (0);
c = i2cb_read (1);
i2cb_stop();
t = h;
t <<= 8;
t |= l & 0xfc;
f = t;
f /= 65536.;
f *= 125.;
f -= 6.;
if (f < 0)
f = 0;
if (f > 100)
f = 100;
f *= 100.;
t = (u32) (f + .5);
tf = t % 100;
t = t / 100;
sprintf (ret, "%ld.%02ld", t, tf);
return ret;
}
|