WeMosを使ってみる

1602LCD+PCF8574


1602のLCDを使うときは定番のPCF8574(IOエクスパンダー)を使ってみます。
1602LCD+PCF8574を使う場合は、LiquidCrystal_I2Cライブラリと決まっているのですが、これがなかなか大変です。
「LiquidCrystal_I2C arduino」のキーワードでGitHubを検索したら16のrepositoryが見つかりました。
しかも、WeMosでWireライブラリを使う場合、UNOやNANOと違って、
SDAとSCLのピンが固定されていないので、SDAとSCLに好きなピンを指定できた方が便利です。
ESP8266のI2Cで使えるピンについてはこ ちらで詳しく紹介されています。(力作です)

SDA=GPIO_4 SCL=GPIO_5に固定されるライブラリ
void LiquidCrystal_I2C::begin() {
    Wire.begin();

SDA SCLに任意のピンを使えるライブラリ
void LiquidCrystal_I2C::begin(uint8_t sda, uint8_t scl) {
    Wire.begin(sda,scl);

色々探した結果、この ライブラリが該当することが分かりました。

LiquidCrystal_I2Cライブラリを使った時の、PCF8574とLCDの結線には、以下の2パターンあることが分かっています。

パターン1
LCD B/L RS RW EN D7 D6 D5 D4
PCF8574 P7 P6 P5 P4 P3 P3 P2 P0

パターン2
LCD D7 D6 D5 D4 B/L EN RW RS
PCF8574 P7 P6 P5 P4 P3 P2 P1 P0

ヘッダーファイル(LiquidCrystal_I2C.h)を確認しないと、どちらのパターンなのか分かりません。

#define LCD_BACKLIGHT 0x08
#define LCD_NOBACKLIGHT 0x00

#define En B00000100  // Enable bit
#define Rw B00000010  // Read/Write bit
#define Rs B00000001  // Register select bit

このライブラリはパターン2であることが分かりました。
ここまで調べて、ようやく結線は以下のようになります。
i2cのPullUp抵抗はなくても動くようです。



PCF8574に は PCF8574 と PCF8574A があります。
どちらも非常によく似たチップですが、i2cアドレスが違います。
PCF8574   address map 0x20-0x27
PCF8574A address map 0x38-0x3f

WeMosのスケッチは以下の通りです。
今回使用したのはPCF8574なので、i2cアドレスは0x20となります。

/*
 * 1602 LCD Sample with LiquidCrystal_I2
 * https://github.com/agnunez/ESP8266-I2C-LCD1602
 *
 * PCF8574-----1602LCD-----WeMos
 * A0                 -----GND
 * A1                 -----GND
 * A2                 -----GND
 * VSS                -----GND
 * P0     ----- RS
 * P1     ----- RW
 * P2     ----- EN
 * P3     ----- B/L
 * P4     ----- D4
 * P5     ----- D5
 * P6     ----- D6
 * P7     ----- D7
 * VDD                -----5V
 *
 * SDA                -----D3(GPIO_0)
 * SCL                -----D4(GPIO_2)
 *
 */
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x20 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x20, 16, 2);

void setup()
{
  lcd.begin(0,2);  // sda=GPIO_0, scl=GPIO_2
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop()
{
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}





一応、BackLightの制御もできるようですが、このページに よると、PCF8574の出力は25mAです。
手持ちのLCDだと(おそらく)電流不足でバックライトが点灯しませんでした。
そんな時は、以下のようにPCF8574のP3をBackLightの Cathode側(マイナス側)に接続することになります。
この場合、BackLightのON/OFFが逆転動作(ONで消灯、OFFで点灯)します。



以下のような反転回路を加えてやることでBackLightのON/OFFが正しく動くようになります。
使用したトランジスターは2SC1815L、抵抗は10Kオームです。



MQTTと組み合わせれば、色々なマシンからWeMosに表示できるようになります。

続く...