BME280 - Senzor atmosferskog pritiska, temperature i relativne vlažnosti vazduha
Proizvodjač: BOSCH Sensortec
Napon napajanja: 1.8...3.6 V
Izlazni signal: I2C interface
Opseg merenja: pritisak 300...1100 hPa, temperatura -40 °C...+85 °C, vlažnost 0...100 %
Rezolucija merenja: pritisak 0.18 Pa, temperatura 0.01 °C, vlažnost 0.008 %
Tačnost merenja: pritisak ±1 hPa, temperatura ±0.5°C (±1 °C), vlažnost ±3 %
Period merenja: 0.5...1000 ms
Software in C++ for Raspberry Pi
//****************************************************************************
// Calibration values - BME280
//****************************************************************************
// Pomocu: i2cdump -y 1 0x76, prepisati vrednosti od adrese 0x88 do 0xE7
// These are stored in the BME280 // MSB, LSB
unsigned short int dig_T1 = 0x6E64; //0x89,0x88
signed short int dig_T2 = 0x66FD; //0x8B,0x8A
signed short int dig_T3 = 0x0032; //0x8D,0x8C
unsigned short int dig_P1 = 0x900A; //0x8F,0x8E
signed short int dig_P2 = 0xD5A7; //0x91,0x90
signed short int dig_P3 = 0x0BD0; //0x93,0x92
signed short int dig_P4 = 0x1C5C; //0x95,0x94
signed short int dig_P5 = 0xFFAB; //0x97,0x96
signed short int dig_P6 = 0xFFF9; //0x99,0x98
signed short int dig_P7 = 0x26AC; //0x9B,0x9A
signed short int dig_P8 = 0xD80A; //0x9D,0x9C
signed short int dig_P9 = 0x10BD; //0x9F,0x9E
unsigned char dig_H1 = 0x4B; // 0xA1
signed short int dig_H2 = 0x0162; //0xE2,0xE1
unsigned char dig_H3 = 0x00; // 0xE3
signed short int dig_H4 = 0x0152; //0xE4,0xE5[3:0] => dig_H4[11:4],[3:0]
signed short int dig_H5 = 0x0000; //0xE6,0xE5[7:4] => dig_H5[11:4],[3:0]
signed char dig_H6 = 0x1E; // 0xE7
//----------------------------------------------------------------------
...
// ----- Temperatura vazduha (C)
msb = hex_val(buf[18],buf[19]);
lsb = hex_val(buf[20],buf[21]);
xsb = hex_val(buf[22],buf[23]);
t = (float)compensateTemperature(msb,lsb,xsb)/100;
printf("%2.1f'C ",t);
// ----- Pritisak vazduha (mbar)
msb = hex_val(buf[12],buf[13]);
lsb = hex_val(buf[14],buf[15]);
xsb = hex_val(buf[16],buf[17]);
p = (float)compensatePressure(msb,lsb,xsb)/100;
printf("%5.0fmbar ",p);
// ----- Vlaznost vazduha (%)
msb = hex_val(buf[24],buf[25]);
lsb = hex_val(buf[26],buf[27]);
rh = (float)compensateHumidity(msb,lsb)/1000;
printf("%2.1f%% ",rh);
...
//----------------------------------------------------------------------
// Calculate calibrated temperature BME280
// resolution 1/100
long signed int compensateTemperature(int msb, int lsb, int xsb)
{
long signed int var1, var2, T;
long signed int adc_T;
adc_T = (((unsigned int) msb << 16) | ((unsigned int) lsb << 8) | (unsigned int) xsb) >> 4;
var1 = ((((adc_T>>3) - ((long signed int)dig_T1 <<1))) * ((long signed int)dig_T2)) >> 11;
var2 = (((((adc_T>>4) - ((long signed int)dig_T1)) * ((adc_T>>4) - ((long signed int)dig_T1))) >> 12) *
((long signed int)dig_T3)) >> 14;
t_fine = var1 + var2;
T = (t_fine * 5 + 128) >> 8;
return T;
}
//--------------------------------------------------------------------
// Calculate calibrated pressure BME280
// resolution 1/256
long unsigned int compensatePressure(int msb, int lsb, int xsb)
{
long long signed int var1, var2, p;
long signed int adc_P;
adc_P = (((unsigned int) msb << 16) | ((unsigned int) lsb << 8) | (unsigned int) xsb) >> 4;
var1 = ((long long signed int)t_fine) - 128000;
var2 = var1 * var1 * (long long signed int)dig_P6;
var2 = var2 + ((var1*(long long signed int)dig_P5)<<17);
var2 = var2 + (((long long signed int)dig_P4)<<35);
var1 = ((var1 * var1 * (long long signed int)dig_P3)>>8) + ((var1 * (long long signed int)dig_P2)<<12);
var1 = (((((long long signed int)1)<<47)+var1))*((long long signed int)dig_P1)>>33;
if (var1 == 0) {
return 0; // avoid exception caused by division by zero
}
p = 1048576 - adc_P;
p = (((p<<31) - var2)*3125) / var1;
var1 = (((long long signed int)dig_P9) * (p>>13) * (p>>13)) >> 25;
var2 = (((long long signed int)dig_P8) * p) >> 19;
p = ((p + var1 + var2) >> 8) + (((long long signed int)dig_P7)<<4);
return (long unsigned int)p/256;
}
//--------------------------------------------------------------------
// Calculate calibrated humidity BME280
// resolution 1/1024
long unsigned int compensateHumidity(int msb, int lsb)
{
long signed int v_x1_u32r;
long signed int adc_H;
adc_H = ((unsigned int) msb << 8) | (unsigned int) lsb;
v_x1_u32r = (t_fine - ((long signed int)76800));
v_x1_u32r = (((((adc_H << 14) - (((long signed int)dig_H4) << 20) - (((long signed int)dig_H5) * v_x1_u32r)) +
((long signed int)16384)) >> 15) * (((((((v_x1_u32r * ((long signed int)dig_H6)) >> 10) *
(((v_x1_u32r * ((long signed int)dig_H3)) >> 11) + ((long signed int)32768))) >> 10) +
((long signed int)2097152)) * ((long signed int)dig_H2) + 8192) >> 14));
v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((long signed int)dig_H1)) >> 4));
v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r;
v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r;
return (long unsigned int)(v_x1_u32r>>12);
}
//--------------------------------------------------------------------
Software in Assembler for PIC16F876, rutina se poziva kod starta
;---------------------------------------------------------------------
;Inicijalizacija BME280
Init_BME280
i2c_start
movlw 0xEC ;Module address WR (0x76)
call i2c_send
movlw 0xF2 ;ctrl_hum
call i2c_send
movlw B'00000101' ;osrs_h=16
call i2c_send
movlw 0xF4 ;ctrl_meas
call i2c_send
movlw B'10110111' ;osrs_p=16 ;osrs_t=16; mode=11 merenja se automatski ponavljaju
call i2c_send
movlw 0xF5 ;config
call i2c_send
movlw B'10010000' ;t_sb=500ms ;filter=16 ;I2C
call i2c_send
i2c_stop
return
;---------------------------------------------------------------------
...
Software in Assembler for PIC16F876, rutina se poziva svake sekunde
;---------------------------------------------------------------------
;Citaj podatke iz BME280
BME280
i2c_restart
movlw 0xEC ;Module address WR (0x76)
call i2c_send
movlw 0xF7 ;address
call i2c_send
;- - - - - - - - - - - - - - - - - - - - - - - -
i2c_restart
movlw 0xED ;Module address RD (0x76)
call i2c_send
;Citaj podatke iz BME280 - Pritisak
i2c_receive
i2c_send_ACK
movf SSPBUF,W ;uzmi podatak 1
movwf P_H
i2c_receive
i2c_send_ACK
movf SSPBUF,W ;uzmi podatak 2
movwf P_L
i2c_receive
i2c_send_ACK
movf SSPBUF,W ;uzmi podatak 3
movwf P_X
;Citaj podatke iz BME280 - Temperatura
i2c_receive
i2c_send_ACK
movf SSPBUF,W ;uzmi podatak 4
movwf T2_H
i2c_receive
i2c_send_ACK
movf SSPBUF,W ;uzmi podatak 5
movwf T2_L
i2c_receive
i2c_send_ACK
movf SSPBUF,W ;uzmi podatak 6
movwf T2_X
;Citaj podatke iz BME280 - Vlaznost
i2c_receive
i2c_send_ACK
movf SSPBUF,W ;uzmi podatak 7
movwf RH_H
i2c_receive
i2c_send_NACK
movf SSPBUF,W ;uzmi podatak 8
movwf RH_L
i2c_stop
return
;---------------------------------------------------------------------
Download File:
bme280.py - Python software za testiranje BME280
Šema RPI WS
Šema PIC WS
Data Sheet - BME280.pdf