M5GO(M5Stack)로 DHT12와 BMP280의 기온값 비교
16922 단어 M5GOAmbientmicropythonM5stack
개요
M5GO와 함께 제공되는 환경 센서에는 DHT12와 BMP280이 들어 있으며, 각각 기온과 습도, 기온과 기압을 측정할 수 있습니다. 샘플 프로그램에서는 기온은 BMP280쪽의 값을 취득(모듈 units내) 하게 되어 있습니다만, DHT12에서도 기온을 취득해 값을 비교해 보았습니다.
모듈(dht12와 bmp280)을 확인하면 취득값의 정밀도는
- DHT12의 기온값은 소수점 이하 1자리까지
- BMP280의 기온값은 소수점 이하 2자리까지
준비
전송에는 Adafruit MicroPython Tool (앰프)을 사용했습니다.
$ export AMPY_PORT=/dev/tty.SLAB_USBtoUART
$ ampy put ambient.py /flash/ambient.py
결과
이번 시도한 결과에서는 DHT12로 취득한 기온치가 평균 0.4도 정도 높은 값이 되었습니다. 정확한 온도계가 없기 때문에 어느 것이 더 정확한 값인지는 모릅니다.
![](https://s1.md5.ltd/image/eabf66de3f46545b9949d1387a6703ad.jpeg)
![](https://s1.md5.ltd/image/bccdd8951434e8e7235cc997a781b73e.png)
프로그램
(수정:Ambient에 매초 보내면 제한에 걸려 버리므로, 1분 간격으로 보내도록 수정했습니다)
from m5stack import lcd
import machine
import time
import units
import gc
import ambient
# 日本時間に同期
rtc = machine.RTC()
rtc.ntp_sync('ntp.nict.jp', tz='JST-9')
# M5GOのfirmwareがv0.11ではntp_syncでtzを指定するとエラーになるので以下で対応
# rtc.ntp_sync('ntp.nict.jp')
# sys.tz('JST-9')
# 同期が完了するまで100ms程度かかる
for i in range(100):
if rtc.synced():
print('synced.')
break
print(i, end=' ')
time.sleep_ms(10)
lcd.font(lcd.FONT_DejaVu18)
lcd.clear()
lcd.print('DHT12', 10, 50)
lcd.print('humidity:', 30, 80)
lcd.print('temperature:', 30, 110)
lcd.print('BMP280', 10, 140)
lcd.print('temperature:', 30, 170)
lcd.print('pressure:', 30, 200)
env = units.ENV(units.PORTA)
# Ambientで取得したチャネルのチャネルId, ライトキーを指定
am = ambient.Ambient(チャネルId, ライトキー)
while True:
#次の秒までの差分(ミリ秒)を求めてスリープ
time.sleep_ms(1000 - int(time.time() % 1 * 1000))
localtime = time.localtime()
localtime_str = time.strftime('%Y-%m-%d %H:%M:%S', localtime)
try:
# DHT12 から気温と湿度を取得
env.dht12.measure()
d_h = env.dht12.humidity()
d_t = env.dht12.temperature()
# BMP280 から気温と気圧を取得
b_t, b_p = env.bmp280.values
lcd.print(localtime_str, 10, 10)
# 表示桁数が減った時に(気圧が1000から999になった時)
# 後ろを消すのに空白2個入れる
lcd.print('{:.2f}% '.format(d_h), 180, 80) # DHT12の湿度
lcd.print('{:.2f}C '.format(d_t), 180, 110) # DHT12の気温
lcd.print('{:.2f}C '.format(b_t), 180, 170) # BMP280の気温
lcd.print('{:.2f}hPa '.format(b_p), 180, 200) # BMP280の気圧
# Ambientへの送信は1分間隔で行う。
# localtime[5](秒) == 0 の時に送信
if localtime[5] == 0:
try:
ar = am.send({'d1': d_t, 'd2': d_h, 'd3': b_t, 'd4': b_p})
except Exception as e:
print(localtime_str, ' ambient send error: ', e)
except Exception as e:
# 時々I2C bus error が起きる。
# データを取得できなかった時は時刻を赤字で表示
lcd.print(localtime_str, 10, 10, lcd.RED)
print(localtime_str, ' Script Name: ', __name__)
print('Exception: ', e)
gc.collect()
덤 (MPU6500)
M5GO에는 9축 센서의 MPU9250이 탑재되어 있어 거기에 포함되는 6축 센서의 MPU6500에도 온도 센서가 있으므로, 그 쪽도 시험해 보았습니다. M5GO 의 MicroPython 에 포함되는 MPU6500 용의 모듈에는 온도 취득용의 메소드가 없기 때문에, 레지스터로부터 직접 취득해 이하의 계산식으로 산출했습니다.
MPU-6500 등록 맵 및 설명
TEMP_degC = ((TEMP_OUT – RoomTemp_Offset)/Temp_Sensitivity) + 21degC
MPU-6500 Product Specification
Sensitivity: 333.87
Room Temp Offset: 0
m5go_temperature_test.pyimport machine
import i2c_bus
from dht12 import DHT12
from bmp280 import BMP280
from mpu6500 import MPU6500
i2c = i2c_bus.get(i2c_bus.M_BUS)
dht12 = DHT12(i2c)
bmp280 = BMP280(i2c)
mpu6500 = MPU6500(i2c)
dht12.measure()
d_t = dht12.temperature()
b_t, _ = bmp280.values
m_t = mpu6500._register_short(0x41) / 333.87 + 21
print('Temperature')
print('DHT12: {:.2f}'.format(d_t))
print('BMP280: {:.2f}'.format(b_t))
print('MPU6500: {:.2f}'.format(m_t))
실행 결과
$ ampy run m5go_temperature_test.py
Temperature
DHT12: 29.50
BMP280: 28.66
MPU6500: 37.96
![](https://s1.md5.ltd/image/1f634e4fae9e86de9db29f1f2aa82939.png)
MPU9250은 M5GO에 내장되어 있기 때문에 M5GO 자체의 발열의 영향으로 높은 값이 된다고는 생각하지만, 지속적으로 측정하여 그래프화하면 DHT12/BMP280의 변화와 일치하므로 취득값으로부터 산출한다 때의 계수를 재검토하면 나름대로 제대로 된 값이 된다? (DHT12/BMP280에서 점점 피쿳과 오르고 있는 것은 I2C의 에러가 발생해 다시 연결했을 때의 영향)
Reference
이 문제에 관하여(M5GO(M5Stack)로 DHT12와 BMP280의 기온값 비교), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/inasawa/items/def3b7755e8e28ed4f53
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
from m5stack import lcd
import machine
import time
import units
import gc
import ambient
# 日本時間に同期
rtc = machine.RTC()
rtc.ntp_sync('ntp.nict.jp', tz='JST-9')
# M5GOのfirmwareがv0.11ではntp_syncでtzを指定するとエラーになるので以下で対応
# rtc.ntp_sync('ntp.nict.jp')
# sys.tz('JST-9')
# 同期が完了するまで100ms程度かかる
for i in range(100):
if rtc.synced():
print('synced.')
break
print(i, end=' ')
time.sleep_ms(10)
lcd.font(lcd.FONT_DejaVu18)
lcd.clear()
lcd.print('DHT12', 10, 50)
lcd.print('humidity:', 30, 80)
lcd.print('temperature:', 30, 110)
lcd.print('BMP280', 10, 140)
lcd.print('temperature:', 30, 170)
lcd.print('pressure:', 30, 200)
env = units.ENV(units.PORTA)
# Ambientで取得したチャネルのチャネルId, ライトキーを指定
am = ambient.Ambient(チャネルId, ライトキー)
while True:
#次の秒までの差分(ミリ秒)を求めてスリープ
time.sleep_ms(1000 - int(time.time() % 1 * 1000))
localtime = time.localtime()
localtime_str = time.strftime('%Y-%m-%d %H:%M:%S', localtime)
try:
# DHT12 から気温と湿度を取得
env.dht12.measure()
d_h = env.dht12.humidity()
d_t = env.dht12.temperature()
# BMP280 から気温と気圧を取得
b_t, b_p = env.bmp280.values
lcd.print(localtime_str, 10, 10)
# 表示桁数が減った時に(気圧が1000から999になった時)
# 後ろを消すのに空白2個入れる
lcd.print('{:.2f}% '.format(d_h), 180, 80) # DHT12の湿度
lcd.print('{:.2f}C '.format(d_t), 180, 110) # DHT12の気温
lcd.print('{:.2f}C '.format(b_t), 180, 170) # BMP280の気温
lcd.print('{:.2f}hPa '.format(b_p), 180, 200) # BMP280の気圧
# Ambientへの送信は1分間隔で行う。
# localtime[5](秒) == 0 の時に送信
if localtime[5] == 0:
try:
ar = am.send({'d1': d_t, 'd2': d_h, 'd3': b_t, 'd4': b_p})
except Exception as e:
print(localtime_str, ' ambient send error: ', e)
except Exception as e:
# 時々I2C bus error が起きる。
# データを取得できなかった時は時刻を赤字で表示
lcd.print(localtime_str, 10, 10, lcd.RED)
print(localtime_str, ' Script Name: ', __name__)
print('Exception: ', e)
gc.collect()
M5GO에는 9축 센서의 MPU9250이 탑재되어 있어 거기에 포함되는 6축 센서의 MPU6500에도 온도 센서가 있으므로, 그 쪽도 시험해 보았습니다. M5GO 의 MicroPython 에 포함되는 MPU6500 용의 모듈에는 온도 취득용의 메소드가 없기 때문에, 레지스터로부터 직접 취득해 이하의 계산식으로 산출했습니다.
MPU-6500 등록 맵 및 설명
TEMP_degC = ((TEMP_OUT – RoomTemp_Offset)/Temp_Sensitivity) + 21degC
MPU-6500 Product Specification
Sensitivity: 333.87
Room Temp Offset: 0
m5go_temperature_test.py
import machine
import i2c_bus
from dht12 import DHT12
from bmp280 import BMP280
from mpu6500 import MPU6500
i2c = i2c_bus.get(i2c_bus.M_BUS)
dht12 = DHT12(i2c)
bmp280 = BMP280(i2c)
mpu6500 = MPU6500(i2c)
dht12.measure()
d_t = dht12.temperature()
b_t, _ = bmp280.values
m_t = mpu6500._register_short(0x41) / 333.87 + 21
print('Temperature')
print('DHT12: {:.2f}'.format(d_t))
print('BMP280: {:.2f}'.format(b_t))
print('MPU6500: {:.2f}'.format(m_t))
실행 결과
$ ampy run m5go_temperature_test.py
Temperature
DHT12: 29.50
BMP280: 28.66
MPU6500: 37.96
![](https://s1.md5.ltd/image/1f634e4fae9e86de9db29f1f2aa82939.png)
MPU9250은 M5GO에 내장되어 있기 때문에 M5GO 자체의 발열의 영향으로 높은 값이 된다고는 생각하지만, 지속적으로 측정하여 그래프화하면 DHT12/BMP280의 변화와 일치하므로 취득값으로부터 산출한다 때의 계수를 재검토하면 나름대로 제대로 된 값이 된다? (DHT12/BMP280에서 점점 피쿳과 오르고 있는 것은 I2C의 에러가 발생해 다시 연결했을 때의 영향)
Reference
이 문제에 관하여(M5GO(M5Stack)로 DHT12와 BMP280의 기온값 비교), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/inasawa/items/def3b7755e8e28ed4f53텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)