“BME280 Environmental Sensor”的版本间的差异
来自丢石头百科
Yousimaier17(讨论 | 贡献) |
|||
(未显示2个用户的7个中间版本) | |||
第1行: | 第1行: | ||
<div class="tabber"> | <div class="tabber"> | ||
− | {{ | + | {{Product |
− | + | |images=[[File:BME280-Environmental-Sensor-intro.jpg|360px |alt=BME280-Environmental-Sensor | BME280 Environmental Sensor]] | |
− | | | + | |categories= |
− | | | + | {{Category|温度}} |
− | | | + | {{Category|湿度}} |
+ | {{Category|气压}} | ||
+ | {{Category|传感器}} | ||
|brand=Waveshare | |brand=Waveshare | ||
− | | | + | |features=BME280环境传感器 |
− | | | + | |interfaces= |
− | | | + | {{Category|SPI接口}} |
− | | | + | {{Category|I2C接口}} |
+ | |related=[[DHT22 Temperature-Humidity Sensor]] | ||
}} | }} | ||
<div class="tabbertab" title="说明"> | <div class="tabbertab" title="说明"> | ||
第17行: | 第20行: | ||
==特点== | ==特点== | ||
*支持I2C接口通信,可设置从机地址 | *支持I2C接口通信,可设置从机地址 | ||
− | * | + | *支持SPI接口通信,默认为SPI接口,可通过I/O口设置I2C接口 |
*板载电平转换电路,可兼容3.3V/5V的工作电平 | *板载电平转换电路,可兼容3.3V/5V的工作电平 | ||
*提供完善的配套资料手册(Raspberry/Arduino/STM32示例程序和用户手册等) | *提供完善的配套资料手册(Raspberry/Arduino/STM32示例程序和用户手册等) | ||
+ | |||
==产品参数== | ==产品参数== | ||
{| border=1; style="width:500px; background:#eeffee; " | {| border=1; style="width:500px; background:#eeffee; " | ||
第85行: | 第89行: | ||
[[File:BMP388-Barometric-Pressure-Sensor-user-manual-2.png|800px]]<br /> | [[File:BMP388-Barometric-Pressure-Sensor-user-manual-2.png|800px]]<br /> | ||
*将Raspberry文件夹拷至树莓派。<br /> | *将Raspberry文件夹拷至树莓派。<br /> | ||
+ | |||
+ | ==安装库== | ||
+ | {{RPI_C_lib}} | ||
===前置工作及演示=== | ===前置工作及演示=== | ||
第138行: | 第145行: | ||
*将下载的示例程序的压缩包解压后,将Arduino文件夹下的BME280-Arduino-Library拷贝至Arduino第三方库目录下.之后重启ArduinoIDE,进入并打开文件->实例->BME280_Libreay->bme280test | *将下载的示例程序的压缩包解压后,将Arduino文件夹下的BME280-Arduino-Library拷贝至Arduino第三方库目录下.之后重启ArduinoIDE,进入并打开文件->实例->BME280_Libreay->bme280test | ||
*按照接口说明中Arduino接口部分接线。 | *按照接口说明中Arduino接口部分接线。 | ||
− | * | + | *默认采用SPI驱动BME280模块。 |
− | * | + | *如需采用IIC驱动BME280模块,请将bme280test.ino中的宏定义USEIIC改为1。(默认I2C器件地址为0X77) |
[[File:BME280-Environmental-Sensor-user-manual-10.png|800px]]<br /> | [[File:BME280-Environmental-Sensor-user-manual-10.png|800px]]<br /> | ||
*如需更改I2C器件的地址为0X76,则将ADDR引脚接至GND(或用0欧姆电阻将焊桥连接),同时将Adafruit.h中的BME280_ADDRESS器件地址改为0X76: | *如需更改I2C器件的地址为0X76,则将ADDR引脚接至GND(或用0欧姆电阻将焊桥连接),同时将Adafruit.h中的BME280_ADDRESS器件地址改为0X76: | ||
第340行: | 第347行: | ||
===文档=== | ===文档=== | ||
− | *[ | + | *[https://{{SERVERNAME}}/w/upload/3/3a/BME280-Environmental-Sensor-user-manual-cn.pdf 用户手册]<br> |
− | *[ | + | *[https://{{SERVERNAME}}/w/upload/4/42/BME280-Environmental-Sensor-Schematic.pdf 原理图] |
===程序=== | ===程序=== | ||
− | *[ | + | *[https://{{SERVERNAME}}/w/upload/b/ba/BME280-Environmental-Sensor-Demo-Code.7z 示例程序] |
===软件=== | ===软件=== | ||
*[https://www.arduino.cc/en/Main/Software Arduino IDE] | *[https://www.arduino.cc/en/Main/Software Arduino IDE] | ||
− | *[ | + | *[[:File:串口调试助手.zip|串口调试助手]] |
===相关资料=== | ===相关资料=== | ||
− | *[ | + | *[https://{{SERVERNAME}}/w/upload/9/91/BME280_datasheet.pdf BME280数据手册] |
</div> | </div> | ||
− | + | == FAQ == | |
<div class="tabbertab" title="FAQ"> | <div class="tabbertab" title="FAQ"> | ||
<br /> | <br /> |
2024年4月8日 (一) 16:32的最新版本
| ||||||||||||||||||||||
| ||||||||||||||||||||||
| ||||||||||||||||||||||
|
目录
产品概述
这是一款环境传感器,可感知环境温度、湿度和大气压强,支持I2C和SPI接口,兼容3.3V/5V电平,小尺寸,低功耗,高精度和稳定性,适用于环境监测、天气预测、海拔高度监测和物联网应用场景。
特点
- 支持I2C接口通信,可设置从机地址
- 支持SPI接口通信,默认为SPI接口,可通过I/O口设置I2C接口
- 板载电平转换电路,可兼容3.3V/5V的工作电平
- 提供完善的配套资料手册(Raspberry/Arduino/STM32示例程序和用户手册等)
产品参数
工作电压: | 5V/3.3V |
通信接口: | I2C/SPI |
温度范围: | -40~85°C (分辨率0.01°C,误差±1°C) |
湿度范围: | 0~100%RH (分辨率0.008%RH,±3% RH) |
压力范围: | 300~1100 hPa (分辨率0.18Pa,误差±1 hPa) |
产品尺寸: | 27mmx20mm |
过孔直径: | 2.0mm |
接口定义
I2C接口 | ||||
功能引脚 | Arduino 接口 | STM32接口 | RASPBERRY | 描述 |
VCC | 3.3V/5V | 3.3V /5V | 3.3V /5V | 电源正 |
GND | GND | GND | GND | 电源地 |
SDA | A4 | PB7 | SDA | I2C数据线 |
SCL | A5 | PB6 | SCL | I2C时钟线 |
ADDR | NC/GND | NC/GND | NC/GND | 地址片选(默认为高电平): 为高电平时,地址为:0x77 为低电平时,地址为:0x76 |
CS | NC | NC | NC | NC |
SPI接口 | ||||
功能引脚 | Arduino 接口 | STM32接口 | RASPBERRY | 描述 |
VCC | 3.3V /5V | 3.3V /5V | 3.3V /5V | 3.3V电源正 |
GND | GND | GND | GND | 电源地 |
MOSI | D11 | PA7 | MOSI | SPI数据输入 |
SCK | D13 | PA5 | SCK | SPI时钟输入 |
MISO | D12 | PA6 | MISO | SPI数据输出 |
CS | D10 | PB6 | 27 | SPI片选,低电平有效 |
用于树莓派
安装必要的函数库
- 需要安装必要的函数库,否则以下的示例程序可能无法正常工作。安装方法详见:Pioneer600_Datasheets
- 在官网上找到对应产品,在产品资料打开下载路径,在wiki中下载示例程序:
- 得到解压包,解压得到如下:
- 将Raspberry文件夹拷至树莓派。
安装库
- 安装BCM2835, 打开树莓派终端,并运行一下指令
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.60.tar.gz tar zxvf bcm2835-1.60.tar.gz cd bcm2835-1.60/ sudo ./configure sudo make sudo make check sudo make install # 更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/
- 安装wiringPi
sudo apt-get install wiringpi #对于树莓派4B可能需要进行升级: cd /tmp wget https://project-downloads.drogon.net/wiringpi-latest.deb sudo dpkg -i wiringpi-latest.deb gpio -v # 运行gpio -v会出现2.52版本,如果没有出现说明安装出错 #Bullseye分支系统使用如下命令: git clone https://github.com/WiringPi/WiringPi cd WiringPi ./build gpio -v # 运行gpio -v会出现2.70版本,如果没有出现说明安装出错
前置工作及演示
前置工作
- 执行如下命令进行树莓派配置:
sudo raspi-config
- 选择Interfacing Options -> I2C -> yes 启动I2C内核驱动
- 选择Interfacing Options -> SPI -> yes启动SPI内核驱动
- 保存退出后,重启树莓派:
sudo reboot
- 重启后,运行命令查看,I2C,SPI模块是否已启动:
lsmod
- 将会有如下的打印信息:
- 如果显示i2c_bcm2835和spi_bcm2835则表示I2C,SPI模块已启动。
- 将BME280模块按照前述I2C总线接口说明连接至树莓派。
- BME280模块的默认I2C器件地址是0x77,若将ADDR接地则器件地址更变为0x76。
- 安装i2c-tools工具进行确认:
sudo apt-get install i2c-tools
- 查询已连接的I2C设备
i2cdetect -y 1
- 将会有如下打印信息:
- 若显示77则表示BME280模块成功连接至树莓派成功。
- 若将ADDR连接至GND则打印出76:
注意:以上测试确保I2C总线上没有其它地址和该器件地址重合的设备。如果以上测试成功则I2C模块加载成功,同时BME280模块成功连接至树莓派。
同时,BME280模块支持SPI驱动,可参考SPI接口说明部分将BME280连接至树莓派。
演示
- 成功将BME280模块连接至树莓派后:
- 如果采用I2C驱动:则先确定I2C器件地址,BME280模块默认I2C器件地址为0X77,若将ADDR接地(或用0欧姆电阻将焊桥连接),则其I2C器件地址变更为0X76。
- 打开main.c文件:
- 进入到BME280-Environmental-Sensor-Demo-Code路径下:
cd BME280-Environmental-Sensor-Demo-Code
- 打开main.c文件:
vim main.c
- 确保main.c中的USEIIC的宏定义为1,以采用I2C驱动。
- 同时检查main.c中的I2C器件地址,确保和当前BME280模块器件地址一致(默认I2C器件地址为0x77,若将ADDR接地则其器件地址为0x76):
- 如果采用SPI驱动:则将BME280模块按照接口说明中的SPI总线接线方式进行接线,并将main.c文件中的USEIIC宏定义改为0。
- 保存并退出编辑,然后重新编译:
sudo make clean sudo make
- 运行:
sudo ./bme280
- 将显示如下数据:
- 从左至右分别显示了BME280测得的温度(摄氏度),大气压(百帕斯卡),相对湿(%RH)。若未成功显示数据,或数据显示不正常请检查连线,通信方式,以及器件地址是否有误。
用于Arduino
- 将下载的示例程序的压缩包解压后,将Arduino文件夹下的BME280-Arduino-Library拷贝至Arduino第三方库目录下.之后重启ArduinoIDE,进入并打开文件->实例->BME280_Libreay->bme280test
- 按照接口说明中Arduino接口部分接线。
- 默认采用SPI驱动BME280模块。
- 如需采用IIC驱动BME280模块,请将bme280test.ino中的宏定义USEIIC改为1。(默认I2C器件地址为0X77)
- 如需更改I2C器件的地址为0X76,则将ADDR引脚接至GND(或用0欧姆电阻将焊桥连接),同时将Adafruit.h中的BME280_ADDRESS器件地址改为0X76:
- 如需获取准测量的准确海拔,还需测得当地海平面的大气压,并修改SEALEVELPRESSURE_HPA宏定义:
- 在正确接线,确定通信方式以及器件地址之后,编译,下载到Arduino。
- 打开:工具 -> 串口监视器,选择波特率为115200,可得如下信息
- 其中从左至右分别显示了BME280传感器测得的温度(摄氏度),大气压(百帕斯卡),相对湿度(%RH),海拔(m)。
- 若未成功显示数据,或数据显示不正常请检查连线,通信方式,以及器件地址是否有误。
用于STM32
- 将下载的示例程序的压缩包解压后,打开STM32文件夹下的STM32-STM32_BME280->USR路径下的工程文件:按照接口说明中STM32接口部分接线。默认采用I2C驱动BME280模块,默认I2C器件地址为0X77。
- 如需采用SPI驱动BME280模块,请将main.c中的宏定义USEIIC改为0:
- 如需更改I2C器件的地址为0X76,则将ADDR引脚接至GND(或用0欧姆电阻将焊桥连接),并将dev.dev_id = BME280_I2C_ADDR_SEC;注释:
- 编译,下载,本次采用的芯片是STM32F103RBT6,采用USART2输出获得的传感器数据。
- 打开串口调试助手,选择对应的COM口,设置波特率为115200,数据位8位,停止位1位,无奇偶校验位,可得如下数据:
- 其中从左至右分别显示了BME280传感器测得的温度(摄氏度),大气压(百帕斯卡),相对湿度(%RH)。
- 若未成功显示数据,或数据显示不正常请检查连线,通信方式,以及器件地址是否有误。
代码分析
- 例程主要采用了官方(Bosch Sensortec)提供的库:https://github.com/BoschSensortec/BME280_driver
针对不同平台实现其底层函数,供上层调用。
- 采用SPI驱动BME280的初始化部分为:
struct bme280_dev dev; int8_t rslt = BME280_OK; /* Sensor_0 interface over SPI with native chip select line */ dev.dev_id = 0; dev.intf = BME280_SPI_INTF; dev.read = user_spi_read; dev.write = user_spi_write; dev.delay_ms = user_delay_ms; rslt = bme280_init(&dev);
- 采用I2C驱动BME280初始化部分:
struct bme280_dev dev; int8_t rslt = BME280_OK; dev.dev_id = BME280_I2C_ADDR_PRIM; dev.intf = BME280_I2C_INTF; dev.read = user_i2c_read; dev.write = user_i2c_write; dev.delay_ms = user_delay_ms; rslt = bme280_init(&dev);
- 其中bme280_dev为官方库中给定的BME280设备结构体,用于初始化以及获取数据用,需要针对不同的平台实现以下函数:
user_i2c_read() user_i2c_write() user_spi_read() user_spi_write() user_delay_ms()
- 并将该函数的函数指针传递给结构体bme280_dev。
读取BME280数据的函数为:
int8_t stream_sensor_data_forced_mode(struct bme280_dev *dev) int8_t stream_sensor_data_normal_mode(struct bme280_dev *dev)
- 并且以上函数均调用了打印函数:
void print_sensor_data(struct bme280_data *comp_data)
- 不同平台的延时函数,I2C读,I2C写,SPI读,SPI写的实现思路为:
void user_delay_ms(uint32_t period) { /* * Return control or wait, * for a period amount of milliseconds */ } int8_t user_spi_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len) { int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */ /* * The parameter dev_id can be used as a variable to select which Chip Select pin has * to be set low to activate the relevant device on the SPI bus */ /* * Data on the bus should be like * |----------------+---------------------+-------------| * | MOSI | MISO | Chip Select | * |----------------+---------------------|-------------| * | (don't care) | (don't care) | HIGH | * | (reg_addr) | (don't care) | LOW | * | (don't care) | (reg_data[0]) | LOW | * | (....) | (....) | LOW | * | (don't care) | (reg_data[len - 1]) | LOW | * | (don't care) | (don't care) | HIGH | * |----------------+---------------------|-------------| */ return rslt; } int8_t user_spi_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len) { int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */ /* * The parameter dev_id can be used as a variable to select which Chip Select pin has * to be set low to activate the relevant device on the SPI bus */ /* * Data on the bus should be like * |---------------------+--------------+-------------| * | MOSI | MISO | Chip Select | * |---------------------+--------------|-------------| * | (don't care) | (don't care) | HIGH | * | (reg_addr) | (don't care) | LOW | * | (reg_data[0]) | (don't care) | LOW | * | (....) | (....) | LOW | * | (reg_data[len - 1]) | (don't care) | LOW | * | (don't care) | (don't care) | HIGH | * |---------------------+--------------|-------------| */ return rslt; } int8_t user_i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len) { int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */ /* * The parameter dev_id can be used as a variable to store the I2C address of the device */ /* * Data on the bus should be like * |------------+---------------------| * | I2C action | Data | * |------------+---------------------| * | Start | - | * | Write | (reg_addr) | * | Stop | - | * | Start | - | * | Read | (reg_data[0]) | * | Read | (....) | * | Read | (reg_data[len - 1]) | * | Stop | - | * |------------+---------------------| */ return rslt; } int8_t user_i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len) { int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */ /* * The parameter dev_id can be used as a variable to store the I2C address of the device */ /* * Data on the bus should be like * |------------+---------------------| * | I2C action | Data | * |------------+---------------------| * | Start | - | * | Write | (reg_addr) | * | Write | (reg_data[0]) | * | Write | (....) | * | Write | (reg_data[len - 1]) | * | Stop | - | * |------------+---------------------| */ return rslt; }
综上,基于官方库,针对不同平台,获取BME280数据的基本流程为:
- 第一步:不同平台的系统及外设初始化。
- 第二步:实现不同平台的I2C读,I2C写,SPI读,SPI写,延时函数,并将函数指针赋值给bme280_dev结构体成员变量,将该结构体指针传递给初始*化函数int8_t bme280_init(struct bme280_dev *dev),初始化BME280设备。
- 第三步:调用int8_t stream_sensor_data_forced_mode(struct bme280_dev *dev)或
int8_t stream_sensor_data_normal_mode(struct bme280_dev *dev)函数获取BME280传感器数据并打印到上位机或控制台。
FAQ