温度センサーDHT22をラズパイで動かす


温度センサーDHT22をラズパイで動かす

またまたn番煎じ的な感じですが、べつにIoTをやりたいわけではなくて、
センサーデータをオブジェクトストレージにためる為の準備的な感じ。
あとエアコンの無い7月のテレワーク部屋がどのくらい暑いのかって事を知ってほしい。

使ったもの
ラズパイ:Pi3b+ (Linux raspberrypi 4.19.118-v7+ )
センサー:HDT22 
電源:5V/3.0A
プログラム:https://github.com/adafruit/Adafruit_Python_DHT

センサー取り付け

センサーにケーブルが3本入っていたのでそれを使用

ケーブル DHT22 Piのピン番号
GND 6番
黄色 VCC 2番
緑色 DAT 7番(GPIO=4)

注意点として、緑はピン番号は7番だけどGPIOのIDは4番です! ラズパイの仕様なのでしょうがない。
ケーブルは、どの色がどこでも問題ないですが昔の覚え方だと、五月みどり、岸恵子、青二才のろくでなし、なので青は6番へ。
写真はRICOH GR3で無駄に接写


ちなみにPi3は結構電源食うみたいなので、1.2A程度の電源では起動時に雷マークが出て途中で落ちまくり、3Aの電源を追加購入してあります。

OSでの作業

ラズパイ側の設定はGitにあるAdafruit_Python_DHTのReadmeの通りでとりあえず動く。

Git cloneで拝借
Readmeにとりあえず動かすまでの手順は書いてあるのでその通りやる。

pi@raspberrypi:~ $ git clone https://github.com/adafruit/Adafruit_Python_DHT

Python3の場合

pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install python3-pip
pi@raspberrypi:~ $ sudo python3 -m pip install --upgrade pip setuptools wheel
pi@raspberrypi:~ $ sudo pip3 install Adafruit_DHT
#インストール先は/usr/local/lib/python3.7/dist-packagesに入ります。

Gitしたディレクトリに移動してsetup.pyインストール

pi@raspberrypi:~ $ cd Adafruit_Python_DHT
pi@raspberrypi:~/Adafruit_Python_DHT $ sudo python3 setup.py install

早速exampleディレクトリにあるAdafruitDHT.pyを実行してみる。
22はDHT22を意味していて、4は前述の通りGPIOナンバーで、ピンヘッダーの番号ではないので要注意。

pi@raspberrypi:~/Adafruit_Python_DHT $ cd examples
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ python3 AdafruitDHT.py 22 4
Temp=27.7*  Humidity=76.8%

出たけど、なんかさみしい。
ずっと出しておきたいので、exampleディレクトリ以下のsimpletest.pyをtemp.pyという名前でコピーして編集

pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo cp simpletest.py temp.py
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo vi temp.py

余計なコメント行を外すと下記な感じになります。
日付と時間を入れる。:後で何かに使うかもしれないから。
Pin番号を変更する。:GPIOの番号なので今回は4。 他にBeaglebone用の設定項目(PIN=P8_11)もあるけど無視。
While True:を入れる。:定番の繰り返し構文
Ctrl-Cでスマートに止める。:try/exceptを使用

#!/usr/bin/python
import Adafruit_DHT
import datetime
sensor = Adafruit_DHT.DHT22
# connected to GPIO4.
pin = 4
try:
     while True:
        date2 = datetime.datetime.now()
        print(date2)
        humidity, temperature = Adafruit_DHT.read_retry(sensor,pin)

        if humidity is not None and temperature is not None:
            print('Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(temperature, humidity))
        else:
            print('Failed to get reading. Try again!')
except KeyboardInterrupt:
            print('!!FINISH!!')

実行すると、想定通りループ処理してCtrl-Cで止めるまで動き続けます。

pi@raspberrypi:~/Adafruit_Python_DHT/examples $ python3 temp.py
2020-07-31 15:03:40.647612
Temp=31.6*C  Humidity=64.9%
2020-07-31 15:03:41.173793
Temp=31.6*C  Humidity=64.9%
2020-07-31 15:03:41.699962
Temp=31.6*C  Humidity=64.9%
2020-07-31 15:03:42.226087
Temp=31.6*C  Humidity=64.9%
2020-07-31 15:03:42.752259
Temp=31.6*C  Humidity=64.8%
2020-07-31 15:03:43.278558
^C!!FINISH!!

Ctrl-CでFINISH!!
31度! 暑いよ。 

teeコマンドでモニタしながらログをためる。

後で何かに使うかもしれないので、モニターしながらファイルに落とす。
teeコマンドで余裕で取れると思ったら意外とハマった。
どうやら-uをつけないとなぜかteeで渡せない。
-u : force the stdout and stderr streams to be unbuffered;
this option has no effect on stdin; also PYTHONUNBUFFERED=x

なるほど、よくわからん。

pi@raspberrypi:~/Adafruit_Python_DHT/examples $ python3 -u temp.py | tee -a temp.log

何はともあれ、エアコンの無い私のテレワーク部屋が暑いという事が証明されました。
次は、これをオブジェクトストレージにひたすら飛ばす方法を考えよう。

追記

amazon S3と同期