LoginSignup
4
5

More than 1 year has passed since last update.

Raspberry pi で環境計測構築

Last updated at Posted at 2019-07-05

DHT11を使って温度湿度計測を行ったのだけど結局、計測値が暴れているのでもうちょと精度の良いBME280を使って計測してみた。
image.png
アマゾンで1000円以下でポチれるディバイスです。
配線も簡単で

PIN sensor Raspi Pin
Vin 5v 電源 +5V or +3V 1
GND GND 電源 GND 9
SDA SDA シリアルデータ 3
SCL SCL シリアルクロック 5

image.png

I2Cの準備として
image.png

76番地の接続チック

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

76と表示されれば配線OK
ライブラリーの準備

# sudo apt install -y python-smbus
# sudo pip install smbus2

テストプログラム

BME280.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import smbus2 as smbus
import time
import datetime

i2c_address = 0x76
bus_number  = 1
bus = smbus.SMBus(bus_number)
digT = []
digP = []
digH = []

def get_calib_param():
    calib = []

    for i in range (0x88,0x88+24):
        calib.append(bus.read_byte_data(i2c_address,i))
    calib.append(bus.read_byte_data(i2c_address,0xA1))
    for i in range (0xE1,0xE1+7):
         calib.append(bus.read_byte_data(i2c_address,i))

    digT.append((calib[1] << 8) | calib[0])
    digT.append((calib[3] << 8) | calib[2])
    digT.append((calib[5] << 8) | calib[4])
    digP.append((calib[7] << 8) | calib[6])
    digP.append((calib[9] << 8) | calib[8])
    digP.append((calib[11]<< 8) | calib[10])
    digP.append((calib[13]<< 8) | calib[12])
    digP.append((calib[15]<< 8) | calib[14])
    digP.append((calib[17]<< 8) | calib[16])
    digP.append((calib[19]<< 8) | calib[18])
    digP.append((calib[21]<< 8) | calib[20])
    digP.append((calib[23]<< 8) | calib[22])
    digH.append( calib[24] )
    digH.append((calib[26]<< 8) | calib[25])
    digH.append( calib[27] )
    digH.append((calib[28]<< 4) | (0x0F & calib[29]))
    digH.append((calib[30]<< 4) | ((calib[29] >> 4) & 0x0F))
    digH.append( calib[31] )

    for i in range(1,2):
         if digT[i] & 0x8000: digT[i] = (-digT[i] ^ 0xFFFF) + 1

    for i in range(1,8):
         if digP[i] & 0x8000: digP[i] = (-digP[i] ^ 0xFFFF) + 1

    for i in range(0,6):
        if digH[i] & 0x8000: digH[i] = (-digH[i] ^ 0xFFFF) + 1  

def  get_data_bme280():
    setup()
    get_calib_param()
    data = []
    for i in range (0xF7, 0xF7+8):
        data.append(bus.read_byte_data(i2c_address,i))
    pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
    temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
    hum_raw  = (data[6] << 8)  |  data[7]

    temp, t_fine = get_temp(temp_raw)
    pressure = get_pressure(pres_raw,  t_fine )
    humid = get_humid(hum_raw,  t_fine )

    return temp, humid, pressure

def get_pressure(adc_P,  t_fine ):
    pressure = 0.0

    v1 = (t_fine / 2.0) - 64000.0
    v2 = (((v1 / 4.0) * (v1 / 4.0)) / 2048) * digP[5]
    v2 = v2 + ((v1 * digP[4]) * 2.0)
    v2 = (v2 / 4.0) + (digP[3] * 65536.0)
    v1 = (((digP[2] * (((v1 / 4.0) * (v1 / 4.0)) / 8192)) / 8)  + ((digP[1] * v1) / 2.0)) / 262144
    v1 = ((32768 + v1) * digP[0]) / 32768

    if v1 == 0: return 0
    pressure = ((1048576 - adc_P) - (v2 / 4096)) * 3125
    if pressure < 0x80000000: pressure = (pressure * 2.0) / v1
    else: pressure = (pressure / v1) * 2
    v1 = (digP[8] * (((pressure / 8.0) * (pressure / 8.0)) / 8192.0)) / 4096
    v2 = ((pressure / 4.0) * digP[7]) / 8192.0
    pressure = pressure + ((v1 + v2 + digP[6]) / 16.0)  
    return pressure/100

