1. 実験!
AE-AQM1602Aは16文字×2行の計32文字表示出来ます。
今回の実験では乱数を1秒毎に発生しLCD上に表示してみたいと思います。
1.1 接続
ピッチ変換基盤のお陰で接続は僅か4本と超お手軽です!
接続はI2C※1通信を使います。Arduino UNOをマスター※2として「5V(3.3Vでも可、若干プログラムの修正が必要)・A5・A4・GND」と、LCDモジュール(AE-AQM1602A)をスレーブ※2として「+V・SCL※2・SDA※2・GND」をそれぞれ接続すれば完了です。
図2:実際に作ったもの
以下補足です
※1:I2C
I2C(Inter-Integrated Circuit、アイ・スクエアド・シー)はフィリップス社で開発されたシリアルバスです。
※2:マスター・スレーブ・SDA・SCL
I2Cインターフェースは1対n(1以上)の同期式シリアル通信で、1がマスターでnがスレーブとなっています。※伝送距離は装置内程度と非常に短い。
I2Cは通信する相手のアドレスをデータとして送りスレーブとの通信(送受信)を確立します、つまりI2Cはマスターからアクションを起こさないとスレーブとは送受信が出来ません。
送受信に使う配線が1本(SDA)、マスターと同期を取る為に送信するクロック信号が1本(SCL)の計2本と、配線が少なくて済むのがI2C通信による最大のメリットです。
1.2 プログラム
//NOBのArduino日記!_AE-AQM1602Aの使い方_(20170307) //+V=5V,SCL=A5,SDA=A4,GND=GND #include <Wire.h> #define LCD_ADRS 0x3E //Slave address of LCD(Arduino ver.) String LCD_STRING; char s[16]; double SET; void writeCommand(byte t_command) { //コマンド書き込み Wire.beginTransmission(LCD_ADRS); Wire.write(0x00); Wire.write(t_command); Wire.endTransmission(); delay(10); } void writeData(byte t_data) { //データ書き込み Wire.beginTransmission(LCD_ADRS); Wire.write(0x40); Wire.write(t_data); Wire.endTransmission(); delay(1); } void LCD_DISP_16_1(void) { //上段の行にデータ書き込み for (int i = 0; i < 16; i++) { writeData(LCD_STRING[i]); } } void LCD_DISP_16_2(void) { //下段の行にデータ書き込み writeCommand(0x40 + 0x80); //確認する for (int i = 0; i < 16; i++) { writeData(LCD_STRING[i]); } } void setup() { Wire.begin(); delay(100); //液晶初期化 writeCommand(0x38); delay(20); // FUNCTION SET writeCommand(0x39); delay(20); // IS=1 writeCommand(0x14); delay(20); // INT OSC FREQUENCY writeCommand(0x7A); delay(20); //7faONTRAST SET0,1,2,3(3.3V=0x73,5V=0x7A) writeCommand(0x54); delay(20); // 54CONTRAST SET 4,5 (3.3V=0x56, 5V= 0x54) writeCommand(0x6C); delay(20); // F0LLOWER CONTROL writeCommand(0x38); delay(20); // IS=0 writeCommand(0x0C); delay(20); // Display ON writeCommand(0x01); delay(20); // Clear Display writeCommand(0x06); delay(20); } // Entry Mode void loop() { dtostrf(random(-10, 10), 5, 1, s); LCD_STRING = String(s); LCD_STRING = String("random:" + LCD_STRING + ""); writeCommand(0x01); // Clear Display LCD_DISP_16_1(); LCD_STRING = "NobArduinoDiary!"; LCD_DISP_16_2(); delay(1000); }
図1:プログラム例
1.3 実験!
図3:LCDに文字を表示!
2. まとめ
図3を見てお気づきかもしれませんが二行目が少しチカチカしてしまってます
原因は下の4行だと思うのですが、赤行で一旦画面を消して、次の緑行で行うLCD一行目の表示はすぐに行うので気付かないレベルになるのですが、青行の次の黄行は画面が消えて暫くしてからの書き込みになってしまいます。
結果として二行目は画面が消えている時間が長い為チカチカが目立ってしまったと思われます
writeCommand(0x01); // Clear Display
LCD_DISP_16_1();
LCD_STRING = "NobArduinoDiary!";
LCD_DISP_16_2();
全部一気に画面を消すのではなく部分的に文字を消すか上書きするか出来れば良いのですが、なかなかLCDコマンドの使い方が難解ですのでもう少し調べてみます
励みになりますのでよければクリック下さい(^o^)/