Renesas Rulz - Japan
  • User
    Join or Sign In
  • Site
  • Search Japan.RenesasRulz.com
  • User
  • Renesas Rulz
  • FAQ
  • パートナー
  • 半導体セミナ
  • eラーニング
  • ヘルプ
  • More
  • Cancel
  • かふぇルネ
  • がじぇるね
  • Groups
  • English Community
  • More
  • Cancel
がじぇっとるねさすコミュニティ
がじぇっとるねさすコミュニティ
GR-CITRUS GR-CITRUS+BME280で温度、湿度、気圧…
  • Forums
  • Blog
  • Files
  • がじぇっとるねさす ゆーざー会 - Wiki
  • Tags
  • More
  • Cancel
  • New

 

 チャレンジプログラム

 GR-SAKURA

 GR-KURUMI

 SNShield

 Web Compiler

 IDE for GR

 その他

 

 作り方使い方資料

 イベント関連

 作品記事

 体験記事

 その他

 

 ライブラリ

 ツール

 その他

  • Date 鈴木
    鈴木
  • Date 2019/2/21 11:09
  • Replies 2 replies
  • Subscribers 439 subscribers
  • Views 2065 views
  • gr-citrus
Options
  • Share
  • More
  • Cancel
Related Tags
  • DS18B20
  • gr-citrus
  • gr-sakura
  • i2c
  • IDE for GR
  • led
  • WS8212B
  • 簡易オシロスコープ
Related

GR-CITRUS+BME280で温度、湿度、気圧を測る

秋月で買えるBME280モジュールをI2CでGR-CITRUSに接続して動作しました。

プログラム(IDE for GRで動作させました)

citrus_BME280.txt
#include <Arduino.h>
#include <Wire.h>
#include <SPI.h>

void BME280_init( void );
void BME280readData( void );
void BME280readTrim( void );
void BME280writeReg( byte reg_address, byte data);

signed long int BME280calibration_T( signed long int adc_T );
unsigned long int BME280calibration_P(signed long int adc_P );
unsigned long int BME280calibration_H(signed long int adc_H);

typedef unsigned int  unit16_t;
typedef unsigned long  unit32_t;

#define BME280_ADRS       0x77
#define TEMP_CALIBRATION 1.5  //気温の較正値

enum
{
    BME280_REGISTER_DIG_T1              = 0x88,
    BME280_REGISTER_DIG_T2              = 0x8A,
    BME280_REGISTER_DIG_T3              = 0x8C,
    BME280_REGISTER_DIG_P1              = 0x8E,
    BME280_REGISTER_DIG_P2              = 0x90,
    BME280_REGISTER_DIG_P3              = 0x92,
    BME280_REGISTER_DIG_P4              = 0x94,
    BME280_REGISTER_DIG_P5              = 0x96,
    BME280_REGISTER_DIG_P6              = 0x98,
    BME280_REGISTER_DIG_P7              = 0x9A,
    BME280_REGISTER_DIG_P8              = 0x9C,
    BME280_REGISTER_DIG_P9              = 0x9E,
    BME280_REGISTER_DIG_H1              = 0xA1,
    BME280_REGISTER_DIG_H2              = 0xE1,
    BME280_REGISTER_DIG_H3              = 0xE3,
    BME280_REGISTER_DIG_H4              = 0xE4,
    BME280_REGISTER_DIG_H5              = 0xE5,
    BME280_REGISTER_DIG_H6              = 0xE7,
    BME280_REGISTER_CHIPID             = 0xD0,
    BME280_REGISTER_VERSION            = 0xD1,
    BME280_REGISTER_SOFTRESET          = 0xE0,
    BME280_REGISTER_CAL26              = 0xE1,  // R calibration stored in 0xE1-0xF0
    BME280_REGISTER_CONTROLHUMID       = 0xF2,
    BME280_REGISTER_STATUS             = 0XF3,
    BME280_REGISTER_CONTROL            = 0xF4,
    BME280_REGISTER_CONFIG             = 0xF5,
    BME280_REGISTER_PRESSUREDATA       = 0xF7,
    BME280_REGISTER_TEMPDATA           = 0xFA,
    BME280_REGISTER_HUMIDDATA          = 0xFD
};

char msg[128];
float gtFdata[ 3 ];    // floatのデータ