def get_temp(adc_T):
    t_fine = 0.0
    v1 = (adc_T / 16384.0 - digT[0] / 1024.0) * digT[1]
    v2 = (adc_T / 131072.0 - digT[0] / 8192.0) * (adc_T / 131072.0 - digT[0] / 8192.0) * digT[2]
    t_fine = v1 + v2
    return t_fine / 5120.0,  t_fine 

def get_humid(adc_H,  t_fine ):
    var_h =   t_fine  - 76800.0
    if var_h != 0:
         var_h = (adc_H - (digH[3] * 64.0 + digH[4]/16384.0 * var_h)) * (digH[1] / 65536.0 * (1.0 + digH[5] / 67108864.0 * var_h * (1.0 + digH[2] / 67108864.0 * var_h)))
    else:
         return 0
    var_h = var_h * (1.0 - digH[0] * var_h / 524288.0)
    if var_h > 100.0:
         var_h = 100.0
    elif var_h < 0.0:
         var_h = 0.0

    return var_h

def setup():
    osrs_t = 1                #Temperature oversampling x 1
    osrs_p = 1                #Pressure oversampling x 1
    osrs_h = 1                #Humidity oversampling x 1
    mode   = 3                #Normal mode
    t_sb   = 5                #Tstandby 1000ms
    filter = 0                #Filter off
    spi3w_en = 0              #3-wire SPI Disable

    ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode
    config_reg    = (t_sb << 5) | (filter << 2) | spi3w_en
    ctrl_hum_reg  = osrs_h
    bus.write_byte_data(i2c_address, 0xF2,ctrl_hum_reg)
    bus.write_byte_data(i2c_address, 0xF4,ctrl_meas_reg)
    bus.write_byte_data(i2c_address, 0xF5,config_reg)

def main():
    temp, humid, pressure = get_data_bme280()
    print(str(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')),end="")
    print(" 温度:%7.2f℃"%temp,end="")
    print(" 湿度:%7.2f%"%humid,end="")
    print(" 気圧:%7.2fhPa"%pressure)

if __name__ == '__main__':
    for i in range(100):
        main()
        time.sleep(1)

出力結果

# python BME280.py
2019/07/01 16:47:15 温度:  27.54℃ 湿度:  59.19% 気圧: 999.74hPa
2019/07/01 16:47:16 温度:  27.53℃ 湿度:  59.18% 気圧: 992.90hPa
2019/07/01 16:47:18 温度:  27.54℃ 湿度:  59.18% 気圧: 999.74hPa
2019/07/01 16:47:19 温度:  27.54℃ 湿度:  59.18% 気圧: 992.63hPa
2019/07/01 16:47:20 温度:  27.54℃ 湿度:  59.18% 気圧: 999.76hPa
2019/07/01 16:47:21 温度:  27.54℃ 湿度:  59.14% 気圧: 992.69hPa
2019/07/01 16:47:22 温度:  27.54℃ 湿度:  59.12% 気圧: 999.79hPa
2019/07/01 16:47:23 温度:  27.53℃ 湿度:  59.13% 気圧: 992.90hPa
2019/07/01 16:47:24 温度:  27.54℃ 湿度:  59.12% 気圧: 999.76hPa
2019/07/01 16:47:25 温度:  27.53℃ 湿度:  59.13% 気圧: 992.93hPa
2019/07/01 16:47:26 温度:  27.54℃ 湿度:  59.11% 気圧: 999.68hPa
2019/07/01 16:47:27 温度:  27.54℃ 湿度:  59.13% 気圧: 992.63hPa
2019/07/01 16:47:28 温度:  27.53℃ 湿度:  59.12% 気圧: 999.72hPa
2019/07/01 16:47:29 温度:  27.53℃ 湿度:  59.11% 気圧: 993.14hPa
2019/07/01 16:47:30 温度:  27.53℃ 湿度:  59.11% 気圧: 999.72hPa
2019/07/01 16:47:31 温度:  27.54℃ 湿度:  59.09% 気圧: 992.63hPa
2019/07/01 16:47:32 温度:  27.54℃ 湿度:  59.09% 気圧: 999.71hPa
2019/07/01 16:47:33 温度:  27.53℃ 湿度:  59.08% 気圧: 993.23hPa
2019/07/01 16:47:34 温度:  27.53℃ 湿度:  59.09% 気圧: 999.72hPa
2019/07/01 16:47:35 温度:  27.54℃ 湿度:  59.09% 気圧: 992.69hPa
2019/07/01 16:47:36 温度:  27.54℃ 湿度:  59.11% 気圧: 999.74hPa
2019/07/01 16:47:37 温度:  27.54℃ 湿度:  59.10% 気圧: 992.63hPa

Download Source file

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5