Сбор данных о температуре от raspberry pi (DHT22) через API-интерфейс со второй попытки - PullRequest
3 голосов
/ 20 июня 2020

У меня есть 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.tempera / dht_device.humidity . Если я опущу это, я могу без проблем вызвать конечную точку.

Для ясности: я установил libgpiod на Raspberry Pi. РЕДАКТИРОВАТЬ : Я установил libgpiod2, как было предложено в одном из ответов.

Кто-нибудь знает, в чем может быть проблема? Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Это было решено в другом месте для Pi3 путем установки libgpiod2:

https://github.com/adafruit/Adafruit_Blinka/issues/259

0 голосов
/ 23 июня 2020

Вы написали:

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

Проблема в том, что вы каждый раз создаете новый экземпляр при вызове конечной точки. Первый экземпляр создан правильно и имеет доступ к информации, но второй и последующие экземпляры блокируются первым экземпляром.

...