M5GO(M5Stack)로 DHT12와 BMP280의 기온값 비교

개요



M5GO와 함께 제공되는 환경 센서에는 DHT12와 BMP280이 들어 있으며, 각각 기온과 습도, 기온과 기압을 측정할 수 있습니다. 샘플 프로그램에서는 기온은 BMP280쪽의 값을 취득(모듈 units내) 하게 되어 있습니다만, DHT12에서도 기온을 취득해 값을 비교해 보았습니다.
  • MicroPython으로 작성
  • DHT12에서 온도와 습도 얻기
  • BMP280에서 기온과 기압 얻기
  • Ambient로 보내고 그래프화

  • 모듈(dht12와 bmp280)을 확인하면 취득값의 정밀도는
    - DHT12의 기온값은 소수점 이하 1자리까지
    - BMP280의 기온값은 소수점 이하 2자리까지

    준비


  • 아래에서 Ambient의 Python 모듈 (ambient.py) 얻기


  • 얻은 ambient.py를 M5GO로 전송

  • 전송에는 Adafruit MicroPython Tool (앰프)을 사용했습니다.
    $ export AMPY_PORT=/dev/tty.SLAB_USBtoUART 
    $ ampy put ambient.py /flash/ambient.py
    
  • Ambient 측에서 채널을 만들고 채널 ID와 라이트 키를 얻습니다
  • M5GO Cloud에서 아래에 붙여넣은 MicroPython 프로그램 실행

  • 결과



    이번 시도한 결과에서는 DHT12로 취득한 기온치가 평균 0.4도 정도 높은 값이 되었습니다. 정확한 온도계가 없기 때문에 어느 것이 더 정확한 값인지는 모릅니다.
  • M5GO 화면 표시


  • Ambient의 화면 표시



  • 프로그램



    (수정: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.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
    



    MPU9250은 M5GO에 내장되어 있기 때문에 M5GO 자체의 발열의 영향으로 높은 값이 된다고는 생각하지만, 지속적으로 측정하여 그래프화하면 DHT12/BMP280의 변화와 일치하므로 취득값으로부터 산출한다 때의 계수를 재검토하면 나름대로 제대로 된 값이 된다? (DHT12/BMP280에서 점점 피쿳과 오르고 있는 것은 I2C의 에러가 발생해 다시 연결했을 때의 영향)

    좋은 웹페이지 즐겨찾기