匿名
未登录
登录
丢石头百科
搜索
查看“BME280 Environmental Sensor”的源代码
来自丢石头百科
名字空间
页面
讨论
更多
更多
页面选项
查看
查看源代码
历史
←
BME280 Environmental Sensor
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
<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 |features=BME280环境传感器 |interfaces= {{Category|SPI接口}} {{Category|I2C接口}} |related=[[DHT22 Temperature-Humidity Sensor]] }} <div class="tabbertab" title="说明"> ==产品概述== 这是一款环境传感器,可感知环境温度、湿度和大气压强,支持I2C和SPI接口,兼容3.3V/5V电平,小尺寸,低功耗,高精度和稳定性,适用于环境监测、天气预测、海拔高度监测和物联网应用场景。 ==特点== *支持I2C接口通信,可设置从机地址 *支持SPI接口通信,默认为SPI接口,可通过I/O口设置I2C接口 *板载电平转换电路,可兼容3.3V/5V的工作电平 *提供完善的配套资料手册(Raspberry/Arduino/STM32示例程序和用户手册等) ==产品参数== {| border=1; style="width:500px; background:#eeffee; " |-align="center" |工作电压:||5V/3.3V |-align="center" |通信接口:||I2C/SPI |-align="center" |温度范围:||-40~85°C (分辨率0.01°C,误差±1°C) |-align="center" |湿度范围:||0~100%RH (分辨率0.008%RH,±3% RH) |-align="center" |压力范围:||300~1100 hPa (分辨率0.18Pa,误差±1 hPa) |-align="center" |产品尺寸:||27mmx20mm |-align="center" |过孔直径:||2.0mm |}<br /> ==接口定义== {|border=2; style="background:#eeffff;width:600px;" |-style="background:#ffffee" ; align="center" |colspan=5|I2C接口 |-style="background:#ccffcc" ; align="center" |功能引脚||Arduino 接口|| STM32接口||RASPBERRY||描述 |-align="center" |VCC||3.3V/5V||3.3V /5V||3.3V /5V||电源正 |-align="center" |GND||GND||GND||GND||电源地 |-align="center" |SDA||A4||PB7||SDA||I2C数据线 |-align="center" |SCL||A5||PB6||SCL||I2C时钟线 |-align="center" |ADDR||NC/GND||NC/GND||NC/GND||地址片选(默认为高电平):<br />为高电平时,地址为:0x77<br />为低电平时,地址为:0x76 |-align="center" |CS||NC||NC||NC||NC |} -------------------------- {|border=2; style="background:#eeffff;width:600px;" |-style="background:#ffdddd" ; align="center" |colspan=5|SPI接口 |-style="background:#eeffcc" ; align="center" |功能引脚||Arduino 接口||STM32接口||RASPBERRY||描述 |-align="center" |VCC||3.3V /5V||3.3V /5V||3.3V /5V||3.3V电源正 |-align="center" |GND||GND||GND||GND||电源地 |-align="center" |MOSI||D11||PA7||MOSI||SPI数据输入 |-align="center" |SCK||D13||PA5||SCK||SPI时钟输入 |-align="center" |MISO||D12||PA6||MISO||SPI数据输出 |-align="center" |CS||D10||PB6||27||SPI片选,低电平有效 |} ==用于树莓派== ===安装必要的函数库=== *需要安装必要的函数库,否则以下的示例程序可能无法正常工作。安装方法详见:[[Pioneer600_Datasheets]]<br /> *在官网上找到对应产品,在产品资料打开下载路径,在wiki中下载示例程序:<br /> [[File:BMP388-Barometric-Pressure-Sensor-user-manual-1.png|800px]]<br /> *得到解压包,解压得到如下:<br /> [[File:BMP388-Barometric-Pressure-Sensor-user-manual-2.png|800px]]<br /> *将Raspberry文件夹拷至树莓派。<br /> ==安装库== {{RPI_C_lib}} ===前置工作及演示=== ====前置工作==== *执行如下命令进行树莓派配置:<br /> sudo raspi-config *选择Interfacing Options -> I2C -> yes 启动I2C内核驱动<br /> *选择Interfacing Options -> SPI -> yes启动SPI内核驱动<br /> *保存退出后,重启树莓派:<br /> sudo reboot *重启后,运行命令查看,I2C,SPI模块是否已启动: lsmod *将会有如下的打印信息: [[File:BME280-Environmental-Sensor-user-manual-3.png|800px]]<br /> *如果显示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 *将会有如下打印信息: [[File:BME280-Environmental-Sensor-user-manual-4.png|800px]]<br /> *若显示77则表示BME280模块成功连接至树莓派成功。 *若将ADDR连接至GND则打印出76: [[File:BME280-Environmental-Sensor-user-manual-5.png|800px]]<br /> <font color=red>注意:以上测试确保I2C总线上没有其它地址和该器件地址重合的设备。如果以上测试成功则I2C模块加载成功,同时BME280模块成功连接至树莓派。 同时,BME280模块支持SPI驱动,可参考SPI接口说明部分将BME280连接至树莓派。</font> ====演示==== *成功将BME280模块连接至树莓派后: *如果采用I2C驱动:则先确定I2C器件地址,<u>BME280模块默认I2C器件地址为0X77</u>,若将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驱动。 [[File:BME280-Environmental-Sensor-user-manual-6.png|800px]]<br /> *同时检查main.c中的I2C器件地址,确保和当前BME280模块器件地址一致(默认I2C器件地址为0x77,若将ADDR接地则其器件地址为0x76): [[File:BME280-Environmental-Sensor-user-manual-7.png|800px]]<br /> *如果采用SPI驱动:则将BME280模块按照接口说明中的SPI总线接线方式进行接线,并将main.c文件中的USEIIC宏定义改为0。 [[File:BME280-Environmental-Sensor-user-manual-8.png|800px]]<br /> *保存并退出编辑,然后重新编译:<br /> sudo make clean sudo make *运行: sudo ./bme280 *将显示如下数据: [[File:BME280-Environmental-Sensor-user-manual-9.png|800px]]<br /> *从左至右分别显示了BME280测得的温度(摄氏度),大气压(百帕斯卡),相对湿(%RH)。若未成功显示数据,或数据显示不正常请检查连线,通信方式,以及器件地址是否有误。 ==用于Arduino== *将下载的示例程序的压缩包解压后,将Arduino文件夹下的BME280-Arduino-Library拷贝至Arduino第三方库目录下.之后重启ArduinoIDE,进入并打开文件->实例->BME280_Libreay->bme280test *按照接口说明中Arduino接口部分接线。 *默认采用SPI驱动BME280模块。 *如需采用IIC驱动BME280模块,请将bme280test.ino中的宏定义USEIIC改为1。(默认I2C器件地址为0X77) [[File:BME280-Environmental-Sensor-user-manual-10.png|800px]]<br /> *如需更改I2C器件的地址为0X76,则将ADDR引脚接至GND(或用0欧姆电阻将焊桥连接),同时将Adafruit.h中的BME280_ADDRESS器件地址改为0X76: [[File:BME280-Environmental-Sensor-user-manual-11.png|800px]]<br /> *如需获取准测量的准确海拔,还需测得当地海平面的大气压,并修改SEALEVELPRESSURE_HPA宏定义: [[File:BME280-Environmental-Sensor-user-manual-12.png|800px]]<br /> *在正确接线,确定通信方式以及器件地址之后,编译,下载到Arduino。 *打开:工具 -> 串口监视器,选择波特率为115200,可得如下信息 [[File:BME280-Environmental-Sensor-user-manual-13.png|800px]]<br /> *其中从左至右分别显示了BME280传感器测得的温度(摄氏度),大气压(百帕斯卡),相对湿度(%RH),海拔(m)。 *若未成功显示数据,或数据显示不正常请检查连线,通信方式,以及器件地址是否有误。 ==用于STM32== *将下载的示例程序的压缩包解压后,打开STM32文件夹下的STM32-STM32_BME280->USR路径下的工程文件:按照接口说明中STM32接口部分接线。默认采用I2C驱动BME280模块,默认I2C器件地址为0X77。 *如需采用SPI驱动BME280模块,请将main.c中的宏定义USEIIC改为0: [[File:BME280-Environmental-Sensor-user-manual-14.png|800px]]<br /> *如需更改I2C器件的地址为0X76,则将ADDR引脚接至GND(或用0欧姆电阻将焊桥连接),并将dev.dev_id = BME280_I2C_ADDR_SEC;注释: [[File:BME280-Environmental-Sensor-user-manual-15.png|800px]]<br /> *编译,下载,本次采用的芯片是STM32F103RBT6,采用USART2输出获得的传感器数据。 *打开串口调试助手,选择对应的COM口,设置波特率为115200,数据位8位,停止位1位,无奇偶校验位,可得如下数据: [[File:BME280-Environmental-Sensor-user-manual-16.png|800px]]<br /> *其中从左至右分别显示了BME280传感器测得的温度(摄氏度),大气压(百帕斯卡),相对湿度(%RH)。 *若未成功显示数据,或数据显示不正常请检查连线,通信方式,以及器件地址是否有误。 ===代码分析=== *例程主要采用了官方(Bosch Sensortec)提供的库:https://github.com/BoschSensortec/BME280_driver 针对不同平台实现其底层函数,供上层调用。 *采用SPI驱动BME280的初始化部分为: <pre> 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); </pre> *采用I2C驱动BME280初始化部分: <pre> 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); </pre> *其中bme280_dev为官方库中给定的BME280设备结构体,用于初始化以及获取数据用,需要针对不同的平台实现以下函数: <pre> user_i2c_read() user_i2c_write() user_spi_read() user_spi_write() user_delay_ms() </pre> *并将该函数的函数指针传递给结构体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写的实现思路为: <pre> 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; } </pre> 综上,基于官方库,针对不同平台,获取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传感器数据并打印到上位机或控制台。 </div> <div class="tabbertab" title="资料"> ===文档=== *[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] *[[:File:串口调试助手.zip|串口调试助手]] ===相关资料=== *[https://{{SERVERNAME}}/w/upload/9/91/BME280_datasheet.pdf BME280数据手册] </div> == FAQ == <div class="tabbertab" title="FAQ"> <br /> {{BME280-Environmental-Sensor-FAQ}} </div> <div class="tabbertab" title="售后"> <br /> {{Service18}} </div> </div>
该页面使用的模板:
模板:BME280-Environmental-Sensor-FAQ
(
查看源代码
)
模板:Category
(
查看源代码
)
模板:Product
(
查看源代码
)
模板:RPI C lib
(
查看源代码
)
模板:Service00
(
查看源代码
)
模板:Service18
(
查看源代码
)
模板:Tag
(
查看源代码
)
模板:Tipbox
(
查看源代码
)
返回至
BME280 Environmental Sensor
。
导航
导航
首页
最近更改
随机页面
MediaWiki帮助
首页
首页
树莓派
主机
配件包
外壳
键鼠
电源
扩展板
显示屏
墨水屏
摄像模块
通信模块
继电器
电机驱动板
游戏机
产品分类
树莓派
Arduino
micro:bit
STM32
Espressif
WiFi模块
蓝牙模块
无线模块
LoRa模块
4G模块
GSM
GPRS
以太网
导航模块
北斗卫星
GPS
LCD
墨水屏
OLED
摄像头
USB模块
串口模块
RS232
RS485
CAN
传感器
温度模块
湿度模块
气压模块
继电器
电机模块
指纹模块
电平转换
音频模块
编程器
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志