IoT temperature sensors

了解如何读取 Maxim 1-Wire 温度传感器

我最喜欢的传感器之一是Maxim DS18_20系列,这是一款价格低廉的温度传感器,通过称为1-Wire的”单接触串行接口”进行通信。多年来,我一直将它们集成到各种项目中,它们始终可靠、准确且极其易于使用。这部分是由于他们使用单个联系人进行通信 – 当您希望保存嵌入式计算机或微控制器上的引脚时,这些联系很有价值,但也因为 w1_therm Linux 内核中内置了驱动程序,这意味着它们将在任何 Linux 计算机上工作与适当的物理接口。

举例来说,我们将使用一个与DS18B20连接到GPIO引脚的树莓派。你可以找到一个接线图在这个博客文章。我们将加载 w1_therm 内核模块以及 w1_gpio 模块,该模块使用 GPIO API 提供 1-Wire 接口:

modprobe w1_gpio
modprobe w1_therm

启用内核模块后,传感器现在可通过 sysfs 接口作为单个目录进行访问。我们可以 ls 将该命令与一些通配符一起查找有关传感器的信息:

$ ls -laH /sys/class/hwmon/hwmon*
total 0
drwxr-xr-x 3 root root    0 Apr 24 23:59 .
drwxr-xr-x 3 root root    0 Apr 24 23:59 ..
lrwxrwxrwx 1 root root    0 Apr 24 23:59 device -> ../../../28-000002e36be9
-r--r--r-- 1 root root 4096 Apr 24 23:59 name
drwxr-xr-x 2 root root    0 Apr 24 23:59 power
lrwxrwxrwx 1 root root    0 Apr 24 23:59 subsystem -> ../../../../../class/hwmon
-r--r--r-- 1 root root 4096 Apr 24 23:59 temp1_input
-rw-r--r-- 1 root root 4096 Apr 24 23:59 uevent

在此目录中,您将找到各种文件,包括指向设备本身的符号链接、传感器名称和名为 temp1_input 的文件,您可以读取该文件以获取传感器的温度(以摄氏度 =1000 为单位):

$ cat /sys/class/hwmon/hwmon0/temp1_input 27562

此外,您可以通过读取 ,访问有关传感器 /sys/class/hwmon/hwmon0/device/w1_slave file 的详细信息,如下所示:

$ cat /sys/class/hwmon/hwmon0/device/w1_slave
bb 01 4b 46 7f ff 05 10 c6 : crc=c6 YES
bb 01 4b 46 7f ff 05 10 c6 t=27678

这显示了器件在左侧的十六进制输出,右侧显示 CRC 错误检查和温度读数的结果。

特莱格拉夫的临时插件

Telegraf 的 temp 输入插件在每个收集过程中从文件系统读取有关温度传感器的数据。您可以使用官方的 InfluxData 存储库在树莓派上安装 Telegraf 和 InfluxDB。安装后,我们可以通过在 以下部分取消注释来配置 /etc/telegraf/telegraf.conf Telegraf:

# # Read metrics about temperature [[inputs.temp]] # # no configuration

由于除了启用插件之外没有配置,我们可以重新启动 Telegraf,我们应该看到数据开始出现在 temp 数据库的测量 telegraf 中(因为我们使用的是配置默认值)。

使用多个传感器

不幸的是,目前临时插件的实现有一个缺点:它仅支持单个传感器

com/shirou/gopsutil”rel=”不跟随”\gopsutil。

使用 gopsutil 读取温度时,库使用文件系统(包括文件)中的数据生成 SensorKey。 label这是内核文档必须说明的这些文件:

temp[1-*]_labelSuggested temperature channel label.
Text string
Should only be created if the driver has hints about what
this temperature channel is being used for, and user-space
doesn't. In all other cases, the label is provided by
user-space.
RO

由于 DS18B20 和其他类似传感器的应用可能有所不同,因此驱动程序是通用的,并且没有任何有关温度通道用于什么的信息,因此不会创建此文件。这意味着当Telegraf从多个传感器收集数据时,它们的标签值是相同的,因为它们都 SensorKey 具有相同的。因此,即使我们从每个传感器收集数据,数据点也具有相同的元数据和时间戳,因此将相互覆盖。我们可以通过使用参数运行 Telegraf 来验证这一 --test 点,该参数将行协议打印到命令行。

使用 Python 的多个传感器解决方法

解决这个问题的一个方法是使用Python脚本来读取数据(你可以在这里找到一个示例要点),以及Telegraf的 exec 插件来执行脚本。

下载脚本并将其复制到更永久的位置;现在,让我们将文件放到 /usr/local/bin 中。由于我们使用官方的 InfluxData 存储库安装了 Telegraf,因此 Telegraf 以 telegraf 用户身份运行,这意味着我们还需要更改脚本的权限,以便 Telegraf 可以执行,如下所示:

sudo chown telegraf:telegraf /usr/local/bin/read_multiple_ds18b20.py
$ sudo chmod 755 /usr/local/bin/read_multiple_ds18b20.py

然后,我们可以配置Telegraf的 exec 插件,通过启用插件并将文件添加到参数来执行 commands 脚本:

# # Read metrics from one or more commands that can output to stdout
[[inputs.exec]]
#   ## Commands array
  commands = [
    "/usr/local/bin/read_multiple_ds18b20.py"
  ]

完整的配置文件位于此处,其中包含描述默认值的注释。由于多个 DS18B20 可以共享一条数据线,因此连接附加设备相当简单:它将共享第一个传感器使用的接地、电源和数据的连接。重新启动远程存储,它应该开始从每个设备收集数据。

未来的改进

我有几个应用程序,每个设备使用多个温度传感器,因此如果可能的话,最好在内置 temp 插件上迭代,而不是依赖我们的 Python 脚本解决方法。

一种可能性是对 gopsutil 库进行少量更改,这将为 SensorKey 设备名称的构建体添加一个附加字段(每个 DS18_20 都是唯一的)。然后,Telegraf 可以使用该字段向数据添加附加标记,并防止点相互覆盖。我将整理一个拉取请求,并从 gopsutil 维护人员那里获得一些反馈。同时,请随时使用我的 Python 脚本,并在下面的评论中联系!

Comments are closed.