-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSensorNode.ino
More file actions
134 lines (102 loc) · 2.52 KB
/
SensorNode.ino
File metadata and controls
134 lines (102 loc) · 2.52 KB
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
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
#define BMI160_ADDR 0x69
#define BMI160_CMD 0x7E
#define BMI160_ACC_X_L 0x12
MAX30105 particleSensor;
// ---------------- BMI160 ----------------
void writeRegister(uint8_t reg, uint8_t data)
{
Wire.beginTransmission(BMI160_ADDR);
Wire.write(reg);
Wire.write(data);
Wire.endTransmission();
}
uint8_t readRegister(uint8_t reg)
{
Wire.beginTransmission(BMI160_ADDR);
Wire.write(reg);
Wire.endTransmission(false);
Wire.requestFrom(BMI160_ADDR, (uint8_t)1);
if (Wire.available())
return Wire.read();
return 0;
}
void readBytes(uint8_t reg, uint8_t *buffer, uint8_t len)
{
Wire.beginTransmission(BMI160_ADDR);
Wire.write(reg);
Wire.endTransmission(false);
Wire.requestFrom(BMI160_ADDR, len);
for (int i = 0; i < len; i++)
{
if (Wire.available())
buffer[i] = Wire.read();
}
}
// -----------------------------------------
void setup()
{
Serial.begin(115200);
Wire.begin(21, 22);
Serial.println("Initializing...");
// MAX30102
if (!particleSensor.begin(Wire))
{
Serial.println("MAX30102 not found");
while (1);
}
particleSensor.setup();
Serial.println("MAX30102 OK");
// BMI160
uint8_t chipID = readRegister(0x00);
Serial.print("BMI160 Chip ID = 0x");
Serial.println(chipID, HEX);
if (chipID != 0xD1)
{
Serial.println("BMI160 not found");
while (1);
}
writeRegister(BMI160_CMD, 0x11); // accel normal mode
delay(100);
writeRegister(BMI160_CMD, 0x15); // gyro normal mode
delay(100);
Serial.println("BMI160 OK");
}
void loop()
{
// ---------- MAX30102 ----------
long irValue = particleSensor.getIR();
if (checkForBeat(irValue))
{
Serial.print("Beat Detected");
}
// ---------- BMI160 ----------
uint8_t data[12];
readBytes(BMI160_ACC_X_L, data, 12);
int16_t ax = (int16_t)((data[1] << 8) | data[0]);
int16_t ay = (int16_t)((data[3] << 8) | data[2]);
int16_t az = (int16_t)((data[5] << 8) | data[4]);
int16_t gx = (int16_t)((data[7] << 8) | data[6]);
int16_t gy = (int16_t)((data[9] << 8) | data[8]);
int16_t gz = (int16_t)((data[11] << 8) | data[10]);
// ---------- 출력 ----------
Serial.print(" IR=");
Serial.print(irValue);
Serial.print(" | ACC(");
Serial.print(ax);
Serial.print(",");
Serial.print(ay);
Serial.print(",");
Serial.print(az);
Serial.print(")");
Serial.print(" | GYRO(");
Serial.print(gx);
Serial.print(",");
Serial.print(gy);
Serial.print(",");
Serial.print(gz);
Serial.println(")");
delay(50);
}