玩转树莓派-加装BME280传感器

编程/技术 更新时间: 2019-11-24 @ 21:31:51 创建时间: 2019-11-24 @ 21:13:00 浏览数: 43 净访问: 35 By: skyrover

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议


其实我以前并不知道GPIO口的I2C,只是我在淘宝上看到微雪的这个BM280环境传感器)我比较感兴趣,可以测量温度,湿度和气压,正好是我需要的,买回来一查怎么用,才知道I2C这个东西,简单介绍一下:

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向:

如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;

如果主机要接收从器件的数据,则主机器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下,主机主要是负责产生定时时钟和终止数据传送。

说了一堆看不太懂,还是来说说怎么用吧

接线

这个BM280传感器支持I2C和SPI,两种模式接线不同,这里只是说I2C,官方说明如下:

BM280传感器一共六个引脚,I2C中有两个是不用接的,一个是Address,一个是CS,Address不接默认是高电平,高电平时,地址为:0x77

剩下的一一对应如下(以我为例)

  • VCC -> 01 3.3v DC Power
  • GND -> 09 Ground
  • SDA -> 03 GPIO02(SDA1, 12C)
  • SCL -> 05 GPIO03(SCL1, 12C)

环境配置

首先打开树莓派的I2C内核驱动:

sudo raspi-config

选择Interfacing Options -> I2C -> yes 启动I2C内核驱动,保存退出之后,重启机器。

重启后,运行lsmod查看I2C模块是否启用,如果启用,该命令输出有这么一条:i2c_bcm2835 7167 0

然后安装i2c-tools进行确认:sudo apt-get install i2c-tools

安装完后,运行:sudo i2cdetect -y 1,结果如下

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- 77

这样的是正常的,后面的77表示地址,如果Address接到地则会是76

驱动采集代码

官网给的是C语言程序,这里介绍Python代码

这个是项目pypi官网:RPi.bme280 0.2.3

安装的话比较容易:pip install RPi.bme280

采集代码如下:

def get_env_data_from_BME280():
    port = 1
    address = 0x76
    bus = smbus2.SMBus(port)
    calibration_params = bme280.load_calibration_params(bus, address)
    # the sample method will take a single reading and return a
    # compensated_reading object
    data = bme280.sample(bus, address, calibration_params)

    # the compensated_reading class has the following attributes
    return {
        'temperature': data.temperature,
        'pressure': data.pressure,
        'humidity': data.humidity,
    }

最终成果

>>> import smbus2
>>> import bme280
>>> port = 1
>>> address = 0x77
>>> bus = smbus2.SMBus(port)
>>> calibration_params = bme280.load_calibration_params(bus, address)
>>> # the sample method will take a single reading and return a
... # compensated_reading object
... data = bme280.sample(bus, address, calibration_params)
>>> data.temperature
17.088761625025654
>>> data.humidity
43.20535214783228
>>> data.pressure
983.7175175123396


点赞走一波😏


评论

提交评论