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