第二次尝试从 raspberry pi (DHT22) 到 api 收集温度失败
Gathering temperature from raspberry pi (DHT22) through api failes on second attempt
我有一个 DHT22 连接到我的 raspberry pi 4 模型 B,连接方式如下:
我为 raspberry pi 写了一个小脚本,用来获取温度和湿度。我通过本地网络的 ip 地址使这个脚本可用。为此,我使用了两个库来尝试找出错误:Flask 和 Jaymon/Endpoints.
当 运行 本地脚本时,一切正常。当我使用 Postman 调用端点时,我得到了温度和湿度,正如预期的那样。但是,当我第二次调用同一个端点时,我收到以下错误:
RuntimeError: Timed out waiting for PulseIn message. Make sure libgpiod is installed.
发生这种情况时,我需要重新启动网络服务器并重新开始:我可以调用 api 一次并获得正确的结果,但第二次尝试失败。
这是我试过的脚本之一:
from endpoints import Controller
import adafruit_dht import board
class Default(Controller): def GET(self):
dht_device = adafruit_dht.DHT22(board.D4)
data = {
"temperature": dht_device.temperature,
"humidity": dht_device.humidity
}
return data
调用 dht_device.temperature/dht_device.humidity 时会出现此问题。当我忽略它时,我可以毫无问题地调用端点。
明确一点:我确实在 Raspberry Pi 上安装了 libgpiod。
编辑:我安装了libgpiod2
,作为建议的答案之一。
有人知道这里的问题是什么吗?提前致谢!
这已通过安装 libgpiod2 为 Pi3 在其他地方解决:
您写道:
class Default(Controller):
def GET(self):
dht_device = adafruit_dht.DHT22(board.D4)
data = {
"temperature": dht_device.temperature,
"humidity": dht_device.humidity
}
return data
你需要这样的东西:
class Default(Controller):
def __init__(self):
super().__init__(self)
self.dht_device = adafruit_dht.DHT22(board.D4)
def GET(self):
data = {
"temperature": self.dht_device.temperature,
"humidity": self.dht_device.humidity
}
return data
您遇到的问题是每次调用端点时都会创建一个新实例。第一个实例已正确创建并可以访问信息,但第二个和连续的实例被第一个实例阻止。
我在 RaspberryPi 的 Raspbian stretch OS 中遇到了这个错误。
已解决 使用以下步骤
您可以尝试使用以下命令安装 libgpiod2 包
sudo apt-get install libgpiod2
如果您收到错误“E: 无法定位包 libgpiod2”
那么,
使用 deb 包安装包
包裹url:https://packages.debian.org/buster/libgpiod2
wget http://ftp.cn.debian.org/debian/pool/main/libg/libgpiod/libgpiod2_1.2-3_armhf.deb
sudo dpkg -i libgpiod2_1.2-3_armhf.deb
如果您收到与 libgpiod1 包冲突的错误,请卸载 libgpiod1 包
sudo apt-get remove libgpiod1
然后尝试安装包
sudo dpkg -i libgpiod2_1.2-3_armhf.deb
我有一个 DHT22 连接到我的 raspberry pi 4 模型 B,连接方式如下:
我为 raspberry pi 写了一个小脚本,用来获取温度和湿度。我通过本地网络的 ip 地址使这个脚本可用。为此,我使用了两个库来尝试找出错误:Flask 和 Jaymon/Endpoints.
当 运行 本地脚本时,一切正常。当我使用 Postman 调用端点时,我得到了温度和湿度,正如预期的那样。但是,当我第二次调用同一个端点时,我收到以下错误:
RuntimeError: Timed out waiting for PulseIn message. Make sure libgpiod is installed.
发生这种情况时,我需要重新启动网络服务器并重新开始:我可以调用 api 一次并获得正确的结果,但第二次尝试失败。
这是我试过的脚本之一:
from endpoints import Controller
import adafruit_dht import board
class Default(Controller): def GET(self):
dht_device = adafruit_dht.DHT22(board.D4)
data = {
"temperature": dht_device.temperature,
"humidity": dht_device.humidity
}
return data
调用 dht_device.temperature/dht_device.humidity 时会出现此问题。当我忽略它时,我可以毫无问题地调用端点。
明确一点:我确实在 Raspberry Pi 上安装了 libgpiod。
编辑:我安装了libgpiod2
,作为建议的答案之一。
有人知道这里的问题是什么吗?提前致谢!
这已通过安装 libgpiod2 为 Pi3 在其他地方解决:
您写道:
class Default(Controller):
def GET(self):
dht_device = adafruit_dht.DHT22(board.D4)
data = {
"temperature": dht_device.temperature,
"humidity": dht_device.humidity
}
return data
你需要这样的东西:
class Default(Controller):
def __init__(self):
super().__init__(self)
self.dht_device = adafruit_dht.DHT22(board.D4)
def GET(self):
data = {
"temperature": self.dht_device.temperature,
"humidity": self.dht_device.humidity
}
return data
您遇到的问题是每次调用端点时都会创建一个新实例。第一个实例已正确创建并可以访问信息,但第二个和连续的实例被第一个实例阻止。
我在 RaspberryPi 的 Raspbian stretch OS 中遇到了这个错误。 已解决 使用以下步骤
您可以尝试使用以下命令安装 libgpiod2 包
sudo apt-get install libgpiod2
如果您收到错误“E: 无法定位包 libgpiod2”
那么, 使用 deb 包安装包
包裹url:https://packages.debian.org/buster/libgpiod2
wget http://ftp.cn.debian.org/debian/pool/main/libg/libgpiod/libgpiod2_1.2-3_armhf.deb
sudo dpkg -i libgpiod2_1.2-3_armhf.deb
如果您收到与 libgpiod1 包冲突的错误,请卸载 libgpiod1 包
sudo apt-get remove libgpiod1
然后尝试安装包
sudo dpkg -i libgpiod2_1.2-3_armhf.deb