一个Python包和CLI工具,用于在Raspberry Pi、Beagle Bone和其他设备上与DS1822、DS18S20和DS18B20等w1温度传感器协同工作。
项目描述
W1ThermSensor
通过单行代码获取您的w1热传感器温度!
它专为与Rasperry Pi硬件一起使用而设计,但也适用于Beagle Bone和其他设备。
Raspberry Pi:此软件包在Raspbian中作为python-w1thermsensor
和python3-w1thermsensor
提供。
Python 2弃用:所有从2.0版本开始的w1thermsensor发布都需要Python 3.5+
支持的设备
以下w1热传感器设备得到支持
- DS18S20
- DS1822
- DS18B20
- DS28EA00
- DS1825/MAX31850K
设置
需要以下硬件
- w1热兼容传感器(其中一些可以在以下地方购买: Adafruit: DS18B20)
- 连接传感器到您的板子的电线(您可能还需要一个面包板)
- 类似于Raspberry Pi或Beagle Bone的板子
在Raspberry Pi上,您需要在/boot/config.txt文件中添加dtoverlay=w1-gpio
(用于常规连接)或dtoverlay=w1-gpio,pullup="y"
(用于寄生连接)。默认数据引脚是GPIO4(RaspPi连接器引脚7),但可以通过dtoverlay=w1-gpio,gpiopin=x
从4更改为x
。
之后,别忘了重启。
硬件连接
Raspi VCC (3V3) Pin 1 ----------------------------- VCC DS18B20
|
|
R1 = 4k7 ...10k
|
|
Raspi GPIO 4 Pin 7 ----------------------------- Data DS18B20
(BCM) (BOARD)
Raspi GND Pin 6 ----------------------------- GND DS18B20
软件上拉
除了在/boot/config.txt中通过物理电阻实现的硬件上拉,或者上述提到的软件配置dtoverlay=w1-gpio,pullup="y"
之外,还可以使用以下软件上拉。
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
当使用此软件上拉时,1-Wire设备仅在程序将GPIO引脚上拉时才对内核可见。
硬件设备连接验证
运行以下命令
ls -l /sys/bus/w1/devices
您应该检查以"28-"开头的文件名的可用性。
以"00-"开头的文件名可能意味着缺少上拉电阻。
1-Wire设备可以动态插入,并在它们的硬件连接后立即对内核驱动程序可见。
要测试读取温度,请发出以下命令
for i in /sys/bus/w1/devices/28-*; do cat $i/w1_slave; done
安装
从PIP
此可能性支持所有发行版
pip install w1thermsensor
注意:可能需要root权限
使用async
额外功能添加对asyncio和AsyncW1ThermSensor
的支持
pip install w1thermsensor[async]
在Raspbian中使用apt-get
如果您在运行Raspbian的Raspberry Pi上使用w1thermsensor
模块,您可以从官方仓库安装它
sudo apt-get install python3-w1thermsensor
注意:对于此软件包的旧版本,您可能会遇到以下错误:ImportError: No module named 'pkg_resources'
,这表明您需要分别安装python-setuptools
或python3-setuptools
。
手动构建和安装deb包
debuild -us -uc
dpkg -i ../python3-w1thermsensor_*.deb
作为Python包的使用
使用非常简单,接口简洁。所有示例都使用DS18B20
传感器 - 它对其他支持设备以相同的方式工作。
单个传感器的基本使用(隐式)
from w1thermsensor import W1ThermSensor, Unit
sensor = W1ThermSensor()
temperature_in_celsius = sensor.get_temperature()
temperature_in_fahrenheit = sensor.get_temperature(Unit.DEGREES_F)
temperature_in_all_units = sensor.get_temperatures([
Unit.DEGREES_C,
Unit.DEGREES_F,
Unit.KELVIN])
所需内核模块将在W1ThermSensor
类的构造函数中自动加载。
如果出现问题,将引发异常。
将采用找到的第一个传感器
单个传感器的基本使用(显式)
将采用ID为00000588806a
的DS18B20传感器。
from w1thermsensor import W1ThermSensor, Sensor
sensor = W1ThermSensor(sensor_type=Sensor.DS18B20, sensor_id="00000588806a")
temperature_in_celsius = sensor.get_temperature()
多个传感器
使用get_available_sensors
类方法,您可以获取所有可用传感器的ID。
from w1thermsensor import W1ThermSensor
for sensor in W1ThermSensor.get_available_sensors():
print("Sensor %s has temperature %.2f" % (sensor.id, sensor.get_temperature()))
特定热传感器类型的传感器
from w1thermsensor import W1ThermSensor, Sensor
for sensor in W1ThermSensor.get_available_sensors([Sensor.DS18B20]):
print("Sensor %s has temperature %.2f" % (sensor.id, sensor.get_temperature()))
设置传感器分辨率
一些w1热传感器支持更改温度读取的分辨率。w1thermsensor
通过W1ThermSensor.set_resolution()
方法启用此操作
sensor = W1ThermSensor(sensor_type=Sensor.DS18B20, sensor_id="00000588806a")
sensor.set_resolution(9)
如果将persist
参数设置为False
,则此值“仅”存储在易失性SRAM中,因此当传感器断电时会被重置。
如果将persist
参数设置为True
,则当前设置的分辨率将存储到EEPROM中。由于EEPROM的写入次数有限(>50k),应谨慎使用此命令。
sensor = W1ThermSensor(sensor_type=Sensor.DS18B20, sensor_id="00000588806a")
sensor.set_resolution(9, persist=True)
注意:此功能从Linux内核4.7版本开始支持
注意:此功能需要root
权限
禁用内核模块自动加载
在导入w1thermsensor
包时,w1-therm
和w1-gpio
内核模块将自动加载。这要求python进程以root身份运行。有时您可能不希望这样做,因此您可以禁用自动加载,并在使用w1thermsensor
与传感器通信之前自己加载内核模块。
您可以通过将W1THERMSENSOR_NO_KERNEL_MODULE
环境变量设置为1
来禁用自动加载功能
# set it globally for your shell so that sub-processes will inherit it.
export W1THERMSENSOR_NO_KERNEL_MODULE=1
# set it just for your Python process
W1THERMSENSOR_NO_KERNEL_MODULE=1 python my_awesome_thermsensor_script.py
分配给W1THERMSENSOR_NO_KERNEL_MODULE
的任何其他值都将导致w1thermsensor
加载内核模块。
注意:上述示例也适用于CLI工具的使用。见下文。
校正温度/传感器校准
校准温度传感器的原理是获取已知的测量高值和测量低值,这些值可以用作纠正传感器的读数。最简单的方法是测量水的熔点和沸点,因为这些值是已知的。这种方法仅适用于防水传感器 - 如果您不使用防水传感器,则需要不同的机制来获取测量值。
为了获取 measured_low_point
,将容器装满80%的冰,并向冰中加水,直到冰漂浮且水在表面。将您的传感器浸入冰水中,确保它不接触容器。等待5分钟,使容器中的温度稳定,然后当传感器的读数稳定约30秒(读数保持一致)时,将该值记录为 measured_low_point
为了获取 measured_high_point
,将一壶水煮沸。将您的传感器放入沸水中,确保它不接触壶。允许传感器升温并稳定,一旦它稳定约30秒(读数保持一致),将该值记录为 measured_high_point
一般来说,reference_low_point
应该保持在0.0,除非您有特殊情况改变水的熔点。因为熔化不涉及气相变化,所以气压和海拔对熔点的影响很小。
另一方面,reference_high_point
受大气压(因此海拔)影响很大。例如,海平面的水沸点为100.0°C,而在珠穆朗玛峰顶峰(海拔8848米)的水沸点约为72°C。虽然气压实际上决定了沸点,但一般来说,海拔对于大多数用例来说是一个足够接近的近似值。《工程工具箱》(Engineering Toolbox)有一个页面提供了不同海拔的水沸点。
此方法来自 本指导。
from w1thermsensor.calibration_data import CalibrationData
from w1thermsensor import W1ThermSensor, Unit
calibration_data = CalibrationData(
measured_high_point=measured_high_point,
measured_low_point=measured_low_point,
reference_high_point=reference_high_point,
reference_low_point=reference_low_point, # optional, defaults to 0.0
)
sensor = W1ThermSensor(calibration_data=calibration_data)
corrected_temperature_in_celsius = sensor.get_corrected_temperature()
corrected_temperature_in_fahrenheit = sensor.get_corrected_temperature(Unit.DEGREES_F)
corrected_temperature_in_all_units = sensor.get_corrected_temperatures([
Unit.DEGREES_C,
Unit.DEGREES_F,
Unit.KELVIN])
异步接口
为了支持asyncio,w1thermsensor
包实现了一个异步接口 AsyncW1ThermSensor
。
支持以下方法
get_temperature()
get_temperatures()
get_resolution()
例如
from w1thermsensor import AsyncW1ThermSensor, Unit
sensor = AsyncW1ThermSensor()
temperature_in_celsius = await sensor.get_temperature()
temperature_in_fahrenheit = await sensor.get_temperature(Unit.DEGREES_F)
temperature_in_all_units = await sensor.get_temperatures([
Unit.DEGREES_C,
Unit.DEGREES_F,
Unit.KELVIN])
作为CLI工具使用
从版本 0.3.0
开始,w1thermsensor 模块可以用作CLI工具。
请注意,CLI工具将与 Raspbian Python 3 软件包一起安装(sudo apt-get install python3-w1thermsensor
)
列出传感器
列出所有可用的传感器
$ w1thermsensor ls
$ w1thermsensor ls --json # show results in JSON format
仅列出特定类型的传感器
$ w1thermsensor ls --type DS1822
$ w1thermsensor ls --type DS1822 --type MAX31850K # specify multiple sensor types
$ w1thermsensor ls --type DS1822 --json # show results in JSON format
显示温度
显示所有可用传感器的温度:(与 ls
具有相同的摘要)
$ w1thermsensor all --type DS1822
$ w1thermsensor all --type DS1822 --type MAX31850K # specify multiple sensor types
$ w1thermsensor all --type DS1822 --json # show results in JSON format
显示单个传感器的温度
$ w1thermsensor get 1 # 1 is the id obtained by the ls command
$ w1thermsensor get --hwid 00000588806a --type DS18B20
$ w1thermsensor get 1 # show results in JSON format
显示给定分辨率的单个传感器的温度
$ w1thermsensor get 1 --resolution 10
$ w1thermsensor get --hwid 00000588806a --type DS18B20 --resolution 11
更改温度读数分辨率并将其写入EEPROM
# w1thermsensor resolution 10 1
# w1thermsensor resolution --hwid 00000588806a --type DS18B20 11
注意:此功能需要root
权限
贡献
我非常欢迎对这个项目的一切类型贡献! :beers
本项目发布在 MIT 许可下。
由 Timo Furrer 项目。
- :tada: -
项目详情
w1thermsensor-2.3.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9fbc0ae0dd66cd9b54c6d62ed7bab2b88e148c987fe7d5060f476f90e81c2270 |
|
MD5 | c54462b028565445fdad0f943d759068 |
|
BLAKE2b-256 | dd60e2dbb207a2b6ed7813aeb976bfb69ef084b3586d5378597e5e5eb225582a |
w1thermsensor-2.3.0-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 16f3236d401be809fe46aa4166c4441cc962b398a561aa60659e1fbe553aac94 |
|
MD5 | 0107e9794e705484d28e5485a112f7ee |
|
BLAKE2b-256 | b3d9bbb28eaa1e87eeb5292996b1ec1e9295b73e146551731a5021e1103d312c |