-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathraspi_si7021.c
116 lines (98 loc) · 3.07 KB
/
raspi_si7021.c
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
/*******************************************************************************
Raspberry Pi用 I2C 温度・湿度センサ SILICON LABS Si7021-A10 raspi_si7021
本ソースリストおよびソフトウェアは、ライセンスフリーです。(詳細は別記)
利用、編集、再配布等が自由に行えますが、著作権表示の改変は禁止します。
I2C接続のセンサから測定値を取得する
Copyright (c) 2014-2017 Wataru KUNINO
https://bokunimo.net/raspi/
*******************************************************************************/
// usage: raspi_si7021 [i2c_address]
// 0x40
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../libs/soft_i2c.h"
typedef unsigned char byte;
byte i2c_address=0x40;
// #define DEBUG
uint8_t _si7021_getId(){
uint8_t tx[2]={0xFC,0xC9};
uint8_t rx;
i2c_write(i2c_address,tx,2); // 書込みの実行
i2c_read(i2c_address,&rx,1); // 読み出し
#ifdef DEBUG
printf("Device ID =0x%02X\n",rx);
#endif
return rx;
}
uint8_t _si7021_getUserReg(){
uint8_t tx=0xE7;
uint8_t rx;
i2c_write(i2c_address,&tx,1); // 書込みの実行
i2c_read(i2c_address,&rx,1); // 読み出し
#ifdef DEBUG
printf("User Reg =0x%02X\n",rx);
#endif
return rx;
}
void _si7021_setUserReg(uint8_t in){
uint8_t tx[2]={0xE6,in};
i2c_write(i2c_address,tx,2); // 書込みの実行
#ifdef DEBUG
printf("Wrote User Register\n");
#endif
}
uint16_t _si7021_getReg(byte reg){
uint8_t tx=reg;
uint8_t rx[4];
i2c_write(i2c_address,&tx,1); // 書込みの実行
delay(24); // 待ち時間 12ms×2倍
i2c_read(i2c_address,rx,3);
#ifdef DEBUG
printf("rx=%02x %02x %02x\n",rx[0],rx[1],rx[2]);
#endif
return ((uint16_t)rx[0])<<8 | (uint16_t)rx[1];
}
int setup(){
byte id,config;
i2c_init();
id=_si7021_getId();
if(id != 0x14 && id != 0x15 && id != 0x0D){
fprintf(stderr,"unknown device\n");
printf("-1 -1\n");
return -1;
}
config=_si7021_getUserReg();
if(config != 0x3A){
_si7021_setUserReg(0x3A);
config=_si7021_getUserReg();
if(config != 0x3A){
fprintf(stderr,"cannot initialized\n");
printf("-1 -1\n");
return -1;
}
}
delay(20);
return 0;
}
float getTemp(){
return 175.72 * (float)_si7021_getReg(0xF3) / 65536. - 46.85;
}
float getHum(){
return 125. * (float)_si7021_getReg(0xF5) / 65536. - 6.;
}
int main(int argc,char **argv){
if( argc == 2 ) i2c_address=(byte)strtol(argv[1],NULL,16);
if( i2c_address>=0x80 ) i2c_address>>=1;
if( argc < 1 || argc > 2 ){
fprintf(stderr,"usage: %s [i2c_address]\n",argv[0]);
return -1;
}
#ifdef DEBUG
printf("i2c_address =0x%02X\n",i2c_address);
#endif
setup();
printf("%3.2f %4.2f\n",getTemp(),getHum());
i2c_close();
return 0;
}