こんにちは、ENGかぴです。
Arduinoとトワイライトを使ってBME280のセンサー情報をLCDに表示するシステムを作ることができます。各種モジュールの動作を確認しながら1つ1つの基礎技術を取得することで様々な応用範囲が広がり楽しさが倍増することは間違いありません。
LCDはQAPASS1602(スターターキットに付属)を使用しています。BME280モジュールはBME280 温湿度・気圧センサモジュール(I2C/SPI タイプ)(ストロベリー・リナックス)を使用しています。
Arduino UNOを対象としトワイライトは子機と親機を準備してArduinoには親機を接続します。子機は温湿度と気圧のデータを取得できるBME280を接続します。
Arduino UNOを使って動作確認を行ったことを下記リンクにまとめています。
Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方
トライライト(TWELITE)で動作確認したことについてまとめています。
トワイライト(TWELITE)のソフト開発と無線通信でできること
Arduinoとトワイライトの組み合わせの全体構成

親機と子機の全体構成ですが、子機はトワイライト(TWELITE)とBME280の組み合わせで親機はArduino UNOとトワイライトとLCDの組み合わせです。
- 子機のトワイライトでBME280のデータを取得して親機に無線通信する。
- 親機のトワイライトは子機からの無線データを受信する
- 親機のトワイライトからArduinoにデータをシリアル通信する
- LCDにデータを表示する
1~4までの項目について通信の流れに沿いながら各項目で説明していきます。
PR:わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!
トワイライトの子機

トワイライトを子機としてBME280からI2C通信を使って温度・気圧・湿度の情報を取得し親機にデータを送信する方法は下記記事にまとめています。
トワイライト(TWELITE)のI2C通信を実装し無線通信する
const char APP_FOURCHAR[] = "TEMP";
pack_bytes(pkt.get_payload(), make_pair(APP_FOURCHAR, 4)); //無線通信で文字ヘッダーをpayloadにセット
変更点は、親機と子機でアプリの文字コードを一致させるために文字ヘッダーを送信していることです。親機はアプリケーションIDとチャンネルが一致する場合受信判定になりますが、どの種別のデータなのかの判断ができないため文字ヘッダで区別します。
Arduinoとトワイライトの組み合わせによる親機