unsigned long int hum_raw, temp_raw, pres_raw;
signed long int tfine;
uint16_t dig_T1;
int16_t dig_T2;
int16_t dig_T3;
uint16_t dig_P1;
int16_t dig_P2;
int16_t dig_P3;
int16_t dig_P4;
int16_t dig_P5;
int16_t dig_P6;
int16_t dig_P7;
int16_t dig_P8;
int16_t dig_P9;
int8_t  dig_H1;
int16_t dig_H2;
int8_t  dig_H3;
int16_t dig_H4;
int16_t dig_H5;
int8_t  dig_H6;

void setup() 
{
    Serial.begin( 9600 );         // コンソール出力用

    // センサの初期化
    BME280_init();
}

void loop() 
{
    double temp_act = 0.0, press_act = 0.0, hum_act = 0.0;
    signed long int temp_cal;
    unsigned long int press_cal, hum_cal;
    char text[2];
    int di = 0;

    BME280readData();

    temp_cal = BME280calibration_T(temp_raw);
    press_cal = BME280calibration_P(pres_raw);
    hum_cal = BME280calibration_H(hum_raw);
    gtFdata[ 0 ] = (double)temp_cal / 100.0;
    gtFdata[ 0 ] -= TEMP_CALIBRATION;             //気温の較正を行う
    gtFdata[ 1 ] = (double)hum_cal / 1024.0;
    gtFdata[ 2 ] = (double)press_cal / 100.0;
  
    sprintf( msg, "%4.1fC, %4.1f%%, %4.1fhPa", gtFdata[ 0 ], gtFdata[ 1 ], gtFdata[ 2 ] );
    Serial.println( msg );

    delay ( 5000 );
}

void BME280_init()
{
    uint8_t osrs_t = 1;             //Temperature oversampling x 1
    uint8_t osrs_p = 1;             //Pressure oversampling x 1
    uint8_t osrs_h = 1;             //Humidity oversampling x 1
    uint8_t mode = 3;               //Normal mode
    uint8_t t_sb = 5;               //Tstandby 1000ms
    uint8_t filter = 0;             //Filter off
    uint8_t spi3w_en = 0;           //3-wire SPI Disable
    uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode;
    uint8_t config_reg    = (t_sb << 5) | (filter << 2) | spi3w_en;
    uint8_t ctrl_hum_reg  = osrs_h;
  
    Wire.begin();
    BME280writeReg( BME280_REGISTER_SOFTRESET, 0xB6 );
    delay( 300 );

    BME280writeReg( BME280_REGISTER_CONTROLHUMID, ctrl_hum_reg);
    BME280writeReg( BME280_REGISTER_CONTROL, ctrl_meas_reg);
    BME280writeReg( BME280_REGISTER_CONFIG, config_reg);
    BME280readTrim();
    delay( 100 );
}

void BME280readData()
{
    int i = 0;
    long data[8];
    Wire.beginTransmission( BME280_ADRS );
    Wire.write( BME280_REGISTER_PRESSUREDATA );
    Wire.endTransmission();
    Wire.requestFrom( BME280_ADRS, 8 );
    while (Wire.available()) 
    {
        data[ i ] = Wire.read();
        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];
}

void BME280readTrim()
{
    uint8_t data[32], i = 0;
    Wire.beginTransmission( BME280_ADRS );
    Wire.write( BME280_REGISTER_DIG_T1 );
    Wire.endTransmission();
    Wire.requestFrom( BME280_ADRS, 24);
    while (Wire.available()) 
    {
        data[i] = Wire.read();
        i++;
    }

    Wire.beginTransmission( BME280_ADRS );
    Wire.write( BME280_REGISTER_DIG_H1 );
    Wire.endTransmission();
    Wire.requestFrom( BME280_ADRS, 1);
    data[i] = Wire.read();
    i++;

    Wire.beginTransmission( BME280_ADRS );
    Wire.write( BME280_REGISTER_CAL26 );
    Wire.endTransmission();
    Wire.requestFrom( BME280_ADRS, 7);
    while (Wire.available()) 
    {
        data[i] = Wire.read();
        i++;
    }
    dig_T1 = (data[1] << 8) | data[0];
    dig_T2 = (data[3] << 8) | data[2];
    dig_T3 = (data[5] << 8) | data[4];
    dig_P1 = (data[7] << 8) | data[6];
    dig_P2 = (data[9] << 8) | data[8];
    dig_P3 = (data[11] << 8) | data[10];
    dig_P4 = (data[13] << 8) | data[12];
    dig_P5 = (data[15] << 8) | data[14];
    dig_P6 = (data[17] << 8) | data[16];
    dig_P7 = (data[19] << 8) | data[18];
    dig_P8 = (data[21] << 8) | data[20];
    dig_P9 = (data[23] << 8) | data[22];
    dig_H1 = data[24];
    dig_H2 = (data[26] << 8) | data[25];
    dig_H3 = data[27];
    dig_H4 = (data[28] << 4) | (0x0F & data[29]);
    dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F);
    dig_H6 = data[31];
}

