”「I2C LCD Breakout」を使ってみた” を整数対応にしてみた。

投稿者:

「I2C LCD Brakout」を使ってみた。という記事があるのですが、この記事を読んでくださった方から「文字だけじゃなくて、int型変数の中身も表示したい!」というお声をいただきました。と言うわけで、過去の記事のプログラムに少しだけ追記をしてみました。

追加したのは以下の関数です。

void lcd_printInt(int num)
{
  char int2str[10]; 
  sprintf(int2str,"%d",num);
  lcd_printStr(int2str);	
}

sprintf関数を使ってint変数の中身をchar配列に変えてるだけですね。

この関数を追加した全文が次のプログラムです。

#include <Wire.h>
 
#define vddPin 16    // ArduinoA2
#define gndPin 17    // ArduinoA3
#define sdaPin 18    // ArduinoA4
#define sclPin 19    // ArduinoA5
#define I2Cadr 0x3e  // 固定
byte contrast = 35;  // コントラスト(0~63)
 
void setup() {
  pinMode(gndPin, OUTPUT);
  digitalWrite(gndPin, LOW);
  pinMode(vddPin, OUTPUT);
  digitalWrite(vddPin, HIGH);
  delay(500);
  Wire.begin();
  lcd_cmd(0b00111000); // function set
  lcd_cmd(0b00111001); // function set
  lcd_cmd(0b00000100); // EntryModeSet
  lcd_cmd(0b00010100); // interval osc
  lcd_cmd(0b01110000 | (contrast & 0xF)); // contrast Low
  lcd_cmd(0b01011100 | ((contrast >> 4) & 0x3)); // contast High/icon/power
  lcd_cmd(0b01101100); // follower control
  delay(200);
  lcd_cmd(0b00111000); // function set
  lcd_cmd(0b00001100); // Display On
  lcd_cmd(0b00000001); // Clear Display
  delay(2);
}
 
void loop() {
  static int count = 0;
 lcd_clear();
  lcd_setCursor(0, 0);
  lcd_printStr("SWITCH");
  lcd_setCursor(1, 1);
  lcd_printInt(count);
  delay(1000);
  count++;
}

void lcd_cmd(byte x) {
  Wire.beginTransmission(I2Cadr);
  Wire.write(0b00000000); // CO = 0,RS = 0
  Wire.write(x);
  Wire.endTransmission();
}
 
void lcd_clear()
{
  lcd_cmd(0b00000001);
}

void lcd_contdata(byte x) {
  Wire.write(0b11000000); // CO = 1, RS = 1
  Wire.write(x);
}
 
void lcd_lastdata(byte x) {
  Wire.write(0b01000000); // CO = 0, RS = 1
  Wire.write(x);
}
 
// 文字の表示
void lcd_printStr(const char *s) {
  Wire.beginTransmission(I2Cadr);
  while (*s) {
    if (*(s + 1)) {
      lcd_contdata(*s);
    } else {
      lcd_lastdata(*s);
    }
    s++;
  }
  Wire.endTransmission();
}
 
// 表示位置の指定
void lcd_setCursor(byte x, byte y) {
  lcd_cmd(0x80 | (y * 0x40 + x));
}

void lcd_printInt(int num)
{
  char int2str[10];
  sprintf(int2str,"%d",num);
  lcd_printStr(int2str);	
}

このプログラムを実行すると1秒ごとに数値がカウントアップしている様子がLCDで確認できると思います。
一応「int型の変数の中身を表示したい!」というお声には答えられたかと思いますが、おそらくこのままでは「やりたいこととちょっと違う」という事態になるかもしれません。
そんな時は追加した関数をちょこっといじれば、目的の形になると思いますのでぜひ挑戦してみて下さい。