こんにちは、ENGかぴです。
Seeeduino XIAOはArduino環境と互換性あるためSPIライブラリ及びWireライブラリが使用できます。SPIを使用してBME280から温湿度・気圧の情報を取得しI2C通信を使用してLCDに表示する方法をまとめました。
BME280使用 温湿度・気圧センサモジュールキットAE-BME280(秋月電子)を使用してデータを取得します。LCDはAQM1602XA-RN-GBW(秋月電子で購入)を使用しています。
Seeeduino XIAOを使って動作確認を行ったことを下記リンクにまとめています。
Seeeduino XIAOで学べるソフト開発と標準ライブラリの使い方
BME280のデータをLCDに表示する
BME280はBOSCH社が製作している温湿度・気圧センサーです。BME280から取得したデータを温湿度・気圧のデータに換算する方法が複雑であるためBOSCH社からAPIが提供されています。APIを使って換算した結果をLCDに表示します。
BME280のデータを取得
BME280はI2CとSPIのどちらでも通信ができるように構成されています。今回はSPIを使用してBME280から温度・湿度・気圧のデータを取得します。取得する方法は下記記事にまとめています。
Seeeduino XIAOのSPIを使ってBME280のデータを取得
PR:
わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジムPython入門講座の申込
LCDの初期化

LCDで文字を表示するために初期化を行います。秋月電子のHPに公開されているAQM1602XA-RN-GBWのLCD資料(参考資料)の例を一部抜粋して説明します。
/* LCDへのコマンド処理 */
void LcdComand(uint8_t cmd){
Wire.beginTransmission(SLAVE_ADRS);
Wire.write(0x00);
Wire.write(cmd);
Wire.endTransmission();
delay(1);
}
LCDへのコマンドはスレーブアドレスを指定し0x00を書き込んだ後に指定コマンドを書き込みます。コマンド書き込みの例としてLcdComand()関数を実装します。下のLCD初期化の例の通り指定するコマンドを引数に指定します。
/* LCD初期化 */
void LcdInit(void){
LcdComand(FUNC1_SET); //8ビットバス・2LINE表示
LcdComand(FUNC2_SET); //拡張コマンド
LcdComand(INT_OSC); //内部周波数調整
LcdComand(CONST_SET); //コントラスト1
LcdComand(PWR_ICON_SET); //コントラスト2
LcdComand(FOLLOWER_SET); //フォロワー制御
LcdComand(FUNC1_SET); //拡張コマンドをオフ
DspClear();
LcdComand(DISP_ONOFF_SET);
delay(2000);
}
データシートの初期化の例に従ってコマンドを書き込んで初期化を行いますが、基本的に初期化の例の通りの値で問題ありません。
コントラスト設定を薄くしようとC5を0にしてみましたが文字が見えなくなるほど薄くなってしまったため変更の必要はないと感じています。Contrast Setに0x70、Power/ICON/Contrast controlを0x54をセットにしました。
ST7032のデータシートを確認するとI2C使用時のレイアウトではOPF1、OPF2は0とするためFonに1をセットすると内部フォロアが有効になります。コントラストは内部フォロアも関係するためFollower controlのRab0~Rab3の調整が有効なので、Follower controlに0x6Bをセットしました。
LCDに文字を表示
/* LCDに文字を表示 */
void LcdWriteData(uint8_t *data, uint8_t sz){
Wire.beginTransmission(SLAVE_ADRS);
Wire.write(0x40);
Wire.write(data, sz);
Wire.endTransmission();
}
//使用例
LcdWriteData( &initmoji[0][0], sizeof(initmoji[0])); //1段目の表示
LCDに文字を書き込むためLcdWriteData()関数を実装します。第1引数に表示したい文字を示すアドレス、第2引数にサイズを指定します。
initmojiの配列に表示したい文字を格納しているものとして使用例を示しています。第1引数にinitmojiの先頭アドレスを指定し、第2引数にinitmojiのデータ数を指定しています。

LcdWriteData()関数でスレーブアドレスをスタートで送信した後にcontrol byteを指定しますが2-line interface protocolに従って書き込みアドレスと文字データを指定します。
control byte以降に制御コードを書き込まないのでCoに0をセットしRSがHになるので0x40になります。R/WはW固定なのでLになります。
control byteの後に送信する文字をセットしてサイズ分書き込み、最後にSTOP状態の通知のためendTransmissionを送信します。
動作確認
BME280からSPIを使用してデータを取得してI2Cを使用してLCDに温湿度・気圧の情報を表示します。LCDの1段目に温度と湿度を表示し2段目に気圧を表示ます。
動作確認用の回路

電源を投入するとLCDに温度情報00.0、湿度情報50.0、気圧情報1000.0を表示するようにしています。LCDに文字が入りきらないので温度をT:湿度をH:気圧をP:と表現しています。電源投入から5秒経過すると測定結果が確定し各種データが表示されます。
以降は5秒経過毎にBME280からデータを取得してLCD表示を更新します。
動作結果

電源を投入から測定開始するまでにそれぞれの初期値を表示していますが、5秒後に温度と湿度及び気圧がLCDに表示できていることを確認しました。またシリアルモニタにも測定データを表示していますがLCDの表示と一致していることを確認しています。
ソースコード全体
ソースコードは記事作成時点において動作確認できていますが、使用しているライブラリの更新により動作が保証できなくなる可能性があります。また、ソースコードを使用したことによって生じた不利益などの一切の責任を負いかねます。参考資料としてお使いください。
リンクからZIPファイル形式のファイルをダウンロードし、任意の場所に展開していただくとテキストファイルが生成されます。
上記ソースコードのみでは動作しません。Seeeduino XIAOのSPIを使ってBME280のデータを取得で追加しているBME280APIをArudinoプロジェクトソースフォルダに追加する必要があります。
関連リンク
Arduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。
Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方
Seeeduino XIAOで学べるソフト開発と標準ライブラリの使い方
ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方
PR:アクセンチュアの転職なら【コンサルアクシスコンサルティング】
最後まで読んでいただきありがとうございました。
温度は室温計とほぼ同じでした。気圧はスマホで確認すると1003mBar[hPa]であったためそれなりに測定できていると思います。湿度についてはスマホの情報では68%とずれがありましたが屋外と屋内の差が出ているだろうという感じです。