PIC: BMP085 - Sensor de Pressão
Atmospheric Pressure Sensor BMP085 Module GY-65
BMP085 da Bosch é um sensor de pressão barométrica. Possui uma faixa de medição de entre 30000 e 110000 Pa. O BMP085 também proporciona uma medição da temperatura de 0 à 65°C.
O BMP085 tem interface I2C, então você pode facilmente comunicá-lo com seu microcontrolador através dos pinos SDA( dados ) e SCL ( clock ).
Este sensor pode ser utilizados em projetos visando a previsão do tempo, pois a pressão atmosférica está diretamente relacionado com as mudanças no clima. Também é possível utilizá-lo como medição da altitude.
PINOS
BMP085 | Função |
VCC | Alimentação (5V) |
GND | GND |
EOC | Fim da conversão (HIGH) |
XCLR | Master Clear (LOW) Reset do sensor |
SCL | Clock |
SDA | Dados |
BIBLIOTECA
#include <built_in.h> #ifdef USE_BMP085_SOFT_I2C #define BMP085_I2C_Wr Soft_I2C_Write #define BMP085_I2C_Rd Soft_I2C_Read #define BMP085_I2C_Stop Soft_I2C_Stop #define BMP085_I2C_Start Soft_I2C_Start #define BMP085_Scl Soft_I2C_Scl #define BMP085_Sda Soft_I2C_Sda #define BMP085_Scl_Direction Soft_I2C_Scl_Direction #define BMP085_Sda_Direction Soft_I2C_Sda_Direction #else #define BMP085_I2C_Wr I2C1_Wr #define BMP085_I2C_Rd I2C1_Rd #define BMP085_I2C_Stop I2C1_Stop #define BMP085_I2C_Start I2C1_Start #endif #define BMP085_ADDRESS 0xEE #define BMP085_ULTRALOWPOWER 0 #define BMP085_STANDARD 1 #define BMP085_HIGHRES 2 #define BMP085_ULTRAHIGHRES 3 //Calibration Data #define BMP085_CAL_AC1 0xAA //0 #define BMP085_CAL_AC2 0xAC //1 #define BMP085_CAL_AC3 0xAE //2 #define BMP085_CAL_AC4 0xB0 //3 #define BMP085_CAL_AC5 0xB2 //4 #define BMP085_CAL_AC6 0xB4 //5 #define BMP085_CAL_B1 0xB6 //6 #define BMP085_CAL_B2 0xB8 //7 #define BMP085_CAL_MB 0xBA //8 #define BMP085_CAL_MC 0xBC //9 #define BMP085_CAL_MD 0xBE //10 #define BMP085_CONTROL 0xF4 #define BMP085_TEMPDATA 0xF6 #define BMP085_PRESSUREDATA 0xF6 #define BMP085_READTEMPCMD 0x2E #define BMP085_READPRESSURECMD 0x34 typedef struct { float Temperatura; float Pressao; float Altitude; }BMP085_Barometer; typedef struct { int AC1; int AC2; int AC3; unsigned AC4; unsigned AC5; unsigned AC6; int mB1; int mB2; int MB; int MC; int MD; }Calibration_Data; Calibration_Data Cal; void BMP085_Init() { char i; BMP085_I2C_Start(); BMP085_I2C_Wr( BMP085_ADDRESS ); BMP085_I2C_Wr( BMP085_CAL_AC1 ); BMP085_I2C_Start(); BMP085_I2C_Wr( BMP085_ADDRESS | 1 ); for( i=0; i < 10; i++) { ((int*)&Cal)[i] = (BMP085_I2C_Rd(1) << 8) + BMP085_I2C_Rd(1); } ((int*)&Cal)[10] = (BMP085_I2C_Rd(1) << 8) + BMP085_I2C_Rd(0); BMP085_I2C_Stop(); } void BMP085_Read( char oversampling, BMP085_Barometer *Bar ) { char cmd = 0x34; long UT=0, UP, _B3, _B5, _B6, X1, X2, X3, pp; unsigned long _B4, _B7; //Read Uncompensated Temperature Value BMP085_I2C_Start(); BMP085_I2C_Wr( BMP085_ADDRESS ); BMP085_I2C_Wr( BMP085_CONTROL ); BMP085_I2C_Wr( BMP085_READTEMPCMD ); BMP085_I2C_Stop(); Delay_ms( 5 ); BMP085_I2C_Start(); BMP085_I2C_Wr( BMP085_ADDRESS ); BMP085_I2C_Wr( BMP085_TEMPDATA ); BMP085_I2C_Start(); BMP085_I2C_Wr( BMP085_ADDRESS | 1 ); Hi(UT) = BMP085_I2C_Rd(1); Lo(UT) = BMP085_I2C_Rd(0); BMP085_I2C_Stop(); //Read Uncompensated Pressure Value cmd.B6 = oversampling.B0; cmd.B7 = oversampling.B1; BMP085_I2C_Start(); BMP085_I2C_Wr( BMP085_ADDRESS ); BMP085_I2C_Wr( BMP085_CONTROL ); BMP085_I2C_Wr( cmd ); BMP085_I2C_Stop(); switch(oversampling) { case 0: Delay_ms(5); break; case 1: Delay_ms(8); break; case 2: Delay_ms(14); break; case 3: Delay_ms(26); break; } BMP085_I2C_Start(); BMP085_I2C_Wr( BMP085_ADDRESS ); BMP085_I2C_Wr( BMP085_PRESSUREDATA ); BMP085_I2C_Start(); BMP085_I2C_Wr( BMP085_ADDRESS | 1 ); Higher(UP) = BMP085_I2C_Rd(1); Hi(UP) = BMP085_I2C_Rd(1); Lo(UP) = BMP085_I2C_Rd(0); BMP085_I2C_Stop(); Highest(UP) = 0; UP >>= ( 8 - oversampling ); //Calcule True Temperature X1 = ( UT - Cal.AC6 ); X1 *= Cal.AC5; X1 >>= 15; X2 = ((long)Cal.MC << 11); X2 /= (X1 + Cal.MD); _B5 = X1 + X2; Bar->Temperatura = ( (_B5 + 8) >> 4 ) / 10; //Calcule True Pressure _B6 = _B5 - 4000; X1 = pow(_B6, 2); X1 >>= 12; X1 *= (long)Cal.mB2; X1 >>= 11; X2 = ((long)Cal.AC2 * _B6); X2 >>= 11; X3 = X1 + X2; _B3 = (long)Cal.AC1 * 4; _B3 += X3; _B3 <<= oversampling; _B3 += 2; _B3 >>= 2; X1 = (Cal.AC3 * _B6); X1 >>= 13; X2 = (_B6 * _B6); X2 >>= 12; X2 *= Cal.mB1; X2 >>= 8; X2 >>= 8; X3 = ((X1 + X2) + 2 ); X3 >>= 2; _B4 = Cal.AC4; _B4 *= (unsigned long)(X3 + 32768); _B4 >>= 15; _B7 = (unsigned long)(UP - _B3); _B7 *= (unsigned long)(50000 >> oversampling); if( _B7 < 0x80000000 ) { pp = ((_B7 * 2) / _B4); } else { pp = ((_B7 / _B4) * 2); } X1 = pow((pp >> 8), 2); X1 *= 1519; X1 >>= 15; X2 = (-7357 * pp); X2 >>= 8; X2 >>= 8; Bar->Pressao = pp + ( (X1 + X2 + 3791) >> 4); //Calcula a Altitude Bar->Altitude = 1 - pow( (Bar->Pressao / 101035), 0.190295 ); Bar->Altitude *= 44330; }
EXEMPLO
MikroC PRO PIC
/* BMP085 - Sensor de Pressao Digital MCU: PIC18F4550 CLOCK: HS + PLL ( 48 Mhz ) COMPILADOR: MikroC PRO PIC */ #include <nokia3310.h> #include <bmp085.h> sbit Nokia_SCE at RD0_Bit; sbit Nokia_RST at RD1_Bit; sbit Nokia_DC at RD2_Bit; sbit Nokia_MOSI at RD3_Bit; sbit Nokia_CLK at RD4_Bit; sbit Nokia_SCE_Direction at TRISD0_Bit; sbit Nokia_RST_Direction at TRISD1_Bit; sbit Nokia_DC_Direction at TRISD2_Bit; sbit Nokia_MOSI_Direction at TRISD3_Bit; sbit Nokia_CLK_Direction at TRISD4_Bit; char text[12]; BMP085_Barometer Bar; void main() { ADCON1 = 0x0F; Nokia_Init(); Nokia_Clear(); I2C1_Init( 100000 ); Uart1_Init(9600); BMP085_Init(); while(1) { BMP085_Read( 0, &Bar ); LongWordToStr( Bar.Pressao, text ); LTrim(text); Nokia_Set_Cursor( 0, 0 ); Nokia_Out( "Pressao: ", BLACK ); Nokia_Out( text , BLACK ); Nokia_Out( " Pa", BLACK ); IntToStr( Bar.Altitude, text ); LTrim(text); Nokia_Set_Cursor( 0, 1 ); Nokia_Out( "Altitude: ", BLACK ); Nokia_Out( text , BLACK ); Nokia_Out( "m", BLACK ); IntToStr( Bar.Temperatura, text ); LTrim(text); Nokia_Set_Cursor( 0, 2 ); Nokia_Out( "Temp.: ", BLACK ); Nokia_Out( text , BLACK ); Nokia_Out( " C", BLACK ); Delay_ms( 300 ); } }
No teste utilizei o módulo BMP085 modelo GY-65 comprado no Mercado Livre. Este módulo possui um regulador de tensão de 3.3V e os resistores de Pull-up e é alimentado com 5V. Se o seu módulo for de outro modelo, verifique se o mesmo pode ser ligar direto nos 5V, pois o BMP085 é alimentado com 3.3V.
DOWNLOAD
Projeto: BMP085.rar
Cara, vc é demais!!!
ResponderExcluirvoce não existe voce e o maximo cara
ResponderExcluirAmigo, que interessante, é isso que eu necessito. Você já mexeu alguma vez com o sensor barométrico HP03M da Hope RF? estou a uns 3 meses mexendo em sensores desse tipo HP03SA e agora o HP03M e não obtive sucesso em nenhum deles... apesar de ter (quase) certeza que a leitura do AD e da EEPROM estejam certas, os valores finais que eu obtenho do sensor estão muito diferentes dos valores reais tipo a temp na sala estar 25,6ºC e ele indicar 31ºC e pressão indicar 211hpa sendo 1017 o valor real... nem imagino mais o que verificar nele para conseguir usá-lo.
ResponderExcluirAlguém ai tem essa componente para proteus?
ResponderExcluirTambem estou precisando deste componente para proteus
ResponderExcluirOla .
ResponderExcluirTenho um sensor BMP 180 como usaria ele nesse mesmo projeto , apenas substituo a biblioteca?
grato.
proteus 8.5 tem esse bmp180
ResponderExcluir