はじめに
文字表示器の第4回で回路の動作確認を、第7回で制御に必要な関数の紹介を行いました。
今回は今まで行ったことを組み合わせてシリアル通信で受信した文字列をキャラクタLCDに表示させます。
目次
1. 仕様検討
おおまかな仕様を考えます。
- キャラクタLCDはAQM0802(8文字×2行)を使用
- シリアル受信した文字列をLCDの1行目に表示
- LCDの2行目には前回受信した文字列を表示
- 文字数が8文字以上の場合はスクロール表示
- 例外処理(受信した文字数が非常に多い、非対応文字の受信など)は行わない
2. ハードウェア
回路は文字表示器の第4回で作成した回路と同じです。
図1 文字表示器回路図
図2 文字表示器基板
部品がいくつか実装されていますが、下部にあるのはBluetoothモジュールと周辺部品ですので文字表示器とは関係ありません。その内Bluetoothで受信した文字列を表示できるようにしたいと思っています。
これでハードウェアの実装は完成です。
3. ソフトウェア
作成したスケッチと簡単な説明を載せます。
- シリアル通信にて文字を受信すると、文字を表示する処理を行う
- できるだけ受信してから表示の間隔を短くするために、スクロール処理中はこまめに受信バッファをチェックしている
ソースコードを表示するには下記をクリックしてください。
/* シリアル通信によるキャラクタLCD制御 * * シリアル受信した文字列をキャラクタLCD AQM0802に表示する。 * 1行目には現在受信した文字列、2行目には前回受信した文字列を表示する。 * 文字数が8文字以上の場合はスクロールを行う * * 作成日:2016-02-26 作者:ぱなぺー http://play-arduino.seesaa.net/ */ #include <Wire.h> #include <ST7032.h> //作者:TOMO, Web:"オレ工房" http://ore-kb.net/archives/195 #include <string.h> ST7032 lcd; /* * str1, str2:1行目と2行目に表示する文字列 * n1, n2:str1とstr2の文字数 * n:スクロール回数 */ int i, n, n1=0, n2=0; char str1[30]="", str2[30]=""; void setup(){ //LCDとシリアル通信の初期化 lcd.begin(8, 2); lcd.setContrast(27); Serial.begin(9600); } void loop() { //シリアル受信した場合、1行目に今受信した文字列を、 //2行目に前回受信した文字列を表示 if (Serial.available()) { delay(100); //シリアル受信待機 //前回受信した文字列を2行目にコピー strcpy(str2, str1); n2=n1; //受信した文字列を読み込み、文字数をカウント i=0; while (Serial.available() > 0) { str1[i]=Serial.read(); i++; } str1[i]='\0'; n1=i; //スクロール回数の計算 if(n2 > n1){ n=n2-7; } else{ n=n1-7; } // LCD表示処理 lcd.clear(); lcd.home(); lcd.setCursor(0,0); lcd.print(str1); lcd.setCursor(0,1); lcd.print(str2); } // スクロール処理 if(0<n){ delay(1500); //スクロール開始時は1.5[sec]表示 for(i=0; i<n; i++){ //スクロール処理中にシリアル受信をした場合、スクロール処理を中断 if (Serial.available()) { break; } lcd.scrollDisplayLeft(); delay(500); //スクロール中は0.5[sec]表示 } //スクロールを先頭に戻す ※シリアル受信をした場合、スクロールを先頭に戻さない if(i==n){ delay(1000); //スクロール終了時は1.0[sec]表示 if (Serial.available()==0) { lcd.clear(); lcd.home(); lcd.setCursor(0,0); lcd.print(str1); lcd.setCursor(0,1); lcd.print(str2); } } } }
4. 動作確認
実際に動かしている動画です。文字数が8文字未満の場合はそのまま表示し、8文字以上の場合はスクロールしているのが分かると思います。
まとめ
これでシリアル通信にて受信した文字列をキャラクタLCDに表示することが出来ました。
次回はシリアル受信時の処理を割り込み処理で行うようにしたいと思います。
参考資料
- 作者名:TOMO. "I2C液晶のArduinoライブラリ - ST7032". サイト名:オレ工房. http://ore-kb.net/archives/195, (参照日:2016-02-26)
- 作者名:Arduino. "LiquidCrystal Library". サイト名:Arduino. https://www.arduino.cc/en/Reference/LiquidCrystal, (参照日:2016-02-26)
価格:2,646円 |