在我开始之前,我在写这篇文章之前浏览了“类似问题”部分,并没有看到一个与我的情况相匹配的问题。如果找到,请告诉我,如果实际上相似,我会将其标记为“已回答”。我是一名专业的 .net 全栈开发人员,我最近才开始涉足 Python 和电气工程作为一种爱好。
我正在创建一个自动鱼菜共生控制系统,该项目的一部分读取生长床介质的温度,并通过各种其他传感器的输入,重新计算泵循环淹没床的频率。我正在使用带有 Python3.9 和 W1ThermSensor v2.0.0a2 库的 DS18B20。这是传感器的几个函数的初始化和第一个。在初始测试期间,我将 w1thermsensor 作为类的属性而不是继承,因为以这种方式操作代码对我来说更容易。
#!/usr/bin/env python3
from w1thermsensor import W1ThermSensor, Sensor, Unit
from datetime import datetime
import os
import numpy
import traceback
class DS18B20:
def __init__(self, min_temp=18, max_temp=26):
self.sensor = W1ThermSensor()
self.temp_string = "{dt} : Sensor: {id} :: {temp_c}C - {temp_f}F"
self.temp_c = 0.00
self.temp_f = 0.00
self.is_active = False
self.is_alert = False
self.min_temp = min_temp
self.max_temp = max_temp
self.values = [0.00, 0.00, 0.00, 0.00, 0.00]
self.value = 0.00
def start(self):
if self.sensor is None:
return False
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
# Set baseline for values Average
self.is_active = True
self.monitor()
self.values = [self.temp_c, self.temp_c, self.temp_c, self.temp_c, self.temp_c]
self.value = numpy.average(self.values)
我遇到的这个问题是它将有 3 个问题之一:
- 引发 w1thermsensor.errors.NoSensorFoundError
- 引发 w1thermsensor.errors.SensorNotReadyError
- 调用 get_temperature() 后在 temp_c 属性中不返回任何值
我对此进行了更多研究,如果我使用'sudo python3'命令在终端中加载IDLE,我可以输入以下命令并且它没有问题:
sudo python3
>>> from w1thermsensor import W1ThermSensor, Sensor
>>> import time
>>> temp_sensor = W1ThermSensor(Sensor.DS18B20)
>>> while True:
... print(str(round(temp_sensor.get_temperature()))
... time.sleep(2)
它可以正常工作。我也尝试了“猫”命令
cd /sys/bus/w1/devices
cd 28-3c01d607414b
cat w1_slave
94 01 55 05 7f a5 81 66 5b : crc=5b YES
94 01 55 05 7f a5 81 66 5b t=25250
堆栈跟踪显示它在“ init ()”中调用 W1Termsensor() 函数时抛出错误。我的问题是,是我的代码或实现导致了问题,还是其他原因。我的睡眠时间设置为 2 秒,希望我只是在更新过程中赶上它。任何帮助都会有很大帮助。
附加信息:
- DS18B20 连接到单独的 5v 电源,电容器用于稳定电压,因为电源的同一 5v 电源轨上有一个 5v 继电器和一个 LED 阵列。
5v+ -------------+---------VCC------
| |
4.7 Kohm |
| |
GPIO4 ---------------------DQ = 1uf polCap
|
|
|
GND ----------------------GND-------
- 我已经仔细检查了我是否启用了 1-wire。