I2C温度センサADT7410を使う(6) I2C-LCD接続 (9/30更新)

今回はI2C制御のLCD ACM1602を接続して、LCDへ温度を表示させます。次の写真は動作中の様子です。

pic130818_07

●接続例

ここでは、秋月電子で販売されているI2C制御のLCD ACM1602を接続してみました。
温度センサのSCLとSDAにLCDのSCLとSDAをそれぞれ並列に接続してあります。
LCDの端子部分に付いているアダプタ基板は筆者が製作した#310アダプタ基板です。この基板については次回別記事で説明しますが、LCDバックライトの電流制限用抵抗器とI2Cのプルアップ抵抗器、コントラスト調製用半固定抵抗器が1枚の基板に実装されているため、簡単にACM1602を接続できます。
この基板の詳細はこちら → WSN310 I2C-LCDアダプタ

pic130818_05

●AVR部(#282)単独使用例

ここではプログラム作動中はUSBは不要なので、CQガチャduinoのAVR部(#282)単独で作動させることができます。
次の写真はのUSB/電源部(#283)を外して、AVR部(#282)単独で作動させているところです。電源は右側のDCジャックから5Vを供給しています。

pic130818_06

●配線図 (9/30追加)

WSN310を使わずにACM1602を直接つなぐ場合の配線図を示します。センサ基板内のプルアップ抵抗を有効にする場合の配線図ですが、有効にしない場合はSCL、SDA両ラインを10kΩ程度の抵抗器で5Vにプルアップしてください。

c7410lcd

●制御プログラム

次にサンプルスケッチを示します。前回の16ビットのものをLCD用に変更しました。シリアル出力のものと対比しやすいように、シリアル処理関係はコメントアウトして残してあります。

//#define SLEEP
//#define ONESHOT
#define NORM
//#define SPS

#include <Wire.h>
#include <Display.h>   // wI2cLcdライブラリ

#define I2C_LCD_ACM1602  LCD_8BITMODE   // ACM1602
wI2cLcd lcd_acm(I2C_LCD_ACM1602);       // ACM1602 LCD インスタンス

int I2CAdrs;

// 初期化
void setup(void) {
  I2CAdrs = 0x48;

//  Serial.begin(19200);
  Wire.begin();                   // マスタ初期化
  lcd_acm.begin(16, 2, 0x50);     // I2C LCD スレーブアドレス

  lcd_acm.clear();                // LCD クリア
  lcd_acm.print("ACM1602 ADT7410");       // テスト表示

  delay(500);
//  lcd_acm.clear();                // LCD クリア

#ifdef NORM
  // ノーマル 約0.25mA
  Wire.beginTransmission(I2CAdrs);  // S.C発行,CB送信
  Wire.write(0x03);                 // Configuration register 選択
  Wire.write(0x00 | 0x80);          // SLEEP mode 設定 0110 0000
  Wire.endTransmission();           // ストップ・コンディション
#endif

#ifdef SPS
  // SPS
  Wire.beginTransmission(I2CAdrs);  // S.C発行,CB送信
  Wire.write(0x03);                 // Configuration register 選択
  Wire.write(0x40 | 0x80);          // one-shot mode 設定 0100 0000
  Wire.endTransmission();           // ストップ・コンディション
#endif

#ifdef SLEEP
  //  スリープ 約0.005mA
  Wire.beginTransmission(I2CAdrs);  // S.C発行,CB送信
  Wire.write(0x03);                 // Configuration register 選択
  Wire.write(0x60);                 // SLEEP mode 設定 0110 0000
  Wire.endTransmission();           // ストップ・コンディション
#endif

}

// メインループ
void loop(void) {
  uint16_t val;
  float tmp;
  long int ival;

#ifdef ONSHOT
  // ワンショット リトリガ再設定
  Wire.beginTransmission(I2CAdrs);  // S.C発行,CB送信
  Wire.write(0x03);                 // Configuration register 選択
  Wire.write(0x20 | 0x80);          // one-shot mode 設定
  Wire.endTransmission();           // ストップ・コンディション
  delay(240);
#endif

  Wire.requestFrom(I2CAdrs, 2);       // S.C発行,CB送信
  val = (uint16_t)Wire.read() << 8;   // データの読み出し(上位)
  val |= Wire.read();                 // データの読み出し(下位)

  ival = (long int)val;
  if(val & 0x8000) {         // 符号判定
    // 負数
    ival = ival - 65536;
  }

  tmp = (float)ival / 128.0;
//  Serial.println(tmp, 2);     // xx.xx

  lcd_acm.setCursor(0, 1);
  lcd_acm.print("Temp: ");
  lcd_acm.print(tmp, 2);

  delay(1000);
}

LCDの制御は筆者が作成したI2C-LCD用ライブラリ”wI2cLcd”を使用しています。このライブラリはLiquidCrystalとほぼ互換性があります。

9,10行目でI2C用LCDのインスタンスを作成しています。ここではインスタンス名は”lcd_acm”としています。20行目でLCDインタンスを初期化しています。引数は順に16文字、2行、I2Cスレーブアドレス0×50という意味です。

これ以降、LiquidCrystalと同じように使用できます。clear()やprint()、setCursor()などが同じように使えます。

表示に関しては80行目の”Seerial.println()…”をlcd_acm.print()…”に変更するだけですが、そのほかにカーソル位置の指定や文字列表示の処理を追加しています。


ここで使用したI2C-LCD用ライブラリ”wI2cLcd”は、書籍「Arduino実験キットで楽ちんマイコン開発」で紹介したものです。よろしければこちらもごらんください。なお、ライブラリはCQ出版のサポートサイトから無償でダウンロードできます。 

(一応完)

コメントは受け付けていません。