找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6810|回复: 0
打印 上一主题 下一主题
收起左侧

BMP280规格书及Arduino测试程序及原理图

[复制链接]
跳转到指定楼层
楼主
含BMP280详细的英文规格书  bmp280.pdf
原理图
成品组件图片
Arduino 测试源程序
文件有:Adafruit_BMP280.h   Adafruit_Sensor.h    library.properties  Adafruit_BMP280.cpp  .gitignore README.md  bmp280test.ino

电路原理图如下:


Arduino源程序如下:
  1. /***************************************************************************
  2.   This is a library for the BMP280 pressure sensor

  3.   Designed specifically to work with the Adafruit BMP280 Breakout

  4.   These sensors use I2C to communicate, 2 pins are required to interface.

  5.   Adafruit invests time and resources providing this open source code,
  6.   please support Adafruit andopen-source hardware by purchasing products
  7.   from Adafruit!

  8.   Written by Kevin Townsend for Adafruit Industries.  
  9.   BSD license, all text above must be included in any redistribution
  10. ***************************************************************************/
  11. #include "Arduino.h"
  12. #include <Wire.h>
  13. #include <SPI.h>
  14. #include "Adafruit_BMP280.h"

  15. static bmp280_calib_data bmp280_calib;

  16. /***************************************************************************
  17. PRIVATE FUNCTIONS
  18. ***************************************************************************/


  19. Adafruit_BMP280::Adafruit_BMP280()
  20.   : _cs(-1), _mosi(-1), _miso(-1), _sck(-1)
  21. { }

  22. Adafruit_BMP280::Adafruit_BMP280(int8_t cspin)
  23.   : _cs(cspin), _mosi(-1), _miso(-1), _sck(-1)
  24. { }

  25. Adafruit_BMP280::Adafruit_BMP280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin)
  26.   : _cs(cspin), _mosi(mosipin), _miso(misopin), _sck(sckpin)
  27. { }


  28. bool Adafruit_BMP280::begin(uint8_t a) {
  29.   _i2caddr = a;

  30.   if (_cs == -1) {
  31.     // i2c
  32.     Wire.begin();
  33.   } else {
  34.     digitalWrite(_cs, HIGH);
  35.     pinMode(_cs, OUTPUT);

  36.     if (_sck == -1) {
  37.       // hardware SPI
  38.       SPI.begin();
  39.     } else {
  40.       // software SPI
  41.       pinMode(_sck, OUTPUT);
  42.       pinMode(_mosi, OUTPUT);
  43.       pinMode(_miso, INPUT);
  44.     }
  45.   }

  46.   if (read8(BMP280_REGISTER_CHIPID) != 0x58)
  47.     return false;

  48.   readCoefficients();
  49.   write8(BMP280_REGISTER_CONTROL, 0x3F);
  50.   return true;
  51. }

  52. uint8_t Adafruit_BMP280::spixfer(uint8_t x) {
  53.   if (_sck == -1)
  54.     return SPI.transfer(x);
  55.   
  56.   // software spi
  57.   //Serial.println("Software SPI");
  58.   uint8_t reply = 0;
  59.   for (int i=7; i>=0; i--) {
  60.     reply <<= 1;
  61.     digitalWrite(_sck, LOW);
  62.     digitalWrite(_mosi, x & (1<<i));
  63.     digitalWrite(_sck, HIGH);
  64.     if (digitalRead(_miso))
  65.       reply |= 1;
  66.   }
  67.   return reply;
  68. }

  69. /**************************************************************************/
  70. /*!
  71.     @brief  Writes an 8 bit value over I2C/SPI
  72. */
  73. /**************************************************************************/
  74. void Adafruit_BMP280::write8(byte reg, byte value)
  75. {
  76.   if (_cs == -1) {
  77.     Wire.beginTransmission((uint8_t)_i2caddr);
  78.     Wire.write((uint8_t)reg);
  79.     Wire.write((uint8_t)value);
  80.     Wire.endTransmission();
  81.   } else {
  82.     if (_sck == -1)
  83.       SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
  84.     digitalWrite(_cs, LOW);
  85.     spixfer(reg & ~0x80); // write, bit 7 low
  86.     spixfer(value);
  87.     digitalWrite(_cs, HIGH);
  88.     if (_sck == -1)
  89.       SPI.endTransaction();              // release the SPI bus
  90.   }
  91. }

  92. /**************************************************************************/
  93. /*!
  94.     @brief  Reads an 8 bit value over I2C
  95. */
  96. /**************************************************************************/
  97. uint8_t Adafruit_BMP280::read8(byte reg)
  98. {
  99.   uint8_t value;
  100.   
  101.   if (_cs == -1) {
  102.     Wire.beginTransmission((uint8_t)_i2caddr);
  103.     Wire.write((uint8_t)reg);
  104.     Wire.endTransmission();
  105.     Wire.requestFrom((uint8_t)_i2caddr, (byte)1);
  106.     value = Wire.read();
  107.     Wire.endTransmission();
  108.   } else {
  109.     if (_sck == -1)
  110.       SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
  111.     digitalWrite(_cs, LOW);
  112.     spixfer(reg | 0x80); // read, bit 7 high
  113.     value = spixfer(0);
  114.     digitalWrite(_cs, HIGH);
  115.     if (_sck == -1)
  116.       SPI.endTransaction();              // release the SPI bus
  117.   }
  118.   return value;
  119. }

  120. /**************************************************************************/
  121. /*!
  122.     @brief  Reads a 16 bit value over I2C
  123. */
  124. /**************************************************************************/
  125. uint16_t Adafruit_BMP280::read16(byte reg)
  126. {
  127.   uint16_t value;

  128.   if (_cs == -1) {
  129.     Wire.beginTransmission((uint8_t)_i2caddr);
  130.     Wire.write((uint8_t)reg);
  131.     Wire.endTransmission();
  132.     Wire.requestFrom((uint8_t)_i2caddr, (byte)2);
  133.     value = (Wire.read() << 8) | Wire.read();
  134.     Wire.endTransmission();
  135.   } else {
  136.     if (_sck == -1)
  137.       SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
  138.     digitalWrite(_cs, LOW);
  139.     spixfer(reg | 0x80); // read, bit 7 high
  140.     value = (spixfer(0) << 8) | spixfer(0);
  141.     digitalWrite(_cs, HIGH);
  142.     if (_sck == -1)
  143.       SPI.endTransaction();              // release the SPI bus
  144.   }

  145.   return value;
  146. }

  147. uint16_t Adafruit_BMP280::read16_LE(byte reg) {
  148.   uint16_t temp = read16(reg);
  149.   return (temp >> 8) | (temp << 8);
  150.   
  151. }

  152. /**************************************************************************/
  153. /*!
  154.     @brief  Reads a signed 16 bit value over I2C
  155. */
  156. /**************************************************************************/
  157. int16_t Adafruit_BMP280::readS16(byte reg)
  158. {
  159.   return (int16_t)read16(reg);

  160. }

  161. int16_t Adafruit_BMP280::readS16_LE(byte reg)
  162. {
  163.   return (int16_t)read16_LE(reg);

  164. }

  165. /**************************************************************************/
  166. /*!
  167.     @brief  Reads the factory-set coefficients
  168. */
  169. /**************************************************************************/
  170. void Adafruit_BMP280::readCoefficients(void)
  171. {
  172.     bmp280_calib.dig_T1 = read16_LE(BMP280_REGISTER_DIG_T1);
  173.     bmp280_calib.dig_T2 = readS16_LE(BMP280_REGISTER_DIG_T2);
  174.     bmp280_calib.dig_T3 = readS16_LE(BMP280_REGISTER_DIG_T3);

  175.     bmp280_calib.dig_P1 = read16_LE(BMP280_REGISTER_DIG_P1);
  176.     bmp280_calib.dig_P2 = readS16_LE(BMP280_REGISTER_DIG_P2);
  177.     bmp280_calib.dig_P3 = readS16_LE(BMP280_REGISTER_DIG_P3);
  178.     bmp280_calib.dig_P4 = readS16_LE(BMP280_REGISTER_DIG_P4);
  179.     bmp280_calib.dig_P5 = readS16_LE(BMP280_REGISTER_DIG_P5);
  180.     bmp280_calib.dig_P6 = readS16_LE(BMP280_REGISTER_DIG_P6);
  181.     bmp280_calib.dig_P7 = readS16_LE(BMP280_REGISTER_DIG_P7);
  182.     bmp280_calib.dig_P8 = readS16_LE(BMP280_REGISTER_DIG_P8);
  183.     bmp280_calib.dig_P9 = readS16_LE(BMP280_REGISTER_DIG_P9);
  184. }

  185. /**************************************************************************/
  186. /*!

  187. */
  188. /**************************************************************************/
  189. float Adafruit_BMP280::readTemperature(void)
  190. {
  191.   int32_t var1, var2;
  192.   
  193.   int32_t adc_T = read16(BMP280_REGISTER_TEMPDATA);
  194.   adc_T <<= 8;
  195.   adc_T |= read8(BMP280_REGISTER_TEMPDATA+2);
  196.   adc_T >>= 4;

  197.   var1  = ((((adc_T>>3) - ((int32_t)bmp280_calib.dig_T1 <<1))) *
  198.            ((int32_t)bmp280_calib.dig_T2)) >> 11;

  199.   var2  = (((((adc_T>>4) - ((int32_t)bmp280_calib.dig_T1)) *
  200.              ((adc_T>>4) - ((int32_t)bmp280_calib.dig_T1))) >> 12) *
  201.            ((int32_t)bmp280_calib.dig_T3)) >> 14;

  202.   t_fine = var1 + var2;

  203.   float T  = (t_fine * 5 + 128) >> 8;
  204.   return T/100;
  205. }

  206. /**************************************************************************/
  207. /*!

  208. */
  209. /**************************************************************************/
  210. float Adafruit_BMP280::readPressure(void) {
  211.   int64_t var1, var2, p;
  212.   
  213.   int32_t adc_P = read16(BMP280_REGISTER_PRESSUREDATA);
  214.   adc_P <<= 8;
  215.   adc_P |= read8(BMP280_REGISTER_PRESSUREDATA+2);
  216.   adc_P >>= 4;

  217.   var1 = ((int64_t)t_fine) - 128000;
  218.   var2 = var1 * var1 * (int64_t)bmp280_calib.dig_P6;
  219.   var2 = var2 + ((var1*(int64_t)bmp280_calib.dig_P5)<<17);
  220.   var2 = var2 + (((int64_t)bmp280_calib.dig_P4)<<35);
  221.   var1 = ((var1 * var1 * (int64_t)bmp280_calib.dig_P3)>>8) +
  222.     ((var1 * (int64_t)bmp280_calib.dig_P2)<<12);
  223.   var1 = (((((int64_t)1)<<47)+var1))*((int64_t)bmp280_calib.dig_P1)>>33;
  224.   
  225.   if (var1 == 0) {
  226.     return 0;  // avoid exception caused by division by zero
  227.   }
  228.   p = 1048576 - adc_P;
  229.   p = (((p<<31) - var2)*3125) / var1;
  230.   var1 = (((int64_t)bmp280_calib.dig_P9) * (p>>13) * (p>>13)) >> 25;
  231.   var2 = (((int64_t)bmp280_calib.dig_P8) * p) >> 19;

  232.   p = ((p + var1 + var2) >> 8) + (((int64_t)bmp280_calib.dig_P7)<<4);
  233.   return (float)p/256;
  234. }
复制代码

所有资料51hei提供下载:
GY-BMP280-3.3.zip (2.11 MB, 下载次数: 51)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表