AM2301Bを利用して温湿度を計測する

AM2301Bを利用して温湿度を計測する

AM2301Bというセンサを買ってきたのでNanoPi NEO2で動かしてみました.

秋月電子:

温湿度センサ モジュール AM2301B: センサ一般 秋月電子通商-電子部品・ネット通販

データシート: https://akizukidenshi.com/download/ds/aosong/AM2301B.pdf

生産している会社の商品紹介ページ:

AM2301B Temperature and humidity sensor-RH&T Sensors-Guangzhou Aosong Electronic Co., Ltd.

精度は温度: ±0.3℃, 湿度: ±2%RH(25℃) です.

⚙ NanoPiの設定

NanoPiとAM2301BはI2Cで通信します.

あらかじめNanoPi側でI2Cを有効化しておきます.NanoPiでArmbianを動かしているなら,

1
$ sudo armbian-config

System > Hardware > i2c0 にスペースキーで✅をいれます.EnterでSaveします.

🔌 NanoPiとAM2301Bを繋ぐ

右上内側のOUT - 3.3V,SDA,SCL,GNDを利用します.

i2c-toolsで正しく接続できているかを確認します.

1
2
$ sudo apt-get install i2c-tools
$ sudo i2cdetect -y 0

1
2
3
4
5
6
7
8
9
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- 38 -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

と返ってこれば成功です.

⚡️ Pythonで通信する

smbusというライブラリでI2C通信を行います.

1
$ sudo apt-get install python3-smbus

適当にデータシートを読みながらコードを書いていきます.今回はCRC checkには目を瞑ることとします.誤差との兼ね合いはお好みで(もうちょっと細かくてもいい気がする).

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
48
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("T:", temp, " H:", hum)

それっぽい値が取得できました.よかった〜

初期化の方法はデータシートに載っていませんでしたが別のPDFには掲載されていました.

InfluxDB + Grafana

InfluxDBに投げつけてGrafanaで可視化したらいい感じになります.

センサの場所を固定してないためか急に変動する時間が発生してますね・・・.

様子見して設置場所とか精度をどこまで求めるかなどを調整した方が良さそうです.

Grafana

感想

秋葉原の秋月にふらっとよって手に取った温湿度センサでしたが発売直後すぎてデータシート以外の情報がなくうろたえました.(2021.08.31発売 / 2021.09.10購入)

I2Cを利用したことがなかったので完全に手探りでしたが値が取れてよかったです.(間違ってたら指摘をお願いします…)

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×