記事

I2CインターフェースLCDモジュール用のライブラリを作る (2) 基本形を作成

 ライブラリにするソース・プログラムは、本サイトの次のページで作成したプログラムをそのままライブラリ化します。

  AQMシリーズのI2C接続LCDキャラクタ・ディスプレイを使う(1)
    http://www.denshi.club/make/2016/10/aqmi2clcd1.html

 その後、タイプの異なるI2CインターフェースLCDモジュールを同じライブラリで利用できるようにします。

ヘッダ・ファイル
 ヘッダ・ファイルは、次の内容で作成しました。#ifndef i2clcd_hはi2clcd_hが定義されているか検査します。初めてヘッダ・ファイルがインクルードされると、i2clcd_hは定義されていません。そのときは、次の#define i2clcd_hを実行しi2clcd_hを定義します。その後、最後の#endifまでの処理を実行します。重複してヘッダ・ファイルが読み込まれた場合はi2clcd_hが定義されているので、#ifndefから#endifまでの処理が実行されず重複が防げます。

#ifndef i2clcd_h
#define i2clcd_h
#include "Arduino.h" //Arduinoを利用するためのモジュールを読み込む
#define lcd_address 0x3E // I2Cデバイスのアドレス
#define CMD 0x00 // モジュールにコマンドを書き込む
#define D_DATA 0x40 // 表示データを書き込む
// ここまでが 定数などの定義
class i2clcd // ここからクラスの定義
{
public: // ライブラリ外からアクセスする関数などはpublicとして定義
i2clcd(byte adr); // 今回は使用していないが、I2Cデバイスのアドレスを指定する
int i2cwritecmd(byte cmd);
int i2cwritedata(byte data);
int i2cwritedsd(byte cltd, byte data);
void lcdcu_set(int x, int y);
void lcdclear();
void lcdhome();
void dsift_l();
void dsift_r();
void init_lcd();
void init_lcd2();
void i2cprint( String pdata);
private:
byte _addr;
};
#endif

 今回は、privateではコンテナの処理の中で実際のI2Cデバイスのアドレスを設定する _addr を定義しています。

メインのcppファイル

 
#include "i2clcd.h"
#include "Arduino.h"
#include "Wire.h" //ここまでで必要なヘッダ・ファイルを読み込む
// クラスからインスタンスを生成するためのコンテナの記述、インスタンスを生成後
// LCDモジュールのI2Cデバイスのアドレスを _addr に設定している
i2clcd::i2clcd(byte i2cadr) {
_addr = i2cadr;
}
// ここからはLCDモジュールの処理のための関数の記述
// それぞれの関数の前にi2clcd::を付記する
//  i2clcd::はこの関数がクラスi2clcdのメンバであることを示す
//  関数 i2cwritecmd(byte cmd_byte)はLCDモジュールにコマンドcmd_byteを書く
int i2clcd::i2cwritecmd(byte cmd_byte) {
Wire.beginTransmission(_addr);
Wire.write((byte)0x00);
Wire.write(cmd_byte);
return Wire.endTransmission();
}

//  関数i2cwritedata(byte data)は文字データ(data)表示のため書き込む
int i2clcd::i2cwritedata(byte data) {
Wire.beginTransmission(_addr);
Wire.write(0x40);
Wire.write(data);
return Wire.endTransmission();
}
// I2Cデバイスにコマンド、データの識別のcltdに従いdataを書き込む。上記の二つの
// 関数はこの関数を呼び出して処理を行っている。
int i2clcd::i2cwritedsd(byte cltd, byte data) {
Wire.beginTransmission(_addr);
Wire.write(cltd);
Wire.write(data);
return Wire.endTransmission();
}
// カーソルのセット関数
void i2clcd::lcdcu_set(int x, int y) {
byte ca = (x + y * 0x40) | (0x80); i2cwritecmd(ca);
}
// 表示のクリア関数
void i2clcd::lcdclear() {
i2cwritecmd(0x01); delay(1);
}
//次の文字の表示位置をホーム(上段、左端)にセット
void i2clcd::lcdhome() {
i2cwritecmd(0x02); delay(1);
}
void i2clcd::dsift_l() {
i2cwritecmd(0x1C);
}
void i2clcd::dsift_r() {
i2cwritecmd(0x18);
}
// LCDモジュールの初期化のプログラム(輝度調整なし)
void i2clcd::init_lcd() {
delay(145);
i2cwritecmd(0x38); delay(1);
i2cwritecmd(0x39); delay(1);
i2cwritecmd(0x14); delay(1);
i2cwritecmd(0x73); delay(1);
i2cwritecmd(0x56); delay(2);
i2cwritecmd(0x6C); delay(300);
i2cwritecmd(0x38); delay(1);
i2cwritecmd(0x01); delay(2);
i2cwritecmd(0x0C); delay(2);
}
// 輝度調整ありのLCDモジュール初期化プログラム
void i2clcd::init_lcd2() {
delay(145);
i2cwritedsd(CMD, 0x38); delay(1);
i2cwritedsd(CMD, 0x39); delay(1);
i2cwritedsd(CMD, 0x14); delay(1);
i2cwritedsd(CMD, 0x73); delay(1);
i2cwritedsd(CMD, 0x51); delay(2);
i2cwritedsd(CMD, 0x6C); delay(300);
i2cwritedsd(CMD, 0x38); delay(1);
i2cwritedsd(CMD, 0x01); delay(2);
i2cwritedsd(CMD, 0x0C); delay(2);
}
void i2clcd::i2cprint( String pdata) {
int n = pdata.length();
for (int i = 0; i < n; i = i + 1) {
i2cwritedsd(D_DATA, pdata.charAt(i));
delay(1);
}
}

テスト・プログラム
 このライブラリの動作確認を、次のスケッチで行いました。

#include <i2clcd.h>
#include <Wire.h>
int n = 0;
i2clcd lcd(0x3E);

void setup() {
Wire.begin();
lcd.init_lcd();
}
void loop() {
lcd.lcdclear();
n = n + 1;
lcd.i2cprint(String(n));
lcd.i2cprint(":");
delay(1500);
}


 このスケッチの実行の様子を次に示します。

 

 次回以降、LCDモジュールのタイプに応じた処理をライブラリのcppファイルの中で行います。また、ライブラリに作成した関数のテストをすべて行います。

(2017/9/25 V1.0)

(2017/10/9 V1.1)ヘッダーファイルの8行目 「class i2clcd: // ここからクラスの定義」コロン:をとる。cppファイルのコマンド送信を修正。

<神崎康宏>

Arduino I2CインターフェースLCDモジュール用のライブラリを作る

(1) ライブラリの構成

(2) 基本形を作成

(3) ライブラリ化(2)

(4) ライブラリ化(3)

(5) ライブラリ化(4)

(6) 機能の動作確認

(7) ライブラリ完成