Skip to content

Commit beca822

Browse files
committed
first version
0 parents  commit beca822

File tree

197 files changed

+490826
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

197 files changed

+490826
-0
lines changed

Grove_BMP280/Seeed_BMP280.cpp

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
#include "Seeed_BMP280.h"
2+
3+
#define BMP280_DEBUG_PRINT
4+
5+
bool BMP280::init(int i2c_addr) {
6+
uint8_t chip_id = 0;
7+
uint8_t retry = 0;
8+
_devAddr = i2c_addr;
9+
Wire.begin();
10+
while ((retry++ < 5) && (chip_id != 0x58)) {
11+
chip_id = bmp280Read8(BMP280_REG_CHIPID);
12+
#ifdef BMP280_DEBUG_PRINT
13+
Serial.print("Read chip ID: ");
14+
Serial.println(chip_id);
15+
#endif
16+
delay(100);
17+
}
18+
dig_T1 = bmp280Read16LE(BMP280_REG_DIG_T1);
19+
dig_T2 = bmp280ReadS16LE(BMP280_REG_DIG_T2);
20+
dig_T3 = bmp280ReadS16LE(BMP280_REG_DIG_T3);
21+
dig_P1 = bmp280Read16LE(BMP280_REG_DIG_P1);
22+
dig_P2 = bmp280ReadS16LE(BMP280_REG_DIG_P2);
23+
dig_P3 = bmp280ReadS16LE(BMP280_REG_DIG_P3);
24+
dig_P4 = bmp280ReadS16LE(BMP280_REG_DIG_P4);
25+
dig_P5 = bmp280ReadS16LE(BMP280_REG_DIG_P5);
26+
dig_P6 = bmp280ReadS16LE(BMP280_REG_DIG_P6);
27+
dig_P7 = bmp280ReadS16LE(BMP280_REG_DIG_P7);
28+
dig_P8 = bmp280ReadS16LE(BMP280_REG_DIG_P8);
29+
dig_P9 = bmp280ReadS16LE(BMP280_REG_DIG_P9);
30+
writeRegister(BMP280_REG_CONTROL, 0x3F);
31+
return true;
32+
}
33+
34+
float BMP280::getTemperature(void) {
35+
int32_t var1, var2;
36+
int32_t adc_T = bmp280Read24(BMP280_REG_TEMPDATA);
37+
// Check if the last transport successed
38+
if (!isTransport_OK) {
39+
return 0;
40+
}
41+
adc_T >>= 4;
42+
var1 = (((adc_T >> 3) - ((int32_t)(dig_T1 << 1))) *
43+
((int32_t)dig_T2)) >> 11;
44+
var2 = (((((adc_T >> 4) - ((int32_t)dig_T1)) *
45+
((adc_T >> 4) - ((int32_t)dig_T1))) >> 12) *
46+
((int32_t)dig_T3)) >> 14;
47+
t_fine = var1 + var2;
48+
float T = (t_fine * 5 + 128) >> 8;
49+
return T / 100;
50+
}
51+
52+
uint32_t BMP280::getPressure(void) {
53+
int64_t var1, var2, p;
54+
// Call getTemperature to get t_fine
55+
getTemperature();
56+
// Check if the last transport successed
57+
if (!isTransport_OK) {
58+
return 0;
59+
}
60+
int32_t adc_P = bmp280Read24(BMP280_REG_PRESSUREDATA);
61+
adc_P >>= 4;
62+
var1 = ((int64_t)t_fine) - 128000;
63+
var2 = var1 * var1 * (int64_t)dig_P6;
64+
var2 = var2 + ((var1 * (int64_t)dig_P5) << 17);
65+
var2 = var2 + (((int64_t)dig_P4) << 35);
66+
var1 = ((var1 * var1 * (int64_t)dig_P3) >> 8) + ((var1 * (int64_t)dig_P2) << 12);
67+
var1 = (((((int64_t)1) << 47) + var1)) * ((int64_t)dig_P1) >> 33;
68+
if (var1 == 0) {
69+
return 0; // avoid exception caused by division by zero
70+
}
71+
p = 1048576 - adc_P;
72+
p = (((p << 31) - var2) * 3125) / var1;
73+
var1 = (((int64_t)dig_P9) * (p >> 13) * (p >> 13)) >> 25;
74+
var2 = (((int64_t)dig_P8) * p) >> 19;
75+
p = ((p + var1 + var2) >> 8) + (((int64_t)dig_P7) << 4);
76+
return (uint32_t)p / 256;
77+
}
78+
79+
float BMP280::calcAltitude(float p0, float p1, float t) {
80+
double C;
81+
Serial.print("p0 = ");
82+
Serial.println(p0);
83+
Serial.print("p1 = ");
84+
Serial.println(p1);
85+
Serial.print("t = ");
86+
Serial.println(t);
87+
C = (p0 / p1);
88+
Serial.print("C = ");
89+
Serial.println(C);
90+
C = pow(C, (1.0 / 5.25588)) - 1.0;
91+
Serial.print("C = ");
92+
Serial.println(C);
93+
C = (C * (t + 273.15)) / 0.0065;
94+
Serial.print("C = ");
95+
Serial.println(C);
96+
return C;
97+
}
98+
99+
float BMP280::calcAltitude(float p0) {
100+
if (!isTransport_OK) {
101+
return 0;
102+
}
103+
float t = getTemperature();
104+
float p1 = getPressure();
105+
return calcAltitude(p0, p1, t);
106+
}
107+
108+
uint8_t BMP280::bmp280Read8(uint8_t reg) {
109+
Wire.beginTransmission(_devAddr);
110+
Wire.write(reg);
111+
Wire.endTransmission();
112+
Wire.requestFrom(_devAddr, 1);
113+
// return 0 if slave didn't response
114+
if (Wire.available() < 1) {
115+
isTransport_OK = false;
116+
return 0;
117+
} else if (isTransport_OK == false) {
118+
isTransport_OK = true;
119+
}
120+
return Wire.read();
121+
}
122+
123+
uint16_t BMP280::bmp280Read16(uint8_t reg) {
124+
uint8_t msb, lsb;
125+
Wire.beginTransmission(_devAddr);
126+
Wire.write(reg);
127+
Wire.endTransmission();
128+
Wire.requestFrom(_devAddr, 2);
129+
// return 0 if slave didn't response
130+
if (Wire.available() < 2) {
131+
isTransport_OK = false;
132+
return 0;
133+
} else {
134+
isTransport_OK = true;
135+
}
136+
msb = Wire.read();
137+
lsb = Wire.read();
138+
return (uint16_t) msb << 8 | lsb;
139+
}
140+
141+
uint16_t BMP280::bmp280Read16LE(uint8_t reg) {
142+
uint16_t data = bmp280Read16(reg);
143+
return (data >> 8) | (data << 8);
144+
}
145+
146+
int16_t BMP280::bmp280ReadS16(uint8_t reg) {
147+
return (int16_t)bmp280Read16(reg);
148+
}
149+
150+
int16_t BMP280::bmp280ReadS16LE(uint8_t reg) {
151+
return (int16_t)bmp280Read16LE(reg);
152+
}
153+
154+
uint32_t BMP280::bmp280Read24(uint8_t reg) {
155+
uint32_t data;
156+
Wire.beginTransmission(_devAddr);
157+
Wire.write(reg);
158+
Wire.endTransmission();
159+
Wire.requestFrom(_devAddr, 3);
160+
// return 0 if slave didn't response
161+
if (Wire.available() < 3) {
162+
isTransport_OK = false;
163+
return 0;
164+
} else if (isTransport_OK == false) {
165+
isTransport_OK = true;
166+
if (!init(_devAddr)) {
167+
#ifdef BMP280_DEBUG_PRINT
168+
Serial.println("Device not connected or broken!");
169+
#endif
170+
}
171+
}
172+
data = Wire.read();
173+
data <<= 8;
174+
data |= Wire.read();
175+
data <<= 8;
176+
data |= Wire.read();
177+
return data;
178+
}
179+
180+
void BMP280::writeRegister(uint8_t reg, uint8_t val) {
181+
Wire.beginTransmission(_devAddr); // start transmission to device
182+
Wire.write(reg); // send register address
183+
Wire.write(val); // send value to write
184+
Wire.endTransmission(); // end transmission
185+
}

Grove_BMP280/Seeed_BMP280.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#ifndef _SEEED_BMP280_H_
2+
#define _SEEED_BMP280_H_
3+
4+
#include <Arduino.h>
5+
#include <Wire.h>
6+
7+
#define BMP280_ADDRESS 0x77
8+
9+
#define BMP280_REG_DIG_T1 0x88
10+
#define BMP280_REG_DIG_T2 0x8A
11+
#define BMP280_REG_DIG_T3 0x8C
12+
13+
#define BMP280_REG_DIG_P1 0x8E
14+
#define BMP280_REG_DIG_P2 0x90
15+
#define BMP280_REG_DIG_P3 0x92
16+
#define BMP280_REG_DIG_P4 0x94
17+
#define BMP280_REG_DIG_P5 0x96
18+
#define BMP280_REG_DIG_P6 0x98
19+
#define BMP280_REG_DIG_P7 0x9A
20+
#define BMP280_REG_DIG_P8 0x9C
21+
#define BMP280_REG_DIG_P9 0x9E
22+
23+
#define BMP280_REG_CHIPID 0xD0
24+
#define BMP280_REG_VERSION 0xD1
25+
#define BMP280_REG_SOFTRESET 0xE0
26+
27+
#define BMP280_REG_CONTROL 0xF4
28+
#define BMP280_REG_CONFIG 0xF5
29+
#define BMP280_REG_PRESSUREDATA 0xF7
30+
#define BMP280_REG_TEMPDATA 0xFA
31+
32+
class BMP280 {
33+
public:
34+
bool init(int i2c_addr = BMP280_ADDRESS);
35+
float getTemperature(void);
36+
uint32_t getPressure(void);
37+
float calcAltitude(float p0);
38+
float calcAltitude(float p0, float p1, float t);
39+
private:
40+
bool isTransport_OK;
41+
int _devAddr;
42+
// Calibratino data
43+
uint16_t dig_T1;
44+
int16_t dig_T2;
45+
int16_t dig_T3;
46+
uint16_t dig_P1;
47+
int16_t dig_P2;
48+
int16_t dig_P3;
49+
int16_t dig_P4;
50+
int16_t dig_P5;
51+
int16_t dig_P6;
52+
int16_t dig_P7;
53+
int16_t dig_P8;
54+
int16_t dig_P9;
55+
int32_t t_fine;
56+
57+
// private functoins
58+
uint8_t bmp280Read8(uint8_t reg);
59+
uint16_t bmp280Read16(uint8_t reg);
60+
uint16_t bmp280Read16LE(uint8_t reg);
61+
int16_t bmp280ReadS16(uint8_t reg);
62+
int16_t bmp280ReadS16LE(uint8_t reg);
63+
uint32_t bmp280Read24(uint8_t reg);
64+
void writeRegister(uint8_t reg, uint8_t val);
65+
};
66+
67+
#endif

0 commit comments

Comments
 (0)