DHT22 работает как пользователь, но не как Sudo на Pi Zero W - PullRequest
1 голос
/ 07 августа 2020

Это первый раз, когда я сталкиваюсь с проблемой, которую не могу погуглить, часто находя ответы на этом прекрасном форуме. Надеюсь, кто-нибудь сможет мне помочь, прежде чем я выдерну остальные волосы.

У меня есть сценарий python, использующий модуль adafruit-circuit python -dht на Pi Zero W. Этот сценарий делает именно то, что он должен запускаться от имени пользователя, но при запуске от имени Sudo я получаю сообщение об ошибке от libgpoid. Сценарий и сообщения об ошибках ниже. Здесь, как и в моей настройке, есть множество дополнительных функций, потому что полный сценарий делает гораздо больше, чем просто чтение с DHT22, я добавил его для устранения неполадок. Заранее благодарим вас за любую помощь, которую может предоставить любой, если я смогу решить эту проблему, я могу наконец поместить этот проект в приложение!

Мой сценарий:

#!/usr/bin/env python3
from gpiozero import OutputDevice, Button
import time
import subprocess
from board import SCL, SDA
import busio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
import board
import adafruit_dht
import neopixel
import paho.mqtt.client as mqtt

#Set DHT22 Pin
DHT_SENSOR = adafruit_dht.DHT22(board.D4)
current_temp = 0

temp_tick = 30 # how often we publish temp data in seconds
    
# DHT22 Sensor Functions
def publish_temp_humid():
    global current_temp
    temp = None
    humid = None
    try:
        humid = DHT_SENSOR.humidity
        temp = DHT_SENSOR.temperature
    except:
        pass
    if humid is not None and temp is not None:
        temp = temp * 9 / 5 + 32
        current_temp = temp
        current_temp = int(current_temp)
        current_temp = str(current_temp)
        print("Temp={}*F  Humidity={}%".format(current_temp, humid))
    else:
        print("Failed to retrieve data from DHT22 sensor")
        temp = "NR"
        humid = "NR"

while True:
    publish_temp_humid()
    time.sleep(temp_tick)

Успешный запуск:

pi@living-tstat:~/tstat $ python3 dht.py
Temp=79*F  Humidity=55.0%

Неудачный запуск:

pi@living-tstat:~/tstat $ sudo python3 dht.py
Traceback (most recent call last):
  File "dht.py", line 15, in <module>
    DHT_SENSOR = adafruit_dht.DHT22(board.D4)
  File "/usr/local/lib/python3.7/dist-packages/adafruit_dht.py", line 273, in __init__
    super().__init__(False, pin, 1000)
  File "/usr/local/lib/python3.7/dist-packages/adafruit_dht.py", line 69, in __init__
    self.pulse_in = PulseIn(self._pin, 81, True)
  File "/usr/local/lib/python3.7/dist-packages/adafruit_blinka/microcontroller/bcm283x/pulseio/PulseIn.py", line 71, in __init__
    message = self._wait_receive_msg()
  File "/usr/local/lib/python3.7/dist-packages/adafruit_blinka/microcontroller/bcm283x/pulseio/PulseIn.py", line 89, in _wait_receive_msg
    "Timed out waiting for PulseIn message. Make sure libgpiod is installed."
RuntimeError: Timed out waiting for PulseIn message. Make sure libgpiod is installed.

Полный процесс установки этого Pi с пустой SD:

== Loading Operating System ==

* Download latest version of rasbian lite https://downloads.raspberrypi.org/raspbian_lite_latest
* Burn to SD card with Etcher https://www.balena.io/etcher/
* Unplug SD card and plug it back in to mount
* Enable SSH by putting blank file with no extension named SSH in root directory
* Setup WiFi by putting wpa_supplicant.conf in the root directory
** set ssid and psk (password) in file
* Put the SD card in the pi, boot it up, and it should be detectable on the network
* Give it a reserved IP and reboot
* SSH in through putty, username pi, default password raspberry
* Change password: $sudo passwd pi
* Update and upgrade
** $sudo apt-get update
** $sudo apt-get upgrade -y
** $sudo apt-get dist-upgrade -y
* install git
**$sudo apt-get install -y git
*Make python3 default
**$sudo update-alternatives --list python
**$sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
***use python --version to get correct 2.x
**$sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.7 2
***use $sudo python3 --version to get correct 3.x and verify it worked
*Install pip
**$sudo apt install python3-pip
* Change hostname (raspberrypi) to a unique identifier in the following files
**$sudo nano /etc/hostname
***legal characters 0-9 a-z and -
**$sudo nano /etc/hosts
** $sudo reboot

== Installing Mosquitto MQTT ==

*get repo key
**$wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
*add repo
**$sudo apt-key add mosquitto-repo.gpg.key
*download appropriate lists file 
**$cd /etc/apt/sources.list.d/
**$sudo wget http://repo.mosquitto.org/debian/mosquitto-buster.list
*update caches and install 
**$apt-cache search mosquitto
**$sudo apt-get update
**$sudo apt-get install -f libmosquitto-dev mosquitto mosquitto-clients libmosquitto1

=== Install Bluetooth Proximity ===
* Install bluetooth drivers
** $sudo apt-get install pi-bluetooth
** $sudo reboot
*Install dependencies
**$sudo apt-get install -y bluetooth
**$sudo apt-get install -y python3-bluez
**$sudo apt-get install -y python3-setuptools
*Install Bluetooth Proximity
**$git clone https://github.com/frederikbolding/bluetooth-proximity.git
**$cd bluetooth-proximity
**$sudo python3 setup.py install
*Install paho-mqtt
**$sudo apt-get install -y python3-paho-mqtt

=== Install Thermostat ===

*Install GPIO Zero Library
**$sudo apt install -y python3-gpiozero

*Install Blinka needed for all adafruit-circuitpython libraries
**$sudo python3 -m pip install --force-reinstall adafruit-blinka

*Install neopixel library
**$sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel

*Install DHT Library
**$sudo pip3 install adafruit-circuitpython-dht
**$sudo apt-get install -y libgpiod2

*Install I2C OLED Library, RPI.GPIO, and PIL for text display
**$sudo pip3 install adafruit-circuitpython-ssd1306
**$sudo pip3 install RPI.GPIO
**$sudo apt-get install -y python3-pil
*Enable I2C
**$sudo apt-get install -y python3-smbus
**$sudo apt-get install -y i2c-tools
**$sudo raspi-config
***5 Interfacing Options
***5 I2C
***Yes
***Ok
***Finish
**$sudo reboot
...