AQM1602は、16列×2行の文字を表示できるLCDモジュールです。今回は2024年10月現在の情報で、アルディーノでAQM1602の使いかたについていろいろ説明して行きたいと思います。
動作環境
- アルディーノIDE2.3.3最新版
- アルディーノ uno ,nano , megaTinyCore
- Windows11
接続図
今回はnanoを使って試してみましたので下図のように接続します。
ライブラリーを使う方法
まずライブラリー(ST7032_asukiaaa.h)を使って簡単に表示させてみたいと思います。
このライブラリーのインストール方法は私のこちらのブログに書かれておりますのでご確認ください。
サンプルプログラム
GitHubに載っていた、ライブラリーを使ったサンプルプログラムです。
#include <ST7032_asukiaaa.h>
ST7032_asukiaaa lcd(0x3E); // アドレスを指定しなくても動きます
//ST7032_asukiaaa lcd;
void setup() {
lcd.begin(16, 2); // LCD columns and rows.
lcd.setContrast(10);
// If lcd become black, reduced value for contrast
// lcd.setContrast(10);
lcd.print("hello, world!");
}
void loop() {
lcd.setCursor(0, 1);
lcd.print(millis()/1000);
}
実行すると下図のように液晶が表示されます。
このライブラリーはシンプルで非常に使いやすいのでこれが一番かもしれませんが、カタカナは表示できないようです。
ライブラリーを説明します
主に使う関数は下記の3つぐらいのようです。
● lcd.setCursor(0, 1); 表示させる行と列を指定します。
● lcd.print(“abcd”); 引数は、文字列、整数、float整数、などが使えるようです。
● lcd.clear();全画面をクリアします。
私は列を指定して全画面ではなく列をクリアする関数を一つ追加しておきました。
● rows_clear(0);引数にゼロを入れると1行目、1を入れると2行目がだけがクリアされます。
以下がそのプログラムです。
#include <ST7032_asukiaaa.h>
ST7032_asukiaaa lcd(0x3E); // アドレスを指定しなくても動きます
//ST7032_asukiaaa lcd;
void setup() {
lcd.begin(16, 2); // LCD columns and rows.
lcd.setContrast(10);
// If lcd become black, reduced value for contrast
// lcd.setContrast(10);
lcd.print("hello, world!");
}
void loop() {
lcd.setCursor(0, 1);
lcd.print(millis()/1000);
}
void rows_clear(int x) { // 追加した関数です
lcd.setCursor(0, x);
lcd.print(" ");
lcd.setCursor(0, x);
}
ライブラリーを使わず自分でプログラムする方法
私はardinoのプログラム(C++)にあまり詳しくありませんが、秋月秋月電子の使用説明書を参考に自分なりに作ってみました。
使い勝手はイマイチですが、メモリー消費が少なく、またカタカナを簡易的に表示できます。
表示できるのは、文字列、整数型の変数4桁までと、カタカナです。
#include <Wire.h>
#define LCD_ADRS 0x3E
int kana[] ={0,1,2,3,4};
char bc = "abcd";
int k=35;
void setup() {
Wire.begin();
init_LCD();
}
void loop() {
set_cursor(0, 0); // top
write_char("ABC", 3);
write_kana(kana, 5);
write_char(" ", 1);
write_num(k);
write_char(" ", 1);
write_num(789);
set_cursor(5, 1); // 2LINE 5
write_num(3479);
while(1){}//stop
}
//データ書き込み
void writeData(byte t_data)
{
Wire.beginTransmission(LCD_ADRS);
Wire.write(0x40);
Wire.write(t_data);
Wire.endTransmission();
delay(30);
}
//コマンド書き込み
void writeCommand(byte t_command)
{
Wire.beginTransmission(LCD_ADRS);
Wire.write(0x00);
Wire.write(t_command);
Wire.endTransmission();
delay(10);
}
//液晶初期化
void init_LCD() {
delay(100);
writeCommand(0x38);
delay(20);
writeCommand(0x39);
delay(20);
writeCommand(0x14);
delay(20);
writeCommand(0x73);
delay(20);
writeCommand(0x52);
delay(20);
writeCommand(0x6C);
delay(20);
writeCommand(0x38);
delay(20);
writeCommand(0x01);
delay(20);
writeCommand(0x0C);
delay(20);
}
void set_cursor(int x , int y) {
if (y == 0) {
writeCommand((x+0x40)+0x40);
}
if (y == 1) {
writeCommand((x+0x40)+0x80);
}
}
void lcd_clear() {
writeCommand(0x01);
}
void write_char( char x[] , int y) {
for(int i = 0; i < y; i++) {
writeData(x[i]);
}
}
void write_kana(int x[], int y) {
for (int i =0 ; i < y; i++) {
writeData(x[i]+0xb1);
}
}
void write_num(int x) {
if (x <10 ) {
writeData(x+0x30);
} else if (x <100) {
int c1 = x/10;
int c2 = x%10;
writeData(c1+0x30);
writeData(c2+0x30);
} else if ( x <1000) {
int c1 = x/100;
int cc = x%100;
int c2 =cc/10;
int c3 = cc%10;
writeData(c1+0x30);
writeData(c2+0x30);
writeData(c3+0x30);
} else if (x <10000) {
int c1 = x/1000;
int cc = x%1000;
int c2 =cc/100;
int cc2 = cc%100;
int c3 = cc2/10;
int c4 = cc2%10;
writeData(c1+0x30);
writeData(c2+0x30);
writeData(c3+0x30);
writeData(c4+0x30);
}
}
主な使いかたを説明します。
● set_cursor(0, 0); カーソルの行と列を指定します。
● lcd_clear(); 全画面をクリアします
● write_num(k); 4桁までの整数を指定できます。
● write_char(“ABC”, 3); 最初に文字列または文字変数、次にその文字列の長さを指定します。
私の知識では文字列の長さまで指定しないとうまく表示できませんでした。
● write_kana(kana, 5); カタカナを簡易的に表示させてみました。
表示させるのは下記のルールに従って表示させます。
アイウエオ・・・・ン アは0番目、イは1番目、ウは2番目・・・ンは45番目、のルールで
変数の配列で(インデックス)指定します。
アイウエオの場合は
int aiueo[ ] = {0,1,2,3,4}; 最後のン は45番目です。
write_kana(aiueo, 5); 引数は、aiueo 、次に文字数、2つでアイウエオが表示されます。
表示画像です
今回は以上です興味があった方は試してみてください。