目的
Raspberry Pi で温度、湿度のデータを取得したい。
データが取得できたら、そのデータを Zabbix に送信して監視しようと思っています。
目次
- 温度センサーの購入
- Raspberry Pi にセンサー DHT22 の装着
- センサー情報の取得
- センサーのデータがとれない(エラー対応)
- 違うセンサーデータ取得用ライブラリを使用してみる
- 次なにやるか
温度センサーの購入
Amazon で DHT22 ってやつを買いました。
どちらかというと、センサーを先に買ってしまって、それが DHT22 だった、という流れです。。。
以下、調べながら記録していきます。
Raspberry Pi にセンサー DHT22 の装着
DHT22上の表示 | Pin番号 |
---|---|
GND | 9番(6番はすでにファンで使っていた) |
VCC | 2番 |
DAT | 7番(GPIO=4) |
センサー情報の取得
センサー情報取得用ライブラリの設定
先人の知恵に感謝。
以下のライブラリを使用させていただく。
https://github.com/freedom27/MyPyDHT
作業用のフォルダを作成して以下のコマンドを順に実行。
sudo git clone --recursive https://github.com/freedom27/MyPyDHT cd MyPyDHT sudo python3 setup.py install
ログ
amegon@raspberrypi:~/work/library/sensor $ sudo git clone --recursive https://github.com/freedom27/MyPyDHT Cloning into 'MyPyDHT'... remote: Enumerating objects: 27, done. remote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27 Receiving objects: 100% (27/27), 5.44 KiB | 1.81 MiB/s, done. Resolving deltas: 100% (8/8), done. Submodule 'source/MyDHT_RPi_Driver' (https://github.com/freedom27/MyDHT_RPi_Driver) registered for path 'source/MyDHT_RPi_Driver' Cloning into '/home/amegon/work/library/sensor/MyPyDHT/source/MyDHT_RPi_Driver'... remote: Enumerating objects: 48, done. remote: Total 48 (delta 0), reused 0 (delta 0), pack-reused 48 Receiving objects: 100% (48/48), 9.03 KiB | 4.51 MiB/s, done. Resolving deltas: 100% (19/19), done. Submodule path 'source/MyDHT_RPi_Driver': checked out '650da4b507a43ae87cebc2d03cb2a03161012a55' Submodule 'MyGPIO' (https://github.com/freedom27/MyGPIO) registered for path 'source/MyDHT_RPi_Driver/MyGPIO' Cloning into '/home/amegon/work/library/sensor/MyPyDHT/source/MyDHT_RPi_Driver/MyGPIO'... remote: Enumerating objects: 33, done. remote: Total 33 (delta 0), reused 0 (delta 0), pack-reused 33 Receiving objects: 100% (33/33), 6.28 KiB | 3.14 MiB/s, done. Resolving deltas: 100% (13/13), done. Submodule path 'source/MyDHT_RPi_Driver/MyGPIO': checked out '3d6e6fdd7063298c22b4f16b7ffb04f1a6d032ab' amegon@raspberrypi:~/work/library/sensor $ amegon@raspberrypi:~/work/library/sensor $ amegon@raspberrypi:~/work/library/sensor $ amegon@raspberrypi:~/work/library/sensor $ cd MyPyDHT amegon@raspberrypi:~/work/library/sensor/MyPyDHT $ amegon@raspberrypi:~/work/library/sensor/MyPyDHT $ sudo python3 setup.py install running install running build running build_py creating build creating build/lib.linux-aarch64-3.9 creating build/lib.linux-aarch64-3.9/MyPyDHT copying MyPyDHT/__init__.py -> build/lib.linux-aarch64-3.9/MyPyDHT running build_ext building 'MyPyDHT.dht_driver' extension creating build/temp.linux-aarch64-3.9 creating build/temp.linux-aarch64-3.9/source creating build/temp.linux-aarch64-3.9/source/MyDHT_RPi_Driver creating build/temp.linux-aarch64-3.9/source/MyDHT_RPi_Driver/MyGPIO arm-linux-gnueabihf-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -ffile-prefix-map=/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -ffile-prefix-map=/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.9 -c source/MyDHT_RPi_Driver/MyGPIO/my_gpio.c -o build/temp.linux-aarch64-3.9/source/MyDHT_RPi_Driver/MyGPIO/my_gpio.o -std=gnu99 source/MyDHT_RPi_Driver/MyGPIO/my_gpio.c: In function ‘gpio_deinit’: source/MyDHT_RPi_Driver/MyGPIO/my_gpio.c:78:12: warning: passing argument 1 of ‘munmap’ discards ‘volatile’ qualifier from pointer target type [-Wdiscarded-qualifiers] 78 | munmap(gpio_mapped_addr, GPIO_LENGTH); | ^~~~~~~~~~~~~~~~ In file included from source/MyDHT_RPi_Driver/MyGPIO/my_gpio.c:5: /usr/include/arm-linux-gnueabihf/sys/mman.h:76:26: note: expected ‘void *’ but argument is of type ‘volatile uint32_t *’ {aka ‘volatile unsigned int *’} 76 | extern int munmap (void *__addr, size_t __len) __THROW; | ~~~~~~^~~~~~ arm-linux-gnueabihf-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -ffile-prefix-map=/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -ffile-prefix-map=/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.9 -c source/MyDHT_RPi_Driver/MyGPIO/my_time_utils.c -o build/temp.linux-aarch64-3.9/source/MyDHT_RPi_Driver/MyGPIO/my_time_utils.o -std=gnu99 arm-linux-gnueabihf-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -ffile-prefix-map=/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -ffile-prefix-map=/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.9 -c source/MyDHT_RPi_Driver/MyGPIO/my_utils.c -o build/temp.linux-aarch64-3.9/source/MyDHT_RPi_Driver/MyGPIO/my_utils.o -std=gnu99 arm-linux-gnueabihf-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -ffile-prefix-map=/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -ffile-prefix-map=/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.9 -c source/MyDHT_RPi_Driver/dht_driver.c -o build/temp.linux-aarch64-3.9/source/MyDHT_RPi_Driver/dht_driver.o -std=gnu99 source/MyDHT_RPi_Driver/dht_driver.c: In function ‘wait_for_value’: source/MyDHT_RPi_Driver/dht_driver.c:12:31: warning: comparison of integer expressions of different signedness: ‘uint32_t’ {aka ‘unsigned int’} and ‘int’ [-Wsign-compare] 12 | while(gpio_read(gpio_pin) != value) { | ^~ arm-linux-gnueabihf-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -ffile-prefix-map=/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -ffile-prefix-map=/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.9 -c source/py_driver_wrapper.c -o build/temp.linux-aarch64-3.9/source/py_driver_wrapper.o -std=gnu99 arm-linux-gnueabihf-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 -Wl,-z,relro -g -fwrapv -O2 -g -ffile-prefix-map=/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-aarch64-3.9/source/MyDHT_RPi_Driver/MyGPIO/my_gpio.o build/temp.linux-aarch64-3.9/source/MyDHT_RPi_Driver/MyGPIO/my_time_utils.o build/temp.linux-aarch64-3.9/source/MyDHT_RPi_Driver/MyGPIO/my_utils.o build/temp.linux-aarch64-3.9/source/MyDHT_RPi_Driver/dht_driver.o build/temp.linux-aarch64-3.9/source/py_driver_wrapper.o -o build/lib.linux-aarch64-3.9/MyPyDHT/dht_driver.cpython-39-arm-linux-gnueabihf.so running install_lib creating /usr/local/lib/python3.9/dist-packages/MyPyDHT copying build/lib.linux-aarch64-3.9/MyPyDHT/__init__.py -> /usr/local/lib/python3.9/dist-packages/MyPyDHT copying build/lib.linux-aarch64-3.9/MyPyDHT/dht_driver.cpython-39-arm-linux-gnueabihf.so -> /usr/local/lib/python3.9/dist-packages/MyPyDHT byte-compiling /usr/local/lib/python3.9/dist-packages/MyPyDHT/__init__.py to __init__.cpython-39.pyc running install_egg_info Writing /usr/local/lib/python3.9/dist-packages/MyPyDHT-0.1.egg-info amegon@raspberrypi:~/work/library/sensor/MyPyDHT $
python のスクリプトで情報取得
適当な場所に以下のコードが書かれたスクリプトを作成する。
ここでは test.py として作成。
#!/usr/bin/env python3 # センサーアクセス用のライブラリを import import MyPyDHT # 測定値の取得(4は接続したGPIO のポート番号:GPIO4 なら 4) humidity, temperature = MyPyDHT.sensor_read(MyPyDHT.Sensor.DHT22, 4) # 結果の表示 print("Temp = " + str(temperature) + " \nHumidity = " + str(humidity))
実行結果
amegon@raspberrypi:~/work/scripts/sensor $ python3 test.py Traceback (most recent call last): File "/home/amegon/work/scripts/sensor/test.py", line 6, in <module> humidity, temperature = MyPyDHT.sensor_read(MyPyDHT.Sensor.DHT22, 4) File "/usr/local/lib/python3.9/dist-packages/MyPyDHT/__init__.py", line 52, in sensor_read raise DHTException(error_mess) MyPyDHT.DHTException: An error occurred during the handshake with the sensor! amegon@raspberrypi:~/work/scripts/sensor $
エラーになった。
はて。
センサーのデータがとれない(エラー対応)
調べてみたがコードもシンプルだし、ライブラリの中を見てみても特に使い方に問題はなさそう。
handshake でエラーとなっているメッセージなので、そもそも最初のアクセスができていないと思い、以下の見直しを実施。
- 配線間違ってない?
- コードに記入している GPIO の番号間違ってない?
どちらも間違っていない様子。
他のサイトを参考にしてピンの差し替えを実施。
DHT22上の表示 | Pin番号 |
---|---|
GND | 39番(6番はすでにファンで使っていた) |
VCC | 17番 (3.3v) |
DAT | 37番(GPIO=26) |
だが、結果は変わらず、handshake でエラー発生。
違うセンサーデータ取得用ライブラリを使用してみる
ピンの設定をもとに戻す。
DHT22上の表示 | Pin番号 |
---|---|
GND | 9番(6番はすでにファンで使っていた) |
VCC | 2番 |
DAT | 7番(GPIO=4) |
違うライブラリをインストール。
こちらも先人の知恵に感謝です。
https://github.com/adafruit/Adafruit_Python_DHT
sudo git clone https://github.com/adafruit/Adafruit_Python_DHT.git cd Adafruit_Python_DHT sudo python setup.py install
サンプルコード
先人のリポジトリ内にある example を参考に作成。
import Adafruit_DHT as DHT SENSOR_TYPE = DHT.DHT22 DHT_GPIO = 4 h,t = DHT.read_retry(SENSOR_TYPE, DHT_GPIO) print('Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(t, h))
実行結果
amegon@raspberrypi:~/work/scripts/sensor $ python3 getTempHum.py Temp=30.9*C Humidity=52.9% amegon@raspberrypi:~/work/scripts/sensor $
値が取れた。
結局のところ、最初に利用させてもらおうと思ったライブラリが Raspberry Pi4B をサポートしていないのか、ということだったみたい。
Readme をみても Raspberry Pi 4 の情報はないのでそうかもと思うことにします。
値は手元にある 100均の温湿度計と比較してみた。
センサーは2つあって、片方は温度、湿度ともにだいたい同じ。
もう片方は温度はだいたい同じ、湿度は -7% くらい。
センサーでむらがあるのかな?
温度、湿度近いセンサーを使用してしばらく様子みてみたいと思います。
次なにやるか
これでセンサーで値が取れるようにあったので、次は Zabbix にデータを送信して監視できるようにトライしてみたいと思います。