|
含BMP280詳細(xì)的英文規(guī)格書 bmp280.pdf
原理圖
成品組件圖片
Arduino 測試源程序
文件有:Adafruit_BMP280.h Adafruit_Sensor.h library.properties Adafruit_BMP280.cpp .gitignore README.md bmp280test.ino
電路原理圖如下:
0.png (83.71 KB, 下載次數(shù): 90)
下載附件
2019-9-22 15:55 上傳
Arduino源程序如下:
- /***************************************************************************
- This is a library for the BMP280 pressure sensor
- Designed specifically to work with the Adafruit BMP280 Breakout
-
- These sensors use I2C to communicate, 2 pins are required to interface.
- Adafruit invests time and resources providing this open source code,
- please support Adafruit andopen-source hardware by purchasing products
- from Adafruit!
- Written by Kevin Townsend for Adafruit Industries.
- BSD license, all text above must be included in any redistribution
- ***************************************************************************/
- #include "Arduino.h"
- #include <Wire.h>
- #include <SPI.h>
- #include "Adafruit_BMP280.h"
- static bmp280_calib_data bmp280_calib;
- /***************************************************************************
- PRIVATE FUNCTIONS
- ***************************************************************************/
- Adafruit_BMP280::Adafruit_BMP280()
- : _cs(-1), _mosi(-1), _miso(-1), _sck(-1)
- { }
- Adafruit_BMP280::Adafruit_BMP280(int8_t cspin)
- : _cs(cspin), _mosi(-1), _miso(-1), _sck(-1)
- { }
- Adafruit_BMP280::Adafruit_BMP280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin)
- : _cs(cspin), _mosi(mosipin), _miso(misopin), _sck(sckpin)
- { }
- bool Adafruit_BMP280::begin(uint8_t a) {
- _i2caddr = a;
- if (_cs == -1) {
- // i2c
- Wire.begin();
- } else {
- digitalWrite(_cs, HIGH);
- pinMode(_cs, OUTPUT);
- if (_sck == -1) {
- // hardware SPI
- SPI.begin();
- } else {
- // software SPI
- pinMode(_sck, OUTPUT);
- pinMode(_mosi, OUTPUT);
- pinMode(_miso, INPUT);
- }
- }
- if (read8(BMP280_REGISTER_CHIPID) != 0x58)
- return false;
- readCoefficients();
- write8(BMP280_REGISTER_CONTROL, 0x3F);
- return true;
- }
- uint8_t Adafruit_BMP280::spixfer(uint8_t x) {
- if (_sck == -1)
- return SPI.transfer(x);
-
- // software spi
- //Serial.println("Software SPI");
- uint8_t reply = 0;
- for (int i=7; i>=0; i--) {
- reply <<= 1;
- digitalWrite(_sck, LOW);
- digitalWrite(_mosi, x & (1<<i));
- digitalWrite(_sck, HIGH);
- if (digitalRead(_miso))
- reply |= 1;
- }
- return reply;
- }
- /**************************************************************************/
- /*!
- @brief Writes an 8 bit value over I2C/SPI
- */
- /**************************************************************************/
- void Adafruit_BMP280::write8(byte reg, byte value)
- {
- if (_cs == -1) {
- Wire.beginTransmission((uint8_t)_i2caddr);
- Wire.write((uint8_t)reg);
- Wire.write((uint8_t)value);
- Wire.endTransmission();
- } else {
- if (_sck == -1)
- SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
- digitalWrite(_cs, LOW);
- spixfer(reg & ~0x80); // write, bit 7 low
- spixfer(value);
- digitalWrite(_cs, HIGH);
- if (_sck == -1)
- SPI.endTransaction(); // release the SPI bus
- }
- }
- /**************************************************************************/
- /*!
- @brief Reads an 8 bit value over I2C
- */
- /**************************************************************************/
- uint8_t Adafruit_BMP280::read8(byte reg)
- {
- uint8_t value;
-
- if (_cs == -1) {
- Wire.beginTransmission((uint8_t)_i2caddr);
- Wire.write((uint8_t)reg);
- Wire.endTransmission();
- Wire.requestFrom((uint8_t)_i2caddr, (byte)1);
- value = Wire.read();
- Wire.endTransmission();
- } else {
- if (_sck == -1)
- SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
- digitalWrite(_cs, LOW);
- spixfer(reg | 0x80); // read, bit 7 high
- value = spixfer(0);
- digitalWrite(_cs, HIGH);
- if (_sck == -1)
- SPI.endTransaction(); // release the SPI bus
- }
- return value;
- }
- /**************************************************************************/
- /*!
- @brief Reads a 16 bit value over I2C
- */
- /**************************************************************************/
- uint16_t Adafruit_BMP280::read16(byte reg)
- {
- uint16_t value;
- if (_cs == -1) {
- Wire.beginTransmission((uint8_t)_i2caddr);
- Wire.write((uint8_t)reg);
- Wire.endTransmission();
- Wire.requestFrom((uint8_t)_i2caddr, (byte)2);
- value = (Wire.read() << 8) | Wire.read();
- Wire.endTransmission();
- } else {
- if (_sck == -1)
- SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
- digitalWrite(_cs, LOW);
- spixfer(reg | 0x80); // read, bit 7 high
- value = (spixfer(0) << 8) | spixfer(0);
- digitalWrite(_cs, HIGH);
- if (_sck == -1)
- SPI.endTransaction(); // release the SPI bus
- }
- return value;
- }
- uint16_t Adafruit_BMP280::read16_LE(byte reg) {
- uint16_t temp = read16(reg);
- return (temp >> 8) | (temp << 8);
-
- }
- /**************************************************************************/
- /*!
- @brief Reads a signed 16 bit value over I2C
- */
- /**************************************************************************/
- int16_t Adafruit_BMP280::readS16(byte reg)
- {
- return (int16_t)read16(reg);
- }
- int16_t Adafruit_BMP280::readS16_LE(byte reg)
- {
- return (int16_t)read16_LE(reg);
- }
- /**************************************************************************/
- /*!
- @brief Reads the factory-set coefficients
- */
- /**************************************************************************/
- void Adafruit_BMP280::readCoefficients(void)
- {
- bmp280_calib.dig_T1 = read16_LE(BMP280_REGISTER_DIG_T1);
- bmp280_calib.dig_T2 = readS16_LE(BMP280_REGISTER_DIG_T2);
- bmp280_calib.dig_T3 = readS16_LE(BMP280_REGISTER_DIG_T3);
- bmp280_calib.dig_P1 = read16_LE(BMP280_REGISTER_DIG_P1);
- bmp280_calib.dig_P2 = readS16_LE(BMP280_REGISTER_DIG_P2);
- bmp280_calib.dig_P3 = readS16_LE(BMP280_REGISTER_DIG_P3);
- bmp280_calib.dig_P4 = readS16_LE(BMP280_REGISTER_DIG_P4);
- bmp280_calib.dig_P5 = readS16_LE(BMP280_REGISTER_DIG_P5);
- bmp280_calib.dig_P6 = readS16_LE(BMP280_REGISTER_DIG_P6);
- bmp280_calib.dig_P7 = readS16_LE(BMP280_REGISTER_DIG_P7);
- bmp280_calib.dig_P8 = readS16_LE(BMP280_REGISTER_DIG_P8);
- bmp280_calib.dig_P9 = readS16_LE(BMP280_REGISTER_DIG_P9);
- }
- /**************************************************************************/
- /*!
- */
- /**************************************************************************/
- float Adafruit_BMP280::readTemperature(void)
- {
- int32_t var1, var2;
-
- int32_t adc_T = read16(BMP280_REGISTER_TEMPDATA);
- adc_T <<= 8;
- adc_T |= read8(BMP280_REGISTER_TEMPDATA+2);
- adc_T >>= 4;
- var1 = ((((adc_T>>3) - ((int32_t)bmp280_calib.dig_T1 <<1))) *
- ((int32_t)bmp280_calib.dig_T2)) >> 11;
- var2 = (((((adc_T>>4) - ((int32_t)bmp280_calib.dig_T1)) *
- ((adc_T>>4) - ((int32_t)bmp280_calib.dig_T1))) >> 12) *
- ((int32_t)bmp280_calib.dig_T3)) >> 14;
- t_fine = var1 + var2;
- float T = (t_fine * 5 + 128) >> 8;
- return T/100;
- }
- /**************************************************************************/
- /*!
- */
- /**************************************************************************/
- float Adafruit_BMP280::readPressure(void) {
- int64_t var1, var2, p;
-
- int32_t adc_P = read16(BMP280_REGISTER_PRESSUREDATA);
- adc_P <<= 8;
- adc_P |= read8(BMP280_REGISTER_PRESSUREDATA+2);
- adc_P >>= 4;
- var1 = ((int64_t)t_fine) - 128000;
- var2 = var1 * var1 * (int64_t)bmp280_calib.dig_P6;
- var2 = var2 + ((var1*(int64_t)bmp280_calib.dig_P5)<<17);
- var2 = var2 + (((int64_t)bmp280_calib.dig_P4)<<35);
- var1 = ((var1 * var1 * (int64_t)bmp280_calib.dig_P3)>>8) +
- ((var1 * (int64_t)bmp280_calib.dig_P2)<<12);
- var1 = (((((int64_t)1)<<47)+var1))*((int64_t)bmp280_calib.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 = (((int64_t)bmp280_calib.dig_P9) * (p>>13) * (p>>13)) >> 25;
- var2 = (((int64_t)bmp280_calib.dig_P8) * p) >> 19;
- p = ((p + var1 + var2) >> 8) + (((int64_t)bmp280_calib.dig_P7)<<4);
- return (float)p/256;
- }
復(fù)制代碼
所有資料51hei提供下載:
GY-BMP280-3.3.zip
(2.11 MB, 下載次數(shù): 52)
2019-9-22 15:46 上傳
點(diǎn)擊文件名下載附件
BMP280 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|