#温度センサー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と同期