Raspberry Pi 温度传感器
几周前,我购买了 Raspberry Pi。在阅读了 Eben Upton 的 Raspberry Pi 用户指南,特别是他关注 GPIO 的两章之后,我对我的第一个项目有了一个想法。这篇文章涵盖了我使用 Raspberry Pi、MCP9808、旧 Mac Mini(2008 年初)、InfluxDB、Grafana、一点 Python 和 runit 组合在一起的家庭温度监测项目的第一次迭代。
传感器硬件
在这个项目中,我选择使用 Adafruit 的 MCP9808 分线板——组件、电路和创意的绝佳来源。我选择这个单位有几个原因:
- 它通过 I²C 进行控制——Raspberry Pi 的 GPIO 支持通过引脚 3(串行数据线,SDA)和引脚 5(串行时钟线,SCL)所需的 I²C 总线
- 它在 2.7V 至 5.5V 的电源和逻辑范围内运行 - Raspberry Pi 提供 3.3V 和 5V 的电源线
- 它非常便宜(<5 美元)——我的焊接技术不是最好的。
电路装配
MCP9808 Breakout Board 从 Adafruit 发货,大部分是组装好的。这个特殊的套件只需要您将随附的 8 针接头带焊接到分线板上。
我使用 GPIO Breakout 和面包板将 Raspberry Pi 连接到 MCP9808;与将传感器焊接到 Raspberry Pi 相比,这种方法更易于管理、更正接线错误,并且不太持久。要从 MCP9808 读取温度,只需要电源引脚、接地以及 I²C SDA 和 SCL 引脚:
本项目中不使用剩余的可选引脚。当在同一总线上使用多个设备时,它们为 I²C 解决问题提供了解决方法,并提供了一个引脚,用于在传感器读取的温度高于或低于阈值时发出警报。
数据存储区
我知道我想使用持久数据存储支持该项目。这将使我能够捕获数据点,然后分析它们的总体趋势、交叉参考加热/冷却模式与天气事件等。
我选择 InfluxDB 是因为它以时间为中心的查询语言和存储模型。我将 Influx 安装在我坐在办公桌下的旧 Mac Mini(2009 年初,OSX 10.10)上。启动并运行 InfluxDB 的基本安装是有据可查的;由于我已经使用 Homebrew 来管理我的大部分 3rd 方依赖项并且存在 InfluxDB 的公式,因此通过发出 brew install influxdb
完成安装 .
配置 InfluxDB 数据库
安装 InfluxDB 后,我设置了一个数据库来存储我的温度读数和一个数据库用户来管理它。我使用我的 InfluxDB 实例的 Web 控制台来执行此操作;默认情况下,它在端口 8083
上运行 InfluxDB 主机。
树莓派配置
现在硬件和数据存储已经设置好,开箱即用的 Raspberry Pi 需要一些操作系统配置才能通过 I²C 总线与 MCP9808 通信。
启用 I²C
默认情况下,Raspberry Pi 不会加载使用 I²C 总线所需的内核模块。为了通过 GPIO 启用 I²C 通信,我在 /etc/modules
中添加了以下两行
i2c-bcm2708i2c-dev
然后重启树莓派
sudo reboot
系统初始化后,系统应该能够识别出 MCP9808 已连接。我使用了 i2cdetect
cli 工具这样做:
sudo i2cdetect 1 # 通道 1 是树莓派 B+ 模型的默认值
传感器软件
Adafruit 提供了 MCP9808 包装器和 I²C 抽象。我在这个项目的主要驱动程序脚本中使用了这两个。
安装构建依赖
sudo apt-get updatesudo apt-get install build-essential python-dev python-smbus
安装 Adafruit_Python_MCP9808 包装器
cd ~/Downloadsgit clone https://github.com/adafruit/Adafruit_Python_MCP9808/blob/master/Adafruit_MCP9808cd Adafruit_MCP9808sudo python setup.py install代码>
这也将安装 I²C 抽象,因为 MCP9808 包装器依赖于它。
阅读、报告、重复
接下来我写了一个小python脚本,poll.py
, 每隔一段时间从 MCP9808 读取数据并将其发现报告给 mcp9808_test InfluxDB 数据库实例。
#!/usr/bin/python import time import Adafruit_MCP9808.MCP9808 as MCP9808 from influxdb import InfluxDBClient # 生成必要的负载以将 # 温度数据发布到 InfluxDB def temperature_data(degrees_c):return [ { 'points':[[c_to_f(degrees_c)]], 'name':'Temperature Readings', 'columns':['degrees_f']}] # 将摄氏温度表示转换为Farenheight def c_to_f(c):return c * 9.0 / 5.0 + 32.0 # 通过 I2C 总线初始化与 MCP9808 的通信。 sensor =MCP9808.MCP9808() sensor.begin() # 定义捕获逻辑发生的时间间隔 capture_interval =60.0 # 每 60 秒 # 建立与 mcp9808_test 的连接 # InfluxDB 实例 influxClient =InfluxDBClient('
现在可以使用以下命令运行它;请注意,脚本需要以 root
身份运行 Raspberry Pi 的用户,以便与 GPIO 交互。
sudo python /poll.py
永远的
天啊!一切都在运行……直到我踢了桌子底下 powerstip 的开/关开关。此时我意识到我想确保 poll.py
只要 Raspberry Pi 有电,脚本就会运行。为此,我使用了 runit 进程主管。
欲知更多详情:树莓派温度传感器
制造工艺