Hardware
Informatie (ENG)
Description:
The BME280 Breakout Board is the easy way to measure pressure and humidity, and without taking up a lot of room. It gives you easy to solder 0.1″ headers, runs I2C or SPI, takes measurements at less than 1mA and idles less than 5uA (yes, microamps!).
The BME280 can be used to take pressure, humidity, and temperature readings. Use the data to get relative altitude changes, or absolute altitude if the locally reported barometric pressure is known.
Specificaties:
Temp: -40C to 85C
Humidity: 0 – 100% RH, =-3% from 20-80%
Pressure: 30,000Pa to 110,000Pa, relative accuracy of 12Pa, absolute accuracy of 100Pa
Altitude: 0 to 30,000 ft (9.2 km), relative accuracy of 3.3 ft (1 m) at sea level, 6.6 (2 m) at 30,000 ft.
Typical application:
– Enhancement of GPS navigation (e.g. time-to-first-fix improvement,dead-reckoning,slope detection)
– Indoor navigation (floor detection,elevator detection)
– Outdoor navigation,leisure and sports applications
– Weather forecast
– Health care application (e.g. sirometry)
– Vertical velocity indication (e.g. risk/sink speed)
Schema
Pinout
![]() | |
---|---|
Pin: | Functie: |
1 | +5V (VCC) |
2 | GND |
3 | SCL Serial Clock (line) |
4 | SCA Serial Clock (data) |
5 | CSB (Chip Select) |
6 | SDO (Serial Data Out) |
Aansluiten op de Arduino
Sluit de module aan volgens onderstaand overzicht:
Arduino Pin: | BMe280 Pin: |
---|---|
+5v | 01 (+5V) |
GND | 02 (GND) |
A5 | 03 (SCL / Serial Clock line) |
A4 | 04 (SCA /Serial Clock data) |
Script met I2C bibliotheek
Wat heb je nodig?
Het script leest de Temperatuur, Luchtvochtigheid en Luchtdruk uit:
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 |
#include <BME280I2C.h> #include <Wire.h> #define SERIAL_BAUD 9600 BME280I2C bme; // Default : forced mode, standby time = 1000 ms // Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off, float pres, temp, hum; void setup(){ Serial.begin(SERIAL_BAUD); while(!Serial) {} // Wait Wire.begin(); while(!bme.begin()) { Serial.println("Could not find BME280 sensor!"); delay(1000); } } void loop() { BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); BME280::PresUnit presUnit(BME280::PresUnit_Pa); bme.read(pres, temp, hum, tempUnit, presUnit); Serial.print("\tTemp: "); Serial.print(temp); Serial.print("C"); Serial.print("\tHum: "); Serial.print(hum); Serial.print("% RH"); Serial.print("\tPres: "); Serial.print(pres); Serial.println(" Pa"); delay(1000); } |
Het resultaat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Temp: 24.50C Hum: 32.08% RH Pres: 100314.98 Pa Temp: 24.45C Hum: 32.15% RH Pres: 100317.16 Pa Temp: 24.45C Hum: 32.16% RH Pres: 100312.70 Pa Temp: 24.44C Hum: 32.15% RH Pres: 100315.46 Pa Temp: 24.44C Hum: 32.17% RH Pres: 100313.67 Pa Temp: 24.45C Hum: 32.21% RH Pres: 100312.70 Pa Temp: 24.43C Hum: 32.30% RH Pres: 100311.98 Pa Temp: 24.43C Hum: 32.47% RH Pres: 100314.63 Pa Temp: 24.42C Hum: 32.59% RH Pres: 100307.70 Pa Temp: 24.43C Hum: 32.60% RH Pres: 100314.63 Pa Temp: 24.42C Hum: 32.54% RH Pres: 100309.48 Pa Temp: 24.42C Hum: 32.49% RH Pres: 100331.39 Pa Temp: 24.42C Hum: 32.44% RH Pres: 100305.06 Pa Temp: 24.42C Hum: 32.54% RH Pres: 100312.11 Pa Temp: 24.41C Hum: 32.55% RH Pres: 100311.27 Pa Temp: 24.42C Hum: 32.54% RH Pres: 100310.33 Pa Temp: 24.41C Hum: 32.55% RH Pres: 100311.27 Pa Temp: 24.42C Hum: 32.53% RH Pres: 100310.33 Pa Temp: 24.44C Hum: 32.52% RH Pres: 100312.83 Pa Temp: 24.43C Hum: 32.47% RH Pres: 100308.54 Pa |
Script met alleen wire bibliotheek
Wat heb je nodig?
1) Alleen de Wire bibliotheek (wordt standaard bijgeleverd bij ArduinoIDE)
Het standaard adres is 0x76, pas deze regel aan indien een afwijkend adres is gebruikt:
#define BME280_ADDRESS 0x76
Het script leest de Temperatuur, Luchtvochtigheid en Luchtdruk uit:
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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
#include <Wire.h> #define BME280_ADDRESS 0x76 unsigned long int hum_raw,temp_raw,pres_raw; signed long int t_fine; uint16_t dig_T1; int16_t dig_T2; int16_t dig_T3; uint16_t dig_P1; int16_t dig_P2; int16_t dig_P3; int16_t dig_P4; int16_t dig_P5; int16_t dig_P6; int16_t dig_P7; int16_t dig_P8; int16_t dig_P9; int8_t dig_H1; int16_t dig_H2; int8_t dig_H3; int16_t dig_H4; int16_t dig_H5; int8_t dig_H6; void setup() { uint8_t osrs_t = 1; //Temperature oversampling x 1 uint8_t osrs_p = 1; //Pressure oversampling x 1 uint8_t osrs_h = 1; //Humidity oversampling x 1 uint8_t mode = 3; //Normal mode uint8_t t_sb = 5; //Tstandby 1000ms uint8_t filter = 0; //Filter off uint8_t spi3w_en = 0; //3-wire SPI Disable uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode; uint8_t config_reg = (t_sb << 5) | (filter << 2) | spi3w_en; uint8_t ctrl_hum_reg = osrs_h; Serial.begin(9600); Wire.begin(); writeReg(0xF2,ctrl_hum_reg); writeReg(0xF4,ctrl_meas_reg); writeReg(0xF5,config_reg); readTrim(); // } void loop() { double temp_act = 0.0, press_act = 0.0,hum_act=0.0; signed long int temp_cal; unsigned long int press_cal,hum_cal; readData(); temp_cal = calibration_T(temp_raw); press_cal = calibration_P(pres_raw); hum_cal = calibration_H(hum_raw); temp_act = (double)temp_cal / 100.0; press_act = (double)press_cal / 100.0; hum_act = (double)hum_cal / 1024.0; Serial.print("TEMP : "); Serial.print(temp_act); Serial.print(" DegC PRESS : "); Serial.print(press_act); Serial.print(" hPa HUM : "); Serial.print(hum_act); Serial.println(" %"); delay(1000); } void readTrim() { uint8_t data[32],i=0; Wire.beginTransmission(BME280_ADDRESS); Wire.write(0x88); Wire.endTransmission(); Wire.requestFrom(BME280_ADDRESS,24); while(Wire.available()) { data[i] = Wire.read(); i++; } Wire.beginTransmission(BME280_ADDRESS); Wire.write(0xA1); Wire.endTransmission(); Wire.requestFrom(BME280_ADDRESS,1); data[i] = Wire.read(); i++; Wire.beginTransmission(BME280_ADDRESS); Wire.write(0xE1); Wire.endTransmission(); Wire.requestFrom(BME280_ADDRESS,7); while(Wire.available()) { data[i] = Wire.read(); i++; } dig_T1 = (data[1] << 8) | data[0]; dig_T2 = (data[3] << 8) | data[2]; dig_T3 = (data[5] << 8) | data[4]; dig_P1 = (data[7] << 8) | data[6]; dig_P2 = (data[9] << 8) | data[8]; dig_P3 = (data[11]<< 8) | data[10]; dig_P4 = (data[13]<< 8) | data[12]; dig_P5 = (data[15]<< 8) | data[14]; dig_P6 = (data[17]<< 8) | data[16]; dig_P7 = (data[19]<< 8) | data[18]; dig_P8 = (data[21]<< 8) | data[20]; dig_P9 = (data[23]<< 8) | data[22]; dig_H1 = data[24]; dig_H2 = (data[26]<< 8) | data[25]; dig_H3 = data[27]; dig_H4 = (data[28]<< 4) | (0x0F & data[29]); dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F); dig_H6 = data[31]; } void writeReg(uint8_t reg_address, uint8_t data) { Wire.beginTransmission(BME280_ADDRESS); Wire.write(reg_address); Wire.write(data); Wire.endTransmission(); } void readData() { int i = 0; uint32_t data[8]; Wire.beginTransmission(BME280_ADDRESS); Wire.write(0xF7); Wire.endTransmission(); Wire.requestFrom(BME280_ADDRESS,8); while(Wire.available()){ data[i] = Wire.read(); i++; } pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4); temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4); hum_raw = (data[6] << 8) | data[7]; } signed long int calibration_T(signed long int adc_T) { signed long int var1, var2, T; var1 = ((((adc_T >> 3) - ((signed long int)dig_T1<<1))) * ((signed long int)dig_T2)) >> 11; var2 = (((((adc_T >> 4) - ((signed long int)dig_T1)) * ((adc_T>>4) - ((signed long int)dig_T1))) >> 12) * ((signed long int)dig_T3)) >> 14; t_fine = var1 + var2; T = (t_fine * 5 + 128) >> 8; return T; } unsigned long int calibration_P(signed long int adc_P) { signed long int var1, var2; unsigned long int P; var1 = (((signed long int)t_fine)>>1) - (signed long int)64000; var2 = (((var1>>2) * (var1>>2)) >> 11) * ((signed long int)dig_P6); var2 = var2 + ((var1*((signed long int)dig_P5))<<1); var2 = (var2>>2)+(((signed long int)dig_P4)<<16); var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13)) >>3) + ((((signed long int)dig_P2) * var1)>>1))>>18; var1 = ((((32768+var1))*((signed long int)dig_P1))>>15); if (var1 == 0) { return 0; } P = (((unsigned long int)(((signed long int)1048576)-adc_P)-(var2>>12)))*3125; if(P<0x80000000) { P = (P << 1) / ((unsigned long int) var1); } else { P = (P / (unsigned long int)var1) * 2; } var1 = (((signed long int)dig_P9) * ((signed long int)(((P>>3) * (P>>3))>>13)))>>12; var2 = (((signed long int)(P>>2)) * ((signed long int)dig_P8))>>13; P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4)); return P; } unsigned long int calibration_H(signed long int adc_H) { signed long int v_x1; v_x1 = (t_fine - ((signed long int)76800)); v_x1 = (((((adc_H << 14) -(((signed long int)dig_H4) << 20) - (((signed long int)dig_H5) * v_x1)) + ((signed long int)16384)) >> 15) * (((((((v_x1 * ((signed long int)dig_H6)) >> 10) * (((v_x1 * ((signed long int)dig_H3)) >> 11) + ((signed long int) 32768))) >> 10) + (( signed long int)2097152)) * ((signed long int) dig_H2) + 8192) >> 14)); v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int)dig_H1)) >> 4)); v_x1 = (v_x1 < 0 ? 0 : v_x1); v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1); return (unsigned long int)(v_x1 >> 12); } |
Het resultaat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
TEMP : 25.54 DegC PRESS : 1019.16 hPa HUM : 47.29 % TEMP : 25.51 DegC PRESS : 1019.19 hPa HUM : 47.31 % TEMP : 25.51 DegC PRESS : 1019.24 hPa HUM : 47.32 % TEMP : 26.66 DegC PRESS : 1019.18 hPa HUM : 50.57 % TEMP : 27.47 DegC PRESS : 1019.16 hPa HUM : 50.83 % TEMP : 27.75 DegC PRESS : 1019.17 hPa HUM : 51.09 % TEMP : 27.89 DegC PRESS : 1019.20 hPa HUM : 51.41 % TEMP : 28.04 DegC PRESS : 1019.18 hPa HUM : 51.69 % TEMP : 27.39 DegC PRESS : 1019.13 hPa HUM : 53.10 % TEMP : 26.75 DegC PRESS : 1019.18 hPa HUM : 50.68 % TEMP : 26.50 DegC PRESS : 1019.12 hPa HUM : 49.25 % TEMP : 26.36 DegC PRESS : 1019.17 hPa HUM : 48.05 % TEMP : 26.28 DegC PRESS : 1019.11 hPa HUM : 47.55 % TEMP : 26.21 DegC PRESS : 1019.16 hPa HUM : 47.22 % TEMP : 26.15 DegC PRESS : 1019.16 hPa HUM : 47.16 % TEMP : 26.10 DegC PRESS : 1019.13 hPa HUM : 47.01 % TEMP : 26.06 DegC PRESS : 1019.10 hPa HUM : 46.79 % TEMP : 26.00 DegC PRESS : 1019.12 hPa HUM : 46.63 % TEMP : 25.97 DegC PRESS : 1019.12 hPa HUM : 46.65 % |
Bronnen:
osoyoo.com