Módulo Sensor Barometro - BMP180

€19,95
Adicionar ao Carrinho de Compras
  • SKU :: FUN-MD0054
  • Tipo:: Arduino - Funduino
  • Marca:: Keyestudio

Descrição

Esta placa incluí um sensor de pressão atmosférica -BMP180 - de alta precisão com uma margem de medida de 300 e 1100hPa (Hecto Pascal) com uma margem de erro de 0,03hPa. Baseado na tecnologia piezo-resistiva de alta eficiência e larga duração. O sensor tem uma margem de alimentação de 1,8V e 3,6VDC. Desenhado para ser conectado directamente a um microcontrolador mediante interface I2C. Dispõe de 2 resistências pull-up de 4,7Kohm. Estes tipos de sensores podem seer usados para calcular a altitude, pelo que são muito uteis em UAVEspecificações:- Dimensões: 21 x 18 mm  - Alimentação: 1.8V a 6V   - I2C Max Speed: 3.5MHz  - Baixo consumo de energia - 0.5uA a 1 Hz  - Interface I2C  - Baixo nível de ruído - até 0.02hPa (17 centímetros)  - Faixa de Pressão: 300hpa para 1100hPa (+ -500m a 9000m)#include#define BMP085_ADDRESS 0x77 // I2C address of BMP085const unsigned char OSS = 0; // Oversampling Setting// Calibration valuesint ac1;int ac2;int ac3;unsigned int ac4;unsigned int ac5;unsigned int ac6;int b1;int b2;int mb;int mc;int md;// b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)// so ...Temperature(...) must be called before ...Pressure(...).long b5;void setup(){Serial.begin(9600);Wire.begin();bmp085Calibration();}void loop(){float temperature = bmp085GetTemperature(bmp085ReadUT()); //MUST be called firstfloat pressure = bmp085GetPressure(bmp085ReadUP());float atm = pressure / 101325; // "standard atmosphere"float altitude = calcAltitude(pressure); //Uncompensated caculation - in MetersSerial.print("Temperature: ");Serial.print(temperature, 2); //display 2 decimal placesSerial.println("deg C");Serial.print("Pressure: ");Serial.print(pressure, 0); //whole number only.Serial.println(" Pa");Serial.print("Standard Atmosphere: ");Serial.println(atm, 4); //display 4 decimal placesSerial.print("Altitude: ");Serial.print(altitude, 2); //display 2 decimal placesSerial.println(" M");Serial.println();//line breakdelay(1000); //wait a second and get values again.}// Stores all of the bmp085's calibration values into global variables// Calibration values are required to calculate temp and pressure// This function should be called at the beginning of the programvoid bmp085Calibration(){ac1 = bmp085ReadInt(0xAA);ac2 = bmp085ReadInt(0xAC);ac3 = bmp085ReadInt(0xAE);ac4 = bmp085ReadInt(0xB0);ac5 = bmp085ReadInt(0xB2);ac6 = bmp085ReadInt(0xB4);b1 = bmp085ReadInt(0xB6);b2 = bmp085ReadInt(0xB8);mb = bmp085ReadInt(0xBA);mc = bmp085ReadInt(0xBC);md = bmp085ReadInt(0xBE);}// Calculate temperature in deg Cfloat bmp085GetTemperature(unsigned int ut){long x1, x2;x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;x2 = ((long)mc b5 = x1 + x2;float temp = ((b5 + 8)>>4);temp = temp /10;return temp;}// Calculate pressure given up// calibration values must be known// b5 is also required so bmp085GetTemperature(...) must be called first.// Value returned will be pressure in units of Pa.long bmp085GetPressure(unsigned long up){long x1, x2, x3, b3, b6, p;unsigned long b4, b7;b6 = b5 - 4000;// Calculate B3x1 = (b2 * (b6 * b6)>>12)>>11;x2 = (ac2 * b6)>>11;x3 = x1 + x2;b3 = (((((long)ac1)*4 + x3)>2;// Calculate B4x1 = (ac3 * b6)>>13;x2 = (b1 * ((b6 * b6)>>12))>>16;x3 = ((x1 + x2) + 2)>>2;b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;b7 = ((unsigned long)(up - b3) * (50000>>OSS));if (b7 p = (b7 elsep = (b7/b4) x1 = (p>>8) * (p>>8);x1 = (x1 * 3038)>>16;x2 = (-7357 * p)>>16;p += (x1 + x2 + 3791)>>4;long temp = p;return temp;}// Read 1 byte from the BMP085 at 'address'char bmp085Read(unsigned char address){unsigned char data;Wire.beginTransmission(BMP085_ADDRESS);Wire.write(address);Wire.endTransmission();Wire.requestFrom(BMP085_ADDRESS, 1);while(!Wire.available());return Wire.read();}// Read 2 bytes from the BMP085// First byte will be from 'address'// Second byte will be from 'address'+1int bmp085ReadInt(unsigned char address){unsigned char msb, lsb;Wire.beginTransmission(BMP085_ADDRESS);Wire.write(address);Wire.endTransmission();Wire.requestFrom(BMP085_ADDRESS, 2);while(Wire.available() ;msb = Wire.read();lsb = Wire.read();return (int) msb }// Read the uncompensated temperature valueunsigned int bmp085ReadUT(){unsigned int ut;// Write 0x2E into Register 0xF4// This requests a temperature readingWire.beginTransmission(BMP085_ADDRESS);Wire.write(0xF4);Wire.write(0x2E);Wire.endTransmission();// Wait at least 4.5msdelay(5);// Read two bytes from registers 0xF6 and 0xF7ut = bmp085ReadInt(0xF6);return ut;}// Read the uncompensated pressure valueunsigned long bmp085ReadUP(){unsigned char msb, lsb, xlsb;unsigned long up = 0;// Write 0x34+(OSS // Request a pressure reading w/ oversampling settingWire.beginTransmission(BMP085_ADDRESS);Wire.write(0xF4);Wire.write(0x34 + (OSS Wire.endTransmission();// Wait for conversion, delay time dependent on OSSdelay(2 + (3 // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)msb = bmp085Read(0xF6);lsb = bmp085Read(0xF7);xlsb = bmp085Read(0xF8);up = (((unsigned long) msb > (8-OSS);return up;}void writeRegister(int deviceAddress, byte address, byte val) {Wire.beginTransmission(deviceAddress); // start transmission to deviceWire.write(address); // send register addressWire.write(val); // send value to writeWire.endTransmission(); // end transmission}int readRegister(int deviceAddress, byte address){int v;Wire.beginTransmission(deviceAddress);Wire.write(address); // register to readWire.endTransmission();Wire.requestFrom(deviceAddress, 1); // read a bytewhile(!Wire.available()) {// waiting}v = Wire.read();return v;}float calcAltitude(float pressure){float A = pressure/101325;float B = 1/5.25588;float C = pow(A,B);C = 1 - C;C = C /0.0000225577;return C;}