I2C (Arduino IDE + ESP ボードマネージャ)
はじめに
教育ボードに搭載されている液晶ディスプレイ (LCD) を使う.
プログラムの書き方
Arduino IDE のWire Library を参照して欲しい.
I2C で LCD や RTC と通信する際は, read や write の引数を通信相手先の都合に合わせる必要がある. そのためには各機器のデータシートを確認せねばならない.
プログラムの分割
教育ボードに搭載された LCD を扱うためのプログラムのソースは長いので, ファイルの分割を行う.
右上の ▼ アイコンを押せば, タブとして新たなファイルが追加される. 新たなタブのファイル名に拡張子を付けずに保存すると, 拡張子は .ino となる. .ino の場合には, #include は特に必要無い. .ino 同士は一緒にコンパイルされる.

プログラムの作成
LCD に最初の 10 秒間 "Hello!! from ESP" と表示させ, その後になんらかの文字列を繰り返し表示させるようにする.
lcd.ino
LCD 用のプログラム. データシートとプログラム中の注釈を参照のこと.
1 /*
2 * LCD AQM0802A-RN-GBW
3 *
4 * データシート: http://akizukidenshi.com/download/ds/xiamen/AQM0802.pdf
5 */
6
7 #define lcd_address **** //LCD AQM0802 の I2C アドレスの指定
8
9
10 int lcd_cmd(byte cmd) {
11 Wire.beginTransmission(lcd_address); //スレーブアドレスの指定. LCDのI2Cアドレス(7ビット) を指定し, LCDとの通信を開始. Wire.beginTransmission関数の引数は7ビットなので引数にRTCのI2Cアドレスを与えれば良い.
12 Wire.write( **** ); //コントロールバイトの指定. コマンドを送る1つ送る場合は....
13 Wire.write( cmd ); //コマンド (8bit)
14 return Wire.endTransmission(); //送信終了
15 }
16
17 int lcd_data(byte data) {
18 Wire.beginTransmission(lcd_address); //スレーブアドレスの指定. LCDのI2Cアドレス(7ビット)を指定し, RTCとの通信を開始.
19 Wire.write( **** ); //液晶に表示させるデータを 1 つ送る場合は....
20 Wire.write(data); //データバイト. 英数字の場合はアスキーコードに同じ.
21 return Wire.endTransmission(); //送信終了
22 }
23
24 void lcd_clear() {
25 lcd_cmd(****); //Clear Display
26 }
27
28 void lcd_home0() {
29 lcd_cmd(****); //Return Home
30 }
31
32 void lcd_home1() {
33 lcd_cursor(0,1); //2行目の先頭にカーソル移動(詳細はlcd_cursor関数のコメント参照)
34 }
35
36 void lcd_cursor(int x, int y){
37 //カーソル移動.コマンド8ビットのうち,8ビット目は常に1, 残り7ビットは液晶のDDRAMアドレス.
38 //DDRアドレスは, 1行目は 0x00 ~ 0x07, 2行目は 0x40~0x47.
39 //0x80とDDRAMアドレスの OR を取ることでコマンドを生成している.
40 byte ca = (x + y * 0x40) | (0x80);
41 lcd_cmd(ca);
42 }
43
44 void lcd_init() {
45 //初期化はデータシートの「初期設定例」をコピー.
46 delay(200);
47 lcd_cmd(****); delay(****); //Function set
48 ....
....
56 }
57
57
58 void lcd_print( String pdata) {
59 //引数で与えられた文字列の表示
60 int n = pdata.length();
61 for (int i = 0; i < n; i = i + 1) {
62 lcd_data(pdata.charAt(i)); //英数字を書くためのデータ = ascii
63 delay(1);
64 }
65 }
メイン関数
1 #include<Wire.h>
2
3 const int PIN_SDA = 21; //I2CのGPIO(SDA)ピン
4 const int PIN_SCL = 22; //I2CのGPIO(SCL)ピン
5 .... //必要な変数を定義
....
8
9 void setup() {
10 //I2C初期化
11 Wire.begin(PIN_SDA, PIN_SCL);
12
13 //LCD 初期化
14 lcd_init();
15
16 // 1 行目にカーソル移動 (1文字 字下げ)
17 lcd_cursor(1, 0);
18 // 1 行目の先頭に移動
19 //lcd_home0();
20
21 // 1 行目に表示
22 lcd_print("Hello!!");
23
24 // 2 行目にカーソル移動 (2文字 字下げ)
25 //lcd_cursor(2, 1);
26 // 2 行目の先頭に移動
27 lcd_home1();
28
29 // 2 行目に表示
30 lcd_print("from ESP");
31
32 //10秒待つ
33 delay(10000);
34
38 }
39
40 void loop() {
41
43 sec += 1
47
48 .....
.....
56 }
課題
上記のプログラムを完成させること.