親機はArduinoとトワイライトを組み合わせた構成です。トワイライトは親機のソフトを書き込みます。子機が無線通信したデータをLCDに表示します。
SWを押すと温度→気圧→湿度→温度→・・と表示を切り替えて表示するようにします。Arduinoとトワイライトは電源電圧に差があるためR1とR2によってArduinoからトワイライトに向かう信号を分圧しています。
Arduinoはトワイライトの出力の3.3Vを受けてもHレベルと判定できるためArduinoのRXに直接信号を入力しています。
トワイライトの親機
トワイライトの親機は子機からデータを受信するとシリアル通信を使ってArduinoにデータを送信するようにします。
トワイライト(TWELITE)で親機を実装し子機から無線受信する
void receive() {
//子機から無線データを受けた場合先に文字ヘッダを格納し判定する
if (strncmp(APP_FOURCHAR, fourchars, 4)) {return; } //
expand_bytes(np,rx.get_payload().end(),rcvdata); //文字ヘッダー以下を格納
SerialTxSet(); //Arduinoに受信データをシリアル通信する
}
親機と子機の間でアプリケーションの判定をするため文字ヘッダによるデータの判別を行っています。strncmp()で文字ヘッダを比較して同一であれば残りのデータを受け入れる処理を行います。
子機を2台以上設置する場合は場合はどの子機から送信されたデータであるかアドレスを区別するようにしておく必要があります。(文字ヘッダに加えてアドレス番号を送信するようにするなど工夫する)
今回は1対1の通信なので区別はしていません。受信データを受け入れた後はArduinoにデータをシリアル通信を使って送信します。
トワイライト(TWELITE)とArduino間でシリアル通信する
Arduinoにデータをシリアル通信しますが、トワイライトのバイナリ通信の電文を使って送信するようにしています。Arduino側はトワイライトのバイナリ通信の電文に合致する場合に受信データとして受け入れるようにしています。
void RxDataChk(){
if( chkdat[0]== HEADER1 && chkdat[1]== HEADER2 && chkdat[2]== HEADER3 ){ //電文ヘッダーが一致するか
//受信データを受け入れる
rxdata.sum = CalcSum(&rxdata.buf[0],sz); //SUMの計算
if( rxdata.sum == rxdata.buf[sz]){//SUMのチェック
DataCng(); //センサーの情報をセット
}
}else{
//電文のヘッダーが不一致
}
}
HEADER1(0xA5)・HEADER2(0x5A)・HEADER3(0x80)として電文ヘッダが一致することを確認してから受信データを受け取りSUMが一致すると正常なデータとしてセンサーの情報としてセットするようにしています。
PR:(即戦力のスキルを身に着ける:DMM WEBCAMP 学習コース(はじめてのプログラミングコース))
ArduinoによるLCDの表示
Arduinoを使ったLCDの表示方法は下記リンクにまとめています。
const char disptbl[MD_MAX][COL_SZ]={
"Temperature ",
"Pressure ",
"Humidity "
};
void DispSet(){
lcd.clear();
lcd.setCursor(0, 0); //1段目の左端にカーソル
lcd.print(disptbl[dispmd]); //1段目の文字列
switch( dispmd ){
case MODE_NO::MD_NO1:
lcd.setCursor(0, 1); //2段目の左端にカーソル
lcd.print((double)temperature/100); //2段目の文字列を表示させる
lcd.print("[deg]");
break;
case MODE_NO::MD_NO2:
lcd.setCursor(0, 1); //2段目の左端にカーソル
lcd.print((double)pressure/10000); //2段目の文字列を表示される
lcd.print("[hPa]");
break;
case MODE_NO::MD_NO3:
lcd.setCursor(0, 1); //2段目の左端にカーソル
lcd.print((double)humidity/1024); //2段目の文字列を表示される
lcd.print("[%]");
break;
}
}
LCDの表示の1段目はボタンを押して確定した表示モードで表示を切り替えています。2段目は温度・気圧・湿度のデータが表示されるようにデータ値を換算してlcd.print()で表示するようにします。
今回の例ではLCD表示するセンサー情報の換算の頻度が多くなってしまいますが、全体の処理が少ないためLCDの表示の更新頻度(100msにしている)に対して余裕があると判断しています。
子機からのセンサー情報は設定したインターバルによるため毎回処理させる必要はなくインターバルが120秒であれば120秒に一回換算しておけば十分という考え方もできます。
動作確認

ライブラリの不具合で文字化けしてしまう場合があります。文字化けした場合はリセットする以外に復帰する方法がありませんでした。正常に表示できる場合は初期画面として電源を入れると最初に「Arduino&Twelite」とバージョン「Ver1.00」を表示します。
初期が終わると表示モード1としてTemperature(温度)が表示されます。ボタンを押すと表示モード2としてPressure(気圧)が表示されます。もう一度ボタンを押すと表示モード3としてHumidity(湿度)が表示されます。ボタンを押すと表示モード1に戻ります。
子機からデータを受信するまではすべてのデータは0になります。一度受信するとその値が表示され続けますが、子機からの受信が途絶えたと判断できるときは値をクリアするなど工夫してもよいかもしれません。(今回はそのまま表示しています。)
ソースコード全体
ソースコードは記事作成時点において動作確認できていますが、使用しているライブラリの更新により動作が保証できなくなる可能性があります。また、ソースコードを使用したことによって生じた不利益などの一切の責任を負いかねます。参考資料としてお使いください。
リンクからZIPファイル形式のファイルをダウンロードし、任意の場所に展開していただくとテキストファイルが生成されます。
TWELITEのソースコードはMWSTAGEの環境でアクトのソースファイルにコピーすると使用できます。
トワイライト(参考記事:Arduinoとトワイライトの組み合わせによる親機のリンク)
トワイライト(参考記事:トワイライトの子機のリンク)
関連リンク
Arduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。
Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方
Seeeduino XIAOで学べるソフト開発と標準ライブラリの使い方
ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方
また無線モジュールであるトワイライトを使ってソフト開発したことについてまとめています。
トワイライト(TWELITE)のソフト開発と無線通信でできること
広告
マイベスト3年連続1位を獲得した実績を持つ実践型のプログラミングスクール
最後まで、読んでいただきありがとうございました。