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)