こんにちは、ENGかぴです。
Grove Beginner kit for Arduinoは初心者のためのスターターキットです。気圧、温度センサーなど複数のセンサーが実装されておりArduinoライブラリの使い方やC言語(C++)の学習ができます。
本記事ではGrove Beginner Kit for Arduino(Seeed Studio製)を使用してBMP280の気圧と温度のデータを取得します。BMP280の製作メーカであるBOSCH社が提供しているAPIにArduinoのWireライブラリを組み込んで実装します。またSeeed Studioが公開しているライブラリを使った方法も紹介します。
Grove Beginner kit for Arduino(以下スターターキットとします。)はArduino UNOと同じシリーズのマイコンを使用しているためArduino UNOと同じように開発することができます。Arduinoのライブラリを使用して動作確認したことをまとめています。
Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方
Arduinoでの開発はArduino IDEを使って行います。インストールの手順などは下記記事にまとめています。
VsCodeを使用してもArduino環境でのソフト開発ができます。インストールの手順などは下記記事にまとめています。
VSCodeを使ったArduinoのソフト開発環境作りの手順
Arduino IDEでは書き込みとシリアルモニターを使用し、ソースコードをVsCodeで開発するなど使い分けることもできます。
開発環境の作り方
スターターキットの詳細はSeeed Studioのページにまとめられています。Arduinoライブラリの説明やセンサーの使用例やPWMの考え方などが解説されています。
Grove Beginner Kit for Arduino – Seeed Wiki (seeedstudio.com)
日本語対応のページが作成されていませんが、Google Chromeのブラウザーによる変換機能を使用することで日本語でページを表示することができます。
スターターキットにはソフトがプリインストールされているためUSBを接続すると各センサーの動作を確認することができます。プリインストールされているソフトは公開されているのでいつでも初期状態に戻すことができます。
タイマ管理で使用するMsTimer2ライブラリとOLEDの表示を行うU8g2ライブラリは標準ライブラリとして搭載されていないためライブラリマネージャーで追加します。ライブラリの追加の仕方や使用例については下記記事にまとめています。
Grove Beginner Kit for Arduinoの使い方
Grove Beginner Kit for Arduinoの照度センサーの使い方
MsTimer2はBMP280でデータを測定するタイミングを管理し、U8g2は取得したデータをOLEDに表示する目的で使用します。
BMP280のダウンロードとAPIの実装方法
BMP280のデータシートを確認すると気圧と温度に関して計算式や補正値による考え方が記載されていますが、BOSCH社が提供しているAPIを使用することが推奨されています。
データシートに記載されている計算式でも問題ないのですが、提供されているAPIによるものと比較するとAPIによるソースのほうが作りこまれています。以降ではBMP280のドライバーをBM280APIと表記します。
広告
PR:わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!
BMP280APIをBOSCH社のHPからダウンロード
BOSCH社が公開しているBMP280ドライバーをダウンロードします。下記リンクをクリックするとダウンロードのページに遷移します。
BoschSensortec-BMP280_driver(Bosch社のBMP280のAPI)
「Code」をクリックすると「Download ZIP」を選択するとファイルをまとめてダウンロードすることができます。ダウンロードが完了したら展開します。
BMP280のAPIソフトをArduinoファイルに配置する
Arduino IDEのプロジェクトファイル表示欄横の▼マークから新規タブを押すと新規ファイル追加することができますが、ここではプロジェクトのフォルダ内にファイルを直接追加する方法を説明しています。
Arduinoのプロジェクトファイル(inoファイル)があるフォルダにダウンロードした「BMP2-Sensor-API-master」の中から以下の3つをコピーして追加します。
- bmp2.c
- bmp2.h
- bmp2_defs.h
上記の例ではArduinoファイルのプロジェクト名をgrove_skit_3に変更しています。
PR:エンジニア転職なら100%自社内開発求人に強い【クラウドリンク】
BMP280APIの実装の準備
BMP280APIは気圧と温度の計算を行う特殊な計算やフィルタの設定がBMP280APIのクラスの型の変数で設定できるように構成されています。通信部分は使用するマイコンによって異なるためユーザーで組み込む必要があります。
ArduinoのWire(I2C) の送受信の処理をBMP280APIに組み込みます。プロジェクト最初にbmp280のAPIをコールするためにbmp2.hをインクルードします。
#include "bmp2.h"
BMP280APIに使用する変数とユーザーが準備する関数の実装
本項目では黒色の太文字は自作の関数、赤色の太文字はBMP280APIの関数とします。BMP280APIを使用するためには2つの変数を準備する必要があります。
bmp2_dev dev;
bmp2_data sensor_data;
bmp2_devはAPIの情報を構成するクラスの型です。インスタンス化したdevに必要な情報をセットすることでAPIとリンクすることができます。bmp2_dataはAPIは気圧、温度のデータを構成するクラスの型です。インスタンス化したsenser_dataに測定した気圧、温度のデータを格納します。
ユーザーが準備する関数についてはダウンロードしたファイルの中になる「bmp2_defs.h」及び「examples」から内容が確認できます。1~5までの関数をユーザーで準備して組み込みます。
- bmp2_init(&dev)
- int8_t (*bmp2_read_fptr_t)(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr)
- int8_t (*bmp2_write_fptr_t)(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr)
- void (*bmp2_delay_us_fptr_t)(uint32_t period, void *intf_ptr);
- int8_t stream_sensor_data_forced_mode(bmp2_dev *dev);
1.bmp2_init()関数はBMP280APIの初期化に使用します。使用する前にデバイスID(スレーブアドレス)、read/writeに使用する関数のアドレス、遅延用の関数を登録する必要があります。以下に使用例を示しています。
/* プロトタイプ宣言 */
void Bmp280Init(void);
int8_t bmp2_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr);
int8_t bmp2_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr);
void user_delay_us(uint32_t period, void *intf_ptr);
//使用例
void Bmp280Init(void){
uint8_t rslt;
dev.chip_id = BMP2_I2C_ADDR_SEC; //スレーブアドレス
dev.read = bmp2_i2c_read; //APIがコールするユーザーの関数(read)
dev.write = bmp2_i2c_write; //APIがコールするユーザーの関数(write)
dev.delay_us = user_delay_us; //APIがコールするユーザーの関数(delay)
dev.intf = BMP2_I2C_INTF; //通信方式はI2C(Wire)
rslt = bmp2_init(&dev); //APIの初期化
}
初期化の処理としてBmp280Init()関数を実装し、bmp2_devの型の変数にスレーブアドレス、ユーザー関数、通信方式の登録しbmp2_init()関数でBMP280を初期化します。正常に処理が進むと戻り値が0になります。
2.と3.の関数についてはデータの読み書きに使用しますが、2.3.の型と一致するようにbmp2_i2c_read()関数とbmp2_i2c_write()関数を準備し1.のユーザー関数のread/writeで指定しています。実装例はWire(I2C)の送信と実装例とWire(I2C)の受信の手順と実装例で示しています。
4.user_delay_us()関数は測定待ちの遅延(us単位)を行います。BMP280APIはus単位で遅延時間を指定するためArduinoのdelayMicroseconds()関数で遅延を行います。実装例は以下の通りです。
void user_delay_us(uint32_t period, void *intf_ptr){
delayMicroseconds(period);
}
5.stream_sensor_data_forced_mode()関数はセンサーの測定をFORCEDモードで行います。FORCEDモードは消費電力を抑えることが目的で測定開始のトリガーで測定を行う機能です。オーバーサンプリングなどを設定しないことが推奨されているため測定精度は少し低くなります。実装例は以下の通りです。
bmp2_config conf; //レギュレータの設定を格納する変数
//使用例
int8_t stream_sensor_data_forced_mode(bmp2_dev *dev){
int8_t rslt = BMP2_E_NULL_PTR;
int8_t idx = 1;
uint32_t req_delay;
bmp2_status status;
conf.os_mode = BMP2_OS_MODE_ULTRA_LOW_POWER; //低消費電力
conf.filter = BMP2_FILTER_OFF; //フィルタなし
conf.odr = BMP2_ODR_1000_MS; //設定するが使用しない
rslt = bmp2_compute_meas_time(&req_delay,&conf, dev); //測定時間算出
rslt = bmp2_set_power_mode(BMP2_POWERMODE_FORCED, &conf, dev);//測定モードの設定と開始
while (idx <= 50){
dev->delay_us(req_delay,dev->intf_ptr);
rslt = bmp2_get_status(&status, dev);
if (status.measuring == BMP2_MEAS_DONE){
rslt = bmp2_get_sensor_data(&sensor_data,dev);
}
idx++;
}
}
測定条件を指定するためbmp2_configクラスの型でインスタンス化したconfに測定モード、フィルタリングの設定、ODRの設定を行います。
BMP280のデータシートで推奨されているFORCEDモードの設定項目であるBMP2_OS_MODE_ULTRA_LOW_POWER及びBMP2_FILTER_OFFを選択しています。ODRはフィルタ(オーバーサンプリング)を使用しないため任意の設定です。
bmp2_compute_meas_time()関数を使用して設定項目に測定遅延時間を取得します。bmp2_set_power_mode()関数で指定した測定モード及びコンフィグレーションの条件で測定を開始します。
測定開始後はbmp2_compute_meas_time()関数で取得した遅延時間をuser_delay_us()関数で指定して測定完了の待機を行います。遅延時間は目安なのでbmp2_get_status()関数でステータスを確認して測定完了であればbmp2_get_sensor_data()関数で気圧、温度のデータを取得します。
ArduinoのWire(I2C)を組み込む
Arduinoの標準ライブラリであるWireライブラリの使い方を説明します。Wire(I2C)の送信と受信を中心に説明しています。BMP280APIの実装の仕方については「BMP280のダウンロードとAPIの実装方法」で説明しています。
Wireライブラリの初期化
#include <Wire.h>
void setup() {
Wire.begin(); //begin()内にアドレスを入れるとスレーブになる
//Wire.setClock(100000); //クロック周波数を設定する場合にセット初期は100kHz
}
Wire(I2C)を使用する場合はWire.hをインクルードします。begin()関数の引数の有無によってマスタで動作するかスレーブで動作するかが決まります。引数に指定した値でスレーブ動作を開始します。マスタとして使用するため引数は無しとします。
クロックは設定しなければ初期条件(ライブラリのソースコードを確認すると100kHzになっている)となります。引数として指定した値に近似した値がクロック周波数になりますが誤差が大きくなると通信エラーの原因になるため注意が必要です。
I2Cによる信号はプルアップ抵抗にも影響するためクロックを早く設定しすぎると波形がなまってしまうこともあるので特に意識せず100kHzで十分だと思います。
PR:RUNTEQ(ランテック )- マイベスト3年連続1位を獲得した実績を持つWebエンジニア養成プログラミングスクール
Wire(I2C)の送信と実装例
Wireライブラリを使った送信の手順は以下の通りです。
- beginTransmission()関数で初期化とスレーブアドレスをセット
- write()関数で書き込み対象のアドレスをセット
- write()関数で書き込むデータをセット
- endTransmission()関数で送信
1~3まではデータの準備です。4のendTransmission()関数はスタート・コンディションの発行やコントロール・バイト(7ビットのスレーブアドレスを左詰めにして最下位ビットにWriteフラグ(0)をセット)の処理を行いデータを送信した(書き込んだ)後ストップ・コンディションの発行を行います。以下に実装例を示します。
int8_t bmp2_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr){
uint8_t rslt=0;
Wire.beginTransmission(BMP2_I2C_ADDR_SEC); //スレーブが存在するか確認
byte error = Wire.endTransmission();
if( error == 0){
Wire.beginTransmission(BMP2_I2C_ADDR_SEC); //スタート・コンディションの発行
Wire.write(reg_addr); //書き込む対象のアドレスをセット
for( uint16_t i=0; i < length; i++ ){
Wire.write(*reg_data); //lenサイズ分だけデータを書き込む
++reg_data;
}
Wire.endTransmission(); //ストップ・コンディションの発行
}else{
//NGの場合(エラーを管理したい場合はここで処理する)
}
return rslt;
}
BMP280APIとリンクさせているbmp2_i2c_write()関数にWireを組み込みます。最初にbeginTransmission()関数で初期化とスレーブアドレスをセットします。
endTransmission()関数でアドレスを送信しスレーブが存在するか確認を行います。スレーブが存在する場合は戻り値が0になるためデータの書き込み処理に移ります。スレーブが存在しない場合もしくはエラーを監視したい場合はNGの場合の処理を追加してAPIに異常を通知します。
beginTransmission()関数で初期化とスレーブアドレスをセットします。次に書き込む対象のレジスタのアドレスをwrite()関数でセットします。続けてlenのサイズに応じてwrite()関数でデータをセットします。
最後にendTransmission()関数でスタート・コンディションからストップ・コンディションまでを含めたデータを送信します。
PR: わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジムPython入門講座の申込
Wire(I2C)の受信と実装例
Wireライブラリを使った受信の手順は以下の通りです。
- beginTransmission()関数で初期化とスレーブアドレスをセット
- write()関数で書き込み対象のアドレスをセット
- endTransmission()関数で送信
- requestFrom()関数で対象のアドレスのデータを取得する
- read()関数で取得したデータを読み込む
1~3まではスレーブアドレスに対して書き込み対象のアドレスを指定します。4のrequestFrom()関数はスタート・コンディションの発行やコントロール・バイト(7ビットのスレーブアドレスを左詰めにして最下位ビットにReadフラグ(1)をセット)の処理を行い指定した数のデータを取得し、ストップ・コンディションの発行を行います。
5は4で取得したデータを読み込みます。送信と異なる点はrequestFrom()でストップ・コンディションを発行するためendTransmission()の発行は必要ありません。以下に実装例を示します。
int8_t bmp2_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr){
uint8_t rslt = 0;
Wire.beginTransmission(BMP2_I2C_ADDR_SEC); //スレーブが存在するか確認
byte error = Wire.endTransmission();
if( error == 0){
Wire.beginTransmission(BMP2_I2C_ADDR_SEC); //スタート・コンディションの発行
Wire.write(reg_addr); //書き込む対象のアドレスをセット(ライトで指定)
Wire.endTransmission(); //ストップ・コンディションの発行
Wire.requestFrom(BMP2_I2C_ADDR_SEC, length); //受信開始(スタート(ストップ)・コンディションの発行)
for( uint16_t i=0; i < length; i++ ){
*reg_data = Wire.read(); //len分だけデータをリードする
++reg_data;
}
//Wire.endTransmission();
}else{
//NGの場合(エラーを管理したい場合はここで処理する)
}
return rslt;
}
BMP280APIとリンクさせているbmp2_i2c_read()関数にWireを組み込みます。最初にbeginTransmission()関数で初期化とスレーブアドレスをセットします。
endTransmission()関数でアドレスを送信し、スレーブが存在するか確認を行います。スレーブが存在する場合は戻り値が0になるためデータの書き込み処理に移ります。スレーブが存在しない場合もしくはエラーを監視したい場合はNGの場合の処理を追加してAPIに異常を通知します。
beginTransmission()関数で初期化とスレーブアドレスをセットします。次に書き込む対象のレジスタのアドレスをwrite()関数でセットします。endTransmission()関数でスレーブのレジスタを選択した状態にします。
requestFrom()関数でスレーブから指定した数のデータを取得します。read()関数で取得したデータを読み込みます。
BMP280ライブラリを追加して使用する(参考)
BMP280APIを組み込んで動作させる方法を説明しましたが、Arduino IDEでBMP280ライブラリを追加する方法もあります。BMP280ライブラリの中でGrove-Barometer Sensor BMP280ライブラリを使用する方法を参考として説明します。
Arduino IDEのライブラリマネージャの検索欄にgrove bmp280を入力するとBMP280ライブラリの候補が表示されます。候補の中からGrove-Barometer Sensor BMP280をインストールします。使用例は以下の通りです。
#include <Seeed_BMP280.h>
#include <MsTimer2.h>
#include <U8g2lib.h>
#include <Wire.h>
#define TIME_UP 0
#define TIME_OFF -1
#define TIM_MEAS 500
BMP280 bmp280;
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R2, /* reset=*/U8X8_PIN_NONE);
int16_t timmeas =0;// TIM_MEAS;
float temp;
float press;
/* プロトタイプ宣言 */
void mainTimer(void);
void Bmp280Show(void);
void setup() {
Serial.begin(115200);
if(!bmp280.init()){
Serial.println("Device error!");
}
u8g2.begin();
MsTimer2::set(10, mainTimer); // 10ms period
MsTimer2::start();
}
void loop() {
if(timmeas == TIME_UP){
timmeas = TIM_MEAS;
temp = bmp280.getTemperature();
press = bmp280.getPressure();
//get and print temperatures
Serial.print("Temp: ");
Serial.print(temp);
Serial.println("C");
//get and print atmospheric pressure data
Serial.print("Pressure: ");
Serial.print(press);
Serial.println("Pa");
Bmp280Show();
}
}
/* タイマ管理 */
void mainTimer(void){
if( timmeas > TIME_UP ){
--timmeas;
}
}
/* OLED表示*/
void Bmp280Show(void){
u8g2.firstPage(); //バッファをクリア
do{
u8g2.setFont(u8g2_font_t0_16_mr);
u8g2.setCursor(10, 16);
u8g2.print(F("Temp:"));
u8g2.setCursor(20, 32);
u8g2.print(temp);
u8g2.print("C");
u8g2.setCursor(10, 48);
u8g2.print(F("Press:"));
u8g2.setCursor(20, 64);
u8g2.print(press);
u8g2.print("Pa");
}while(u8g2.nextPage());
}
Seeed_BMP280.hとWire.hをインクルードします。BMP280クラスの変数を宣言してインスタンス化します。例ではbmp280でインスタンス化しています。
begin()関数でライブラリの初期化を行います。BMP280をI2Cで使用する場合は引数にスレーブを指定します。引数にアドレスを指定しない場合はデフォルト値である0x77がスレーブになります。
気圧情報の取得はgetPressure()関数、温度情報の取得はgetTemperature()関数を使用します。
動作確認
電源を入れるとOLEDにBMP280モジュールから取得したデータを表示します。5秒毎にデータを取得して表示を更新します。
温度(Temperature)は部屋に置いている温度計では22.5℃でした。BMP280の方が分解能がよいためうまく測定できていると判断しています。
気圧(Pressure)はスマホ(Android)で確認すると動作確認の時点で1013hPa=1013mBarでした。測定値は1019hPaだったことから少し誤差がある気がしますが、測定環境を考慮するとそれなりに測定できていると思います。
ソースコード全体
以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。
#include <MsTimer2.h>
#include <U8g2lib.h>
#include "bmp2.h"
#include <Wire.h>
#define TIME_UP 0
#define TIME_OFF -1
#define TIM_MEAS 500
int16_t timmeas =0;// TIM_MEAS;
bmp2_dev dev;
bmp2_config conf;
bmp2_data sensor_data;
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R2, /* reset=*/U8X8_PIN_NONE);
/* プロトタイプ宣言 */
void mainTimer(void);
void Bmp280Init(void);
int8_t bmp2_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr);
int8_t bmp2_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr);
void user_delay_us(uint32_t period, void *intf_ptr);
int8_t stream_sensor_data_forced_mode(bmp2_dev *dev);
void Bmp280Show(void);
void setup() {
Serial.begin(115200);
Wire.begin();
Bmp280Init();
u8g2.begin();
MsTimer2::set(10, mainTimer); // 10ms period
MsTimer2::start();
}
void loop() {
if( timmeas == TIME_UP ){
timmeas = TIM_MEAS;
stream_sensor_data_forced_mode(&dev);
Serial.print("temp:");
Serial.println(sensor_data.temperature);
Serial.print("press:");
Serial.println(sensor_data.pressure);
Bmp280Show();
}
}
/* タイマ管理 */
void mainTimer(void){
if( timmeas > TIME_UP ){
--timmeas;
}
}
/* Bmp280 sensor iniialize */
void Bmp280Init(void){
uint8_t rslt;
dev.chip_id = BMP2_I2C_ADDR_SEC;//BMP2_I2C_ADDR_PRIM;
dev.read = bmp2_i2c_read;
dev.write = bmp2_i2c_write;
dev.delay_us = user_delay_us;
dev.intf = BMP2_I2C_INTF;
rslt = bmp2_init(&dev);
Serial.print("bmp2_init:");
Serial.println(rslt);
}
/* Bmp280 api use function add */
int8_t bmp2_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr){
uint8_t rslt=0;
Wire.beginTransmission(BMP2_I2C_ADDR_SEC); //スレーブが存在するか確認
byte error = Wire.endTransmission();
if( error == 0){
Wire.beginTransmission(BMP2_I2C_ADDR_SEC); //スタート・コンディションの発行
Wire.write(reg_addr); //書き込む対象のアドレスをセット
for( uint16_t i=0; i < length; i++ ){
Wire.write(*reg_data); //lenサイズ分だけデータを書き込む
++reg_data;
}
Wire.endTransmission(); //ストップ・コンディションの発行
}else{
//NGの場合(エラーを管理したい場合はここで処理する)
}
return rslt;
}
/* Bmp280 api use function add */
int8_t bmp2_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr){
uint8_t rslt = 0;
Wire.beginTransmission(BMP2_I2C_ADDR_SEC); //スレーブが存在するか確認
byte error = Wire.endTransmission();
if( error == 0){
Wire.beginTransmission(BMP2_I2C_ADDR_SEC); //スタート・コンディションの発行
Wire.write(reg_addr); //書き込む対象のアドレスをセット(ライトで指定)
Wire.endTransmission(); //ストップ・コンディションの発行
Wire.requestFrom(BMP2_I2C_ADDR_SEC, length); //受信開始(スタート(ストップ)・コンディションの発行)
for( uint16_t i=0; i < length; i++ ){
*reg_data = Wire.read(); //len分だけデータをリードする
++reg_data;
}
//Wire.endTransmission();
}else{
//NGの場合(エラーを管理したい場合はここで処理する)
}
return rslt;
}
/* Bmp280 api use function add */
void user_delay_us(uint32_t period, void *intf_ptr){
delayMicroseconds(period);
}
/* Bmp280 api use function add */
int8_t stream_sensor_data_forced_mode(bmp2_dev *dev){
int8_t rslt = BMP2_E_NULL_PTR;
int8_t idx = 1;
uint32_t req_delay;
bmp2_status status;
conf.os_mode = BMP2_OS_MODE_ULTRA_LOW_POWER;
conf.filter = BMP2_FILTER_OFF;
conf.odr = BMP2_ODR_1000_MS;
rslt = bmp2_compute_meas_time(&req_delay,&conf, dev);
rslt = bmp2_set_power_mode(BMP2_POWERMODE_FORCED, &conf, dev);
while (idx <= 50){
dev->delay_us(req_delay,dev->intf_ptr);
rslt = bmp2_get_status(&status, dev);
if (status.measuring == BMP2_MEAS_DONE){
rslt = bmp2_get_sensor_data(&sensor_data,dev);
}
idx++;
}
}
/* OLED表示*/
void Bmp280Show(void){
u8g2.firstPage(); //バッファをクリア
do{
u8g2.setFont(u8g2_font_t0_16_mr);
u8g2.setCursor(10, 16);
u8g2.print(F("Temp:"));
u8g2.setCursor(20, 32);
u8g2.print(sensor_data.temperature);
u8g2.print("C");
u8g2.setCursor(10, 48);
u8g2.print(F("Press:"));
u8g2.setCursor(20, 64);
u8g2.print(sensor_data.pressure);
u8g2.print("Pa");
}while(u8g2.nextPage());
}
BMP280のダウンロードとAPIの実装方法で説明しているBMP280APIをArduinoのプロジェクトファイルに追加することで動作します
関連リンク
Arduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。
Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方
Seeeduino XIAOで学べるソフト開発と標準ライブラリの使い方
ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方
【クリエイターズファクトリー】卒業がない!挫折する心配なし!Webスクール説明会申し込み
最後まで、読んでいただきありがとうございました。