void BME280writeReg( byte reg_address, byte data)
{
    Wire.beginTransmission( BME280_ADRS );
    Wire.write( reg_address );
    Wire.write( data );
    Wire.endTransmission();
}

signed long int BME280calibration_T( signed long int adc_T )
{
    signed long int var1, var2, T;
    var1 = ((((adc_T >> 3) - ((signed long int)dig_T1 << 1))) * ((signed long int)dig_T2)) >> 11;
    var2 = (((((adc_T >> 4) - ((signed long int)dig_T1)) * ((adc_T >> 4) - ((signed long int)dig_T1))) >> 12) * ((signed long int)dig_T3)) >> 14;
    tfine = var1 + var2;
    T = (tfine * 5 + 128) >> 8;
    return T;
}

unsigned long int BME280calibration_P(signed long int adc_P)
{
    signed long int var1, var2;
    unsigned long int P;
    var1 = (((signed long int)tfine) >> 1) - (signed long int)64000;
    var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * ((signed long int)dig_P6);
    var2 = var2 + ((var1 * ((signed long int)dig_P5)) << 1);
    var2 = (var2 >> 2) + (((signed long int)dig_P4) << 16);
    var1 = (((dig_P3 * (((var1 >> 2) * (var1 >> 2)) >> 13)) >> 3) + ((((signed long int)dig_P2) * var1) >> 1)) >> 18;
    var1 = ((((32768 + var1)) * ((signed long int)dig_P1)) >> 15);
    if (var1 == 0)
    {
        return 0;
    }
    P = (((unsigned long int)(((signed long int)1048576) - adc_P) - (var2 >> 12))) * 3125;
    if (P < 0x80000000)
    {
        P = (P << 1) / ((unsigned long int) var1);
    }
    else
    {
        P = (P / (unsigned long int)var1) * 2;
    }
    var1 = (((signed long int)dig_P9) * ((signed long int)(((P >> 3) * (P >> 3)) >> 13))) >> 12;
    var2 = (((signed long int)(P >> 2)) * ((signed long int)dig_P8)) >> 13;
    P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4));
    return P;
}

unsigned long int BME280calibration_H(signed long int adc_H)
{
    signed long int v_x1;
    v_x1 = (tfine - ((signed long int)76800));
    v_x1 = (((((adc_H << 14) - (((signed long int)dig_H4) << 20) - (((signed long int)dig_H5) * v_x1)) +
            ((signed long int)16384)) >> 15) * (((((((v_x1 * ((signed long int)dig_H6)) >> 10) *
                (((v_x1 * ((signed long int)dig_H3)) >> 11) + ((signed long int) 32768))) >> 10) + (( signed long int)2097152)) *
                ((signed long int) dig_H2) + 8192) >> 14));
    v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int)dig_H1)) >> 4));
    v_x1 = (v_x1 < 0 ? 0 : v_x1);
    v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1);
    return (unsigned long int)(v_x1 >> 12);
}

実行結果です。

 

  • Cancel
  • Reply
  • @chobichan
    @chobichan
    • 0
    • 2019/2/22 0:14
    そう言えばこのBME280のモジュール基板のジャンパーって難しくないですか?半田がレジストに弾かれてしまう。
    1列ピンをまっすぐ半田付けするのもちょっと難しくて慣れが必要。
    そもそも家では半田の用意をするの、ちょと面倒。
    設定済み、半田付け済みでそのままブレッドボードにさせる商品が有っても良さそうなのに。
  • 鈴木
    鈴木
    • 0
    • 2019/2/22 2:31

    In reply to @chobichan:

    最初にジャンパされていないと思わなくて、はまりました。デフォルトジャンパで、後から切断できる形にしてほしかったです。ハンダ禁止のオフィスは多いと思います。
サイト使用条件
プライバシーポリシー
お問い合わせ
© 2010-2019 Renesas Electronics Corporation. All rights reserved.