教材「スマート温湿度計を作ろう」DHT22センサーの動作確認でエラーが出る

質問

「スマート温湿度計を作ろう」でDHT22センサーの「動作を確認する」のところでdht22.pyを実行してもエラーが表示され、実行できません。

回答

アップデートによりOSバージョンが上がったことが関係していると思われます。対処法ですが、代替となるライブラリを使うことで解消できるかと思います。

手順としては以下の通りです。

(1)下記コマンドでライブラリをインストール

pip3 install adafruit-circuitpython-dht

(2)添付のサンプルプログラムをdht22.pyとしてRaspberry Pi上に作成

(3)プログラムを実行し、動作確認を行ってください。
サンプルプログラムは、テキスト「スマート温湿度計を作ろう」のものと宣言している関数名が同じですので、動作が確認できましたら次章以降も利用できるかと思います。

サンプルプログラム (dht22.py)

import time
import adafruit_dht
from board import *
class DHT22:
    def __init__(self, pin=D4, max_retry=5):
        self.dht22 = adafruit_dht.DHT22(pin, use_pulseio=False)
        self.temperature = None
        self.humidity = None
        
        retry = 0
        while not self.is_available():
            print('Trying to get proper data...')
            retry += 1
            if retry >= max_retry:
                raise RuntimeError('Couldn\'t get sensor data while retrying.')
            
            time.sleep(1)
        
    def is_available(self):
        self.temperature = self.get_temperature()
        self.humidity = self.get_humidity()
        if self.temperature and self.humidity:
            return True
        
        return False
        
    def get_temperature(self):
        try:
            self.temperature = self.dht22.temperature
        except RuntimeError:
            # Check sum failed or insufficient data.
            pass
        return self.temperature
    
    def get_humidity(self):
        try:
            self.humidity = self.dht22.humidity
        except RuntimeError:
            # Check sum failed or insufficient data.
            pass
        return self.humidity
    
if __name__ == '__main__':
    sense = DHT22()
    
    for i in range(3):
        temp = sense.get_temperature()
        hum = sense.get_humidity()
        
        print(f'====={time.ctime()}=====')
        print(f'Temperature: {temp}')
        print(f'Humidity: {hum}')
        
        time.sleep(1)