まずは秋葉原でセンサ類を買ってみる。
どうもカトーです。先日某所で環境をクラウドに上げるサービスを見て、結構製品によって制限があるので、あれ?普通に専用設計じゃなくても小型のシングルボードのGPIOでやればいいじゃない?と思ったのですが、もしかして精度やらスクリプトやらが面倒なのかなとぼんやり考えてました。
我々はサーバやネットワークメインのインフラ屋なので畑違いの事はどうでもいいかな?と思ったのですが、どうもスッキリしないので、手元にある機器で検証してみる事にしましたよ。
さすがにセンサ類は手元に無いので、会社から近い秋葉原でそれぞれ購入してみました。
購入したセンサ
ひとまずサーミスタやCO2ガスセンサ、温湿度センサなど。サクッとGPIOを使うので、ブレッドボードとオスメスコネクタも購入。無駄なACアダプタやサーボまで購入してしまい合計6000円の出費。
温湿度センサを確認
早速購入した温湿度センサモジュール AM2301Bを確認。MEMS静電容量式湿度センサー、温度センサーです。出力はI2C、空調システム、検査装置、自動制御、データロガー等の温度・湿度を検出・制御する必要のある分野に応用可能です。長期安定性に優れ、高速応答性と抗干渉性能(anti-interference)を備えています……との事。MEMSってのは良くわからないが、ひとまずデータシートを確認
Raspberry Pi で I2C通信を有効にする
今回はひとまずラズパイで動作確認。Raspberry Pi ImagerでRaspbianを用意してセットアップ。センサーは出力形式:I2C(7bitアドレス:0x38)となっているので、Raspberry Pi で I2C通信を有効します。
sudo raspi-config でInterface Options からI2Cを選んで enabledにします。もしくはGUIならインターフェイスからI2Cを有効に。
I2Cで接続されているか確認
一応通電確認で3V LEDをかましてAM2301Bも接続してみます。
i2c-toolsを入れて、確認。
sudo apt-get install i2c-tools
sudo apt-get install python-smbus
sudo apt-get install python3-smbus参考 感謝:
ラズベリーパイのI2Cを有効にする
https://www.y2c.co.jp/i2c-r/raspberrypi/i2c-enable/
I2C Toolsの簡単な使い方について
https://moba1.hatenablog.com/entry/2019/10/09/114145
取得スクリプトを書いてみる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
import smbus import time # i2cバス番号 i2c = smbus.SMBus(0) # アドレス addr = 0x38 # デバイス状態確認 status = i2c.read_byte_data(addr, 0x71) if status != 0x18: # 初期化 i2c.write_i2c_block_data(addr, 0xBE, [0x08, 0x00]) time.sleep(0.1) status = i2c.read_byte_data(addr, 0x71) if status != 0x18: print("Device initialization failed.") exit() # 計測指示 i2c.write_i2c_block_data(addr, 0xAC, [0x33, 0x00]) # 計測までは80ms以上おく必要がある. time.sleep(0.2) # 計測状態確認 status = i2c.read_byte_data(addr, 0x71) # statusのBit[7]が0なら計測完了 if format(status, '08b')[0] != "0": print("計測未完") exit() # 測定結果を読み取り block = i2c.read_i2c_block_data(addr,0,8) # 読み取り結果から温度湿度を計算 hum = int(block[1] << 12 | block[2] << 4 | block[3] >> 4) * 100 hum = int(hum >> 20) temp = int((block[3] & 0b00001111) << 16 | block[4] << 8 | block[5]) * 200 temp = float(temp >> 18) / 4 temp -= 50 print("温度:", temp,"℃"," 湿度:", hum,"RH") |
https://unyacat.net/2021/09/20/am2301b/
精度はどうなのか?
書いておいてなんですが、精度はどうなのだろうか、27℃って……。
そもそも湿度がRHってはこの書いている時に知りました。
本当に取得しているのか不安ので冷やしてみます。
確かに下がってはいる……。
まとめ
精度はともかく、ひとまず普通に取得できるのは分かったので、サーバにデータとして記録しつつ、次はCO2センサを試す予定です。環境センサ類は機器のおいてある環境に耐えられるか?が重要かと思いますので、引き続き検証が必要だろうなと思います。
せっかくなら会社の冷蔵庫とか7セグで温度表示してみたいものです。
ではでは