-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathbh1750fvi.c
65 lines (55 loc) · 1.55 KB
/
bh1750fvi.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
#include "bh1750fvi.h"
static error_t send_command(const i2c_device *dev, uint8_t command) {
if (!dev) {
return E_NULL_PTR;
}
uint8_t tx[] = {command};
i2c_transfer7(dev->i2c, dev->address, tx, sizeof_a(tx), NULL, 0);
return E_SUCCESS;
}
error_t bh1750fvi_init(uint32_t i2c, i2c_device *dev) {
if (!dev) {
return E_NULL_PTR;
}
dev->i2c = i2c;
dev->address = BH1750FVI_ADDRESS;
if (!i2c_check_presence(dev->i2c, dev->address)) {
hacf();
}
send_command(dev, BH1750FVI_POWER_ON_CMD);
send_command(dev, BH1750FVI_RESET_CMD);
send_command(dev, BH1750FVI_POWER_ON_CMD);
return E_SUCCESS;
}
error_t bh1750fvi_read_single_shot(const i2c_device *dev,
bh1750fvi_resolution resolution,
float *val) {
if (!dev || !val) {
return E_NULL_PTR;
}
// turn on device
send_command(dev, BH1750FVI_POWER_ON_CMD);
// send command to perform reading and wait for result
switch (resolution) {
case BH1750FVI_LOW_RESOLUTION:
send_command(dev, BH1750FVI_SINGLE_SHOT_LRES_CMD);
delay_ms(24);
break;
case BH1750FVI_HIGH_RESOLUTION:
send_command(dev, BH1750FVI_SINGLE_SHOT_HRES_CMD);
delay_ms(180);
break;
case BH1750FVI_HIGH_RESOLUTION_2:
send_command(dev, BH1750FVI_SINGLE_SHOT_HRES2_CMD);
delay_ms(180);
break;
default:
hacf();
}
// read result
uint8_t rx[2];
i2c_transfer7(dev->i2c, dev->address, NULL, 0, rx, sizeof_a(rx));
uint16_t reading = (rx[0] << 8u) + rx[1];
*val = (float)reading / 1.2f;
return E_SUCCESS;
}