03.picoで温度・気圧(BMP280) C言語


03.picoで温度・気圧(BMP280) C言語

picoにて、BMP280センサーから得られた温度と気圧をPCの画面に表示します。
持っていた M5Stack用ENV2(温湿度・気圧センサ)は、I2C通信で BMP280(温度・気圧) + SHT30(温湿度) です。ただし、現在のENV3は、BMP280→QMP6988 になっています。
pico用の動作サンプルがありました。
C:\Pico\pico-examples\i2c\bmp280_i2c\bmp280_i2c.c

M5Stack用ENV2センサー

詳しくは、"08.Wio Terminalで温湿度・気圧表示"を参照ください。

特性

・(0〜60)±0.2℃
・(10〜90)±2%RH
・(300〜1100)±1hPa

内部回路

・温湿度センサIC SHT30 (I2C:0x44)
・絶対大気圧・温度センサIC BMP280 (I2C:0x76)
・Vccから3.3Vを作っている。センサーは5Vでも動作するが、picoの入力は3.3V。
・上記2つのセンサICの電源電圧は3.3Vです。
・出力CNのSCLとSDAのみ、各4.7kΩでVccと接続されています。

BMP280データシート1.26

https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp280-ds001.pdf

参考)BME280データシート1.2 個人日本語訳(BMPではない)
https://www.ne.jp/asahi/o-family/extdisk/BME280/BME280_DJP.pdf

ENV2コネクタの接続

(ENV2)-(線色)-(pico)
I2C_SCL-白黒--7pin 0SCL GP5
I2C_SDA-黄青--6pin 0SDA GP4
Vcc(5V)-赤赤-36pin 3V3out
GND-----黒黒--8pin GND

* SDA・SCLのpico側の接続は、その他に 1・2,11・12,16・17,21・22,26・27
I2Cポート1にすれば、4・5,9・10,14・15,19・20,24・25,31・32 に変更可能です。

TeraTerm

printの出力先をPCの画面にする時、ターミナルソフト TeraTerm を起動します。
設定 > シリアルポート
・ポート:COMを指定
・スピード:115200
・データ:8bit
・パリティ:none
・ストップビット:1bit
・フロー制御:none
に設定して、新規オープン


ファイル

以下、3つを用意します。
1.bmp280_i2c_c.c
 下記参照
2.CMakeLists.txt
 下記参照
3.pico_sdk_import.cmake
 今までと同じもの

bmp280_i2c_c.cの一部


int main() {
    stdio_init_all();//標準stdio型を初期化
#if !defined(i2c_default) || !defined(PICO_DEFAULT_I2C_SDA_PIN) || !defined(PICO_DEFAULT_I2C_SCL_PIN)
        puts("デフォルトのI2Cピンは定義されていません");
#else
    bi_decl(bi_2pins_with_func(PICO_DEFAULT_I2C_SDA_PIN, PICO_DEFAULT_I2C_SCL_PIN, GPIO_FUNC_I2C));//バイナリ情報を宣言
    bi_decl(bi_program_description("BMP280 I2C example for the Raspberry Pi Pico"));
    printf("こんにちは、BMP280から温度と気圧値を読取る...\n");
    i2c_init(i2c_default, 100 * 1000);//I2Cを初期化(i2c0 or i2c1,Hz単位のボーレート)
    gpio_set_function(PICO_DEFAULT_I2C_SDA_PIN, GPIO_FUNC_I2C);//GPIO機能を選択(GP番号 GPIO関数)
    gpio_set_function(PICO_DEFAULT_I2C_SCL_PIN, GPIO_FUNC_I2C);
    gpio_pull_up(PICO_DEFAULT_I2C_SDA_PIN);//I2Cが未送信時にHに保つためにプルアップ
    gpio_pull_up(PICO_DEFAULT_I2C_SCL_PIN);
    bmp280_init();//BMP280を構成する
    struct bmp280_calib_param params;
    bmp280_get_calib_params(¶ms);  // 固定補正パラメータを取得
    int32_t raw_temperature;//温度測定値変数
    int32_t raw_pressure;//気圧測定値変数
    sleep_ms(250); //レジスタ更新が衝突しないように待つ
    while (1) {    // 永久ループ
        bmp280_read_raw(&raw_temperature, &raw_pressure);  // 温度&気圧測定値
        int32_t temperature = bmp280_convert_temp(raw_temperature, ¶ms);  // 校正後温度
        int32_t pressure = bmp280_convert_pressure(raw_pressure, raw_temperature, ¶ms);//校正後気圧
        printf("%.1f℃  ", temperature / 100.f); // 温度表示 
        printf("%.0fhPa\n", pressure / 100.f);  // 気圧表示
        sleep_ms(1000);                         // 1秒待つ
    }
#endif
    return 0;
}

CMakeLists.txt

プロジェクト名は"project1"、実行ファイル名は"test"で今後統一します。修正毎にCファイルのレビジョンを上げたので、このファイルは1行のみ変更します。

cmake_minimum_required(VERSION 3.12)
include(pico_sdk_import.cmake)
project(project1 C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
#----------
add_executable(test bmp280_i2c_c.c)
#----------
target_link_libraries(test pico_stdlib hardware_i2c)
pico_enable_stdio_usb(test 1)
pico_enable_stdio_uart(test 0)
pico_add_extra_outputs(test)