●1602LCD でプログレスバーを作成する

なにかと値を表示するのに便利な1602LCDを使って、 進捗状況などを表示するプログレスバーのようなモノを作成してみたいと思います。
まずは、10%毎に1文字づつ増えていく単純なプログレスバーを作成しました。
#include <LiquidCrystal_I2C.h>

//アドレス0x27 16文字2行の液晶
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  lcd.init();
  lcd.backlight();
}

void loop() {
  static int i;
  if (i < 100) i++; else i = 0;
  bar(0, i);
  delay(500);
}

void bar(int line, int per) {
  char buff[17];
  sprintf(buff, "            %3d%%", per);
  for (int i = 0; i < (per / 10); i++) {
    buff[i] = 0xFF;
  }
  lcd.setCursor(0, line);
  lcd.print(buff);
}



値が10%増えるごとに、[ ■ ]文字が一つづつ増えてゆきます。


▼もっと細かく刻めるようにする下準備

単に1文字毎に進むバーでは面白くないので、もっと細かく刻んで表示したいと思います。

実現する方法として、バーを構成する文字を作成してLCDに登録し表示してみます。
詳しくは文字の作成にて。

#include <LiquidCrystal_I2C.h>

byte data_1[4][8] = {{
    0b00010000,
    0b00010000,
    0b00010000,
    0b00010000,
    0b00010000,
    0b00010000,
    0b00010000,
    0b00010000,
  }, {
    0b00011000,
    0b00011000,
    0b00011000,
    0b00011000,
    0b00011000,
    0b00011000,
    0b00011000,
    0b00011000,
  }, {
    0b00011100,
    0b00011100,
    0b00011100,
    0b00011100,
    0b00011100,
    0b00011100,
    0b00011100,
    0b00011100,
  }, {
    0b00011110,
    0b00011110,
    0b00011110,
    0b00011110,
    0b00011110,
    0b00011110,
    0b00011110,
    0b00011110,
  }
};

//アドレス0x27 16文字2行の液晶
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  lcd.init();
  lcd.createChar(0x00, data_1[0]);
  lcd.createChar(0x01, data_1[1]);
  lcd.createChar(0x02, data_1[2]);
  lcd.createChar(0x03, data_1[3]);
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.write(byte(0x00));
  lcd.write(byte(0x01));
  lcd.write(byte(0x02));
  lcd.write(byte(0x03));
  lcd.write(byte(0xFF));
}

void loop() {
}

必要となりそうな文字を作成して表示してみました。
実行するとこのようになります。



▼細かく刻むバーを作成する

上で作成した文字と、当初のプログラムを結合して細かく刻むバーを作成します。
#include <LiquidCrystal_I2C.h>

//アドレス0x27 16文字2行の液晶
LiquidCrystal_I2C lcd(0x27, 16, 2);

byte data_1[4][8] = {{
    0b00010000,
    0b00010000,
    0b00010000,
    0b00010000,
    0b00010000,
    0b00010000,
    0b00010000,
    0b00010000,
  }, {
    0b00011000,
    0b00011000,
    0b00011000,
    0b00011000,
    0b00011000,
    0b00011000,
    0b00011000,
    0b00011000,
  }, {
    0b00011100,
    0b00011100,
    0b00011100,
    0b00011100,
    0b00011100,
    0b00011100,
    0b00011100,
    0b00011100,
  }, {
    0b00011110,
    0b00011110,
    0b00011110,
    0b00011110,
    0b00011110,
    0b00011110,
    0b00011110,
    0b00011110,
  }
};

void setup() {
  lcd.init();
  lcd.createChar(0x01, data_1[0]);
  lcd.createChar(0x02, data_1[1]);
  lcd.createChar(0x03, data_1[2]);
  lcd.createChar(0x04, data_1[3]);
  lcd.backlight();
}

void loop() {
  static int i;
  if (i < 100) i++; else i = 0;
  bar(0, i);
  delay(500);
}

void bar(int line, int per) {
  int map[10] = {0x20, 0x20, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04};
  char buff[17];
  sprintf(buff, "            %3d%%", per);
  int i = 0;
  for (; i < (per / 10); i++) {
    buff[i] = 0xFF;
  }
  buff[i] = map[per % 10];

  lcd.setCursor(0, line);
  lcd.print(buff);
}

実行すると、2%値が動くごとにバーがちょっとずつ伸びていきます。
上のプログラムでは作成した文字を 0x01〜0x04の範囲に登録して表示していますが、当初は0x00のアドレスで登録して表示するようにしていました。
しかし、0x00を使うと手持ちのLCDではなぜだか表示に時間がかかり動きがぎこちなくなるので使用しないようにしています。



▲トップページ > マイコンなど