MatrixMiniR4 1.1.4
Matrix Mini R4 Arduino Library API Documentation
Loading...
Searching...
No Matches
MiniR4_GroveI2C_BME280.cpp
Go to the documentation of this file.
1
15
16bool GroveI2C_BME280::begin(int i2c_addr)
17{
18 uint8_t retry = 0;
19 uint8_t chip_id = 0;
20
21 _devAddr = i2c_addr;
22 _pWire->begin();
23 i2cMUXSelect();
24
25 while ((retry++ < 5) && (chip_id != 0x60))
26 {
27 chip_id = BME280Read8(BME280_REG_CHIPID);
28#ifdef BMP280_DEBUG_PRINT
29 Serial.print("Read chip ID: ");
30 Serial.println(chip_id);
31#endif
32 delay(100);
33 }
34 if (chip_id != 0x60)
35 {
36 Serial.println("Read Chip ID fail!");
37 return false;
38 }
39
40 dig_T1 = BME280Read16LE(BME280_REG_DIG_T1);
41 dig_T2 = BME280ReadS16LE(BME280_REG_DIG_T2);
42 dig_T3 = BME280ReadS16LE(BME280_REG_DIG_T3);
43
44 dig_P1 = BME280Read16LE(BME280_REG_DIG_P1);
45 dig_P2 = BME280ReadS16LE(BME280_REG_DIG_P2);
46 dig_P3 = BME280ReadS16LE(BME280_REG_DIG_P3);
47 dig_P4 = BME280ReadS16LE(BME280_REG_DIG_P4);
48 dig_P5 = BME280ReadS16LE(BME280_REG_DIG_P5);
49 dig_P6 = BME280ReadS16LE(BME280_REG_DIG_P6);
50 dig_P7 = BME280ReadS16LE(BME280_REG_DIG_P7);
51 dig_P8 = BME280ReadS16LE(BME280_REG_DIG_P8);
52 dig_P9 = BME280ReadS16LE(BME280_REG_DIG_P9);
53
54 dig_H1 = BME280Read8(BME280_REG_DIG_H1);
55 dig_H2 = BME280Read16LE(BME280_REG_DIG_H2);
56 dig_H3 = BME280Read8(BME280_REG_DIG_H3);
57 dig_H4 = (BME280Read8(BME280_REG_DIG_H4) << 4) | (0x0F & BME280Read8(BME280_REG_DIG_H4 + 1));
58 dig_H5 = (BME280Read8(BME280_REG_DIG_H5 + 1) << 4) | (0x0F & BME280Read8(BME280_REG_DIG_H5) >> 4);
59 dig_H6 = (int8_t)BME280Read8(BME280_REG_DIG_H6);
60
61 writeRegister(BME280_REG_CONTROLHUMID, 0x05); // Choose 16X oversampling
62 writeRegister(BME280_REG_CONTROL, 0xB7); // Choose 16X oversampling
63
64 return true;
65}
66
68{
69 int32_t var1, var2;
70
71 int32_t adc_T = BME280Read24(BME280_REG_TEMPDATA);
72 // Check if the last transport successed
73 if (!isTransport_OK)
74 {
75 return 0;
76 }
77 adc_T >>= 4;
78 var1 = (((adc_T >> 3) - ((int32_t)(dig_T1 << 1))) *
79 ((int32_t)dig_T2)) >>
80 11;
81
82 var2 = (((((adc_T >> 4) - ((int32_t)dig_T1)) *
83 ((adc_T >> 4) - ((int32_t)dig_T1))) >>
84 12) *
85 ((int32_t)dig_T3)) >>
86 14;
87
88 t_fine = var1 + var2;
89 float T = (t_fine * 5 + 128) >> 8;
90 return T / 100;
91}
92
94{
95 int64_t var1, var2, p;
96 // Call getTemperature to get t_fine
98 // Check if the last transport successed
99 if (!isTransport_OK)
100 {
101 return 0;
102 }
103 int32_t adc_P = BME280Read24(BME280_REG_PRESSUREDATA);
104 adc_P >>= 4;
105 var1 = ((int64_t)t_fine) - 128000;
106 var2 = var1 * var1 * (int64_t)dig_P6;
107 var2 = var2 + ((var1 * (int64_t)dig_P5) << 17);
108 var2 = var2 + (((int64_t)dig_P4) << 35);
109 var1 = ((var1 * var1 * (int64_t)dig_P3) >> 8) + ((var1 * (int64_t)dig_P2) << 12);
110 var1 = (((((int64_t)1) << 47) + var1)) * ((int64_t)dig_P1) >> 33;
111 if (var1 == 0)
112 {
113 return 0; // avoid exception caused by division by zero
114 }
115 p = 1048576 - adc_P;
116 p = (((p << 31) - var2) * 3125) / var1;
117 var1 = (((int64_t)dig_P9) * (p >> 13) * (p >> 13)) >> 25;
118 var2 = (((int64_t)dig_P8) * p) >> 19;
119 p = ((p + var1 + var2) >> 8) + (((int64_t)dig_P7) << 4);
120 return (float)(p / 256.0);
121}
122
124{
125 int32_t v_x1_u32r, adc_H;
126 // Call getTemperature to get t_fine
128 // Check if the last transport successed
129 if (!isTransport_OK)
130 {
131 return 0;
132 }
133 adc_H = BME280Read16(BME280_REG_HUMIDITYDATA);
134 v_x1_u32r = (t_fine - ((int32_t)76800));
135 v_x1_u32r = (((((adc_H << 14) - (((int32_t)dig_H4) << 20) - (((int32_t)dig_H5) * v_x1_u32r)) +
136 ((int32_t)16384)) >>
137 15) *
138 (((((((v_x1_u32r * ((int32_t)dig_H6)) >> 10) *
139 (((v_x1_u32r * ((int32_t)dig_H3)) >> 11) + ((int32_t)32768))) >>
140 10) +
141 ((int32_t)2097152)) *
142 ((int32_t)dig_H2) +
143 8192) >>
144 14));
145 v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((int32_t)dig_H1)) >> 4));
146 v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r);
147 v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r);
148 v_x1_u32r = v_x1_u32r >> 12;
149 float h = v_x1_u32r / 1024.0;
150 return h;
151}
152
153float GroveI2C_BME280::calcAltitude(float pressure)
154{
155 if (!isTransport_OK)
156 {
157 return 0;
158 }
159
160 float A = pressure / 101325;
161 float B = 1 / 5.25588;
162 float C = pow(A, B);
163 C = 1.0 - C;
164 C = C / 0.0000225577;
165 return C;
166}
167
168uint8_t GroveI2C_BME280::BME280Read8(uint8_t reg)
169{
170 i2cMUXSelect();
171 _pWire->beginTransmission(_devAddr);
172 _pWire->write(reg);
173 _pWire->endTransmission();
174
175 _pWire->requestFrom(_devAddr, 1);
176 // return 0 if slave didn't response
177 if (_pWire->available() < 1)
178 {
179 isTransport_OK = false;
180 return 0;
181 }
182 else
183 {
184 isTransport_OK = true;
185 }
186
187 return _pWire->read();
188}
189
190uint16_t GroveI2C_BME280::BME280Read16(uint8_t reg)
191{
192 uint8_t msb, lsb;
193 i2cMUXSelect();
194 _pWire->beginTransmission(_devAddr);
195 _pWire->write(reg);
196 _pWire->endTransmission();
197
198 _pWire->requestFrom(_devAddr, 2);
199 // return 0 if slave didn't response
200 if (_pWire->available() < 2)
201 {
202 isTransport_OK = false;
203 return 0;
204 }
205 else
206 {
207 isTransport_OK = true;
208 }
209 msb = _pWire->read();
210 lsb = _pWire->read();
211
212 return (uint16_t)msb << 8 | lsb;
213}
214
215uint16_t GroveI2C_BME280::BME280Read16LE(uint8_t reg)
216{
217 uint16_t data = BME280Read16(reg);
218 return (data >> 8) | (data << 8);
219}
220
221int16_t GroveI2C_BME280::BME280ReadS16(uint8_t reg)
222{
223 return (int16_t)BME280Read16(reg);
224}
225
226int16_t GroveI2C_BME280::BME280ReadS16LE(uint8_t reg)
227{
228 return (int16_t)BME280Read16LE(reg);
229}
230
231uint32_t GroveI2C_BME280::BME280Read24(uint8_t reg)
232{
233 uint32_t data;
234 i2cMUXSelect();
235 _pWire->beginTransmission(_devAddr);
236 _pWire->write(reg);
237 _pWire->endTransmission();
238
239 _pWire->requestFrom(_devAddr, 3);
240 // return 0 if slave didn't response
241 if (_pWire->available() < 3)
242 {
243 isTransport_OK = false;
244 return 0;
245 }
246 else if (isTransport_OK == false)
247 {
248 isTransport_OK = true;
249 if (!begin(_devAddr))
250 {
251#ifdef BMP280_DEBUG_PRINT
252 Serial.println("Device not connected or broken!");
253#endif
254 }
255 }
256 data = _pWire->read();
257 data <<= 8;
258 data |= _pWire->read();
259 data <<= 8;
260 data |= _pWire->read();
261
262 return data;
263}
264
265void GroveI2C_BME280::writeRegister(uint8_t reg, uint8_t val)
266{
267 i2cMUXSelect();
268 _pWire->beginTransmission(_devAddr); // start transmission to device
269 _pWire->write(reg); // send register address
270 _pWire->write(val); // send value to write
271 _pWire->endTransmission(); // end transmission
272}
273
274void GroveI2C_BME280::i2cMUXSelect()
275{
276 if (_ch < 0)
277 return; // no MUX
278 _pWire->beginTransmission(ADDR_PCA954X);
279 _pWire->write((1 << _ch));
280 _pWire->endTransmission(1);
281 delayMicroseconds(300);
282}
A library for interfacing with the BME280 sensor via I2C.
#define BME280_REG_DIG_H3
#define BME280_REG_DIG_P6
#define BME280_REG_DIG_P9
#define BME280_REG_DIG_H1
#define ADDR_PCA954X
#define BME280_REG_DIG_H5
#define BME280_REG_DIG_P3
#define BME280_REG_CONTROLHUMID
#define BME280_REG_PRESSUREDATA
#define BME280_REG_CONTROL
#define BME280_REG_DIG_H4
#define BME280_REG_DIG_H6
#define BME280_REG_DIG_P4
#define BME280_REG_DIG_T3
#define BME280_REG_DIG_P2
#define BME280_REG_DIG_T1
#define BME280_REG_DIG_T2
#define BME280_REG_DIG_P7
#define BME280_REG_DIG_P5
#define BME280_REG_TEMPDATA
#define BME280_REG_DIG_H2
#define BME280_REG_HUMIDITYDATA
#define BME280_REG_DIG_P1
#define BME280_REG_DIG_P8
#define BME280_REG_CHIPID
float getTemperature(void)
Reads the temperature from the BME280 sensor.
bool begin(int i2c_addr=BME280_ADDRESS)
Initializes the BME280 sensor.
float calcAltitude(float pressure)
Calculates the altitude based on the pressure reading.
float getHumidity(void)
Reads the humidity from the BME280 sensor.
float getPressure(void)
Reads the pressure from the BME280 sensor.