amegonの雑なブログ

日常的なものから技術的なものまでメモの雑記

Raspberry Pi に温度センサーの装着

目的

Raspberry Pi で温度、湿度のデータを取得したい。
データが取得できたら、そのデータを Zabbix に送信して監視しようと思っています。

温度センサーの購入

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 にデータを送信して監視できるようにトライしてみたいと思います。