1602 LCD直接繋ぐと、6つのデジタルポートを占有(4つデータワイヤ+2の制御ワイヤが必要)し、GPIOはたくさん消耗するので、i2cを利用すると2つのアナログポートが足りる。
下記のURLから、ライブラリを利用
https://github.com/agnunez/ESP8266-I2C-LCD1602
しかし、表示がない!
持っている他のUno, Nanaに試したら、ちゃんと表示した。
LCD address to 0x27も間違いない。
どうして?
* 1602 LCD Sample with LiquidCrystal_I2
* https://github.com/agnunez/ESP8266-I2C-LCD1602
* PCF8574-----1602LCD-----WeMos
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
lcd.begin(0,2); // sda=GPIO_0, scl=GPIO_2
// Print a message to the LCD.
lcd.print("hello, world!");
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
// print the number of seconds since reset:
lcd.print(millis() / 1000);
/*
* 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 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 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);
}
/*
* 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 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 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);
}
「未完成!!!」したまま、やはりきになる。
// * SDA —–D3(GPIO_0)
// * SCL —–D4(GPIO_2)
接続方法が間違った感じ!
いろいろなサイト参考して、とりあえず、下記の接続方法でうまくいけそう。
* SDA —–D1
* SCL —–D2
Pin out を調べたら、I2Cその一通りのみの感じでした。
WeMosでWireライブラリを使う場合、UNOやNANOと違って、
SDAとSCLのピンが固定されていないので、SDAとSCLに好きなピンを指定できた方が便利。しかしSDA=GPIO_4 SCL=GPIO_5に固定されるライブラリと任意していいのライブラリがあるので、使い分ける必要。
D3、D4は、GND、VCCの隣にあるので、この4個をまとめてI2Cに使いたい場合、SDAとSCLに好きなピン指定に対応するライブラリを使う必要ある。

i2c scannerのプログラムで、ちゃんと検出できた
Scanning...
I2C device found at address 0x27 !
I2C device found at address 0x77 !
done
接続を見直して、今度うまくいく!
* 1602 LCD Sample with LiquidCrystal_I2
* https://github.com/agnunez/ESP8266-I2C-LCD1602
* PCF8574-----1602LCD-----WeMos
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
lcd.begin(0,2); // sda=GPIO_0, scl=GPIO_2
// Turn on the backlight.
// Print a message to the LCD.
lcd.print("hello, world!");
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
// print the number of seconds since reset:
lcd.print(millis() / 1000);
/*
* 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 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
lcd.begin(0,2); // sda=GPIO_0, scl=GPIO_2
lcd.init();
// Turn on the backlight.
lcd.backlight();
// 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);
}
/*
* 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 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
lcd.begin(0,2); // sda=GPIO_0, scl=GPIO_2
lcd.init();
// Turn on the backlight.
lcd.backlight();
// 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);
}
おまけに、接続した気圧センサーのアドレスは0x77もわかった。
参考:
- https://www.losant.com/blog/how-to-connect-lcd-esp8266-nodemcu
- http://nopnop2002.webcrow.jp/WeMos/WeMos-24.html
Related