이전 튜토리얼에서 OLED는 5 핀을 사용하는 SPI 통신을 사용하여 ESP32와 인터페이스됩니다. 이 튜토리얼에서는 I2C 통신 의 도움으로 2 개의 핀만 사용하여 16x2 LCD를 ESP32와 인터페이스 합니다. ESP32에서 사용하는 핀 수를 줄여서 더 많은 수의 ESP32 핀이 서로 다른 센서를 인터페이스하는 데 사용할 수 있도록합니다.
I2C 통신 프로토콜이란?
I2C라는 용어는 “ Inter Integrated Circuits”를 의미 합니다. 일반적으로 IIC 또는 I 제곱 C 또는 일부 장소에서는 2 선 인터페이스 프로토콜 (TWI)로 표시되지만 모두 동일한 의미입니다. I2C는 동기식 통신 프로토콜로, 정보를 공유하는 두 장치가 공통 클록 신호를 공유해야 함을 의미합니다. 정보를 공유하기 위해 SDA와 SCL이라는 두 개의 와이어 만 있으며, 그중 SCL 은 클럭 신호 에 사용되고 SDA 는 데이터 송수신에 사용됩니다.
I2C1602 LCD 컨트롤러가 내장 된 I2C LCD 모듈을 구입하거나 간단히 I2C 컨트롤러를 구입하여 ESP32와 16x2 LCD를 인터페이스 할 수 있습니다.
필요한 재료
- ESP32
- 16 * 2 LCD 디스플레이
- I2C LCD 컨트롤러
- 전선
- 브레드 보드
I2C 모듈
I2C 컨트롤러에는 2- 와이어 양방향 I2C 버스 직렬 클럭 (SCL) 및 직렬 데이터 (SDA)를 통해 범용 원격 I / O 확장을 제공하는 IC PCF8574가 있습니다. 매우 유용한 IC이며 LED 사인 보드, 디스플레이, 키패드, 산업용 제어 등에 사용할 수 있습니다. I2C 버스 주소 및 SDA, SCL 핀에는 8 개의 I / O 핀, 3 개의 핀 (A0, A1, A2)이 있습니다..
LCD 컨트롤러 보드에는 LCD의 대비를 제어하는 전위차계가 내장되어 있습니다.
IC 및 LCD 컨트롤러의 핀 다이어그램은 다음과 같습니다.
회로도
LCD와 ESP32를 연결하기위한 연결 은 다음과 같습니다.
- I2C 모듈의 핀 1-16을 LCD 디스플레이의 핀 1-16에 연결합니다.
- I2C 모듈의 SDA 핀-> ESP32의 SDA 핀 즉 D21
- I2C 모듈의 SCL 핀-> ESP32의 SCL 핀 즉 D22
데모 용으로 3v의 ESP32를 I2C의 5v에 연결했지만, ESP32는 I2C 모듈에 대해 낮은 3.3V 만 제공 할 수 있고 데이터가 명확하게 표시되지 않기 때문에 I2C 모듈 이 데이터를 제대로 표시 하려면 5V 전원이 필요합니다. 따라서 외부 5V 전원을 사용하는 것이 좋습니다.
ESP32 용 보드 파일이 필요하므로 ESP32를 처음 사용하는 경우 먼저 ESP32 자습서 시작하기를 수행 한 다음 여기로 돌아갑니다. I2C없이 ESP32와 LCD를 연결할 수도 있지만 ESP32의 핀이 더 많이 필요합니다.
I2C 컨트롤러 주소를 찾기위한 코드
메인 코드로 들어가기 전에 먼저 I2C 모듈의 주소를 찾아야합니다.
I2C 컨트롤러에는 I2C 버스를 제어하는 데 사용되는 ADDRESS 비트가 내장되어 있습니다. 기본 ADDRESS는 0x27이지만 경우에 따라 0x3f 일 수 있습니다. 따라서 I2C 컨트롤러의 주소 를 확인하기 위해 위와 같이 회로를 연결하고 아래에 주어진 코드를 업로드하고 시리얼 모니터를 열면 16 진수로 주소가 표시됩니다.
#포함
LCD 인터페이스 코드 에서이 주소 를 사용 합니다.
I2C 컨트롤러에는 A0, A1 및 A2로 표시된 세 개의 점퍼 / 납땜 패드가 있습니다. 모듈의 주소를 변경하는 데 사용됩니다. 다음은 주소 패드를 함께 연결하는 경우 주소가 기본값 0x27 또는 0x3F에서 변경되는 방식입니다. (1 = 연결되지 않음. 0 = 연결됨):
A0 |
A1 |
A2 |
HEX 주소 |
1 |
1 |
1 |
0x27 |
0 |
1 |
1 |
0x26 |
1 |
0 |
1 |
0x25 |
0 |
0 |
1 |
0x24 |
1 |
1 |
0 |
0x23 |
0 |
1 |
0 |
0x22 |
1 |
0 |
0 |
0x21 |
0 |
0 |
0 |
0x20 |
ESP32 용 코드
먼저 I2C LCD 모듈 용 라이브러리 LiquidCrystal_I2C 가 필요 합니다. 여기서 I2C를 사용하고 있기 때문에 일반 Liquidcrsytal 라이브러리가 작동하지 않습니다.
이 https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library에서 라이브러리를 다운로드하십시오.
시리얼 모니터에 입력 한 내용이 LCD에 표시되도록 코드가 작성됩니다. Arduino IDE는 코드를 작성하고 업로드하는 데 사용되었습니다.
먼저 Arduino IDE 와 함께 제공되는 I2C 통신을위한 와이어 라이브러리 를 포함해야합니다 .
#포함
그런 다음 I2C LCD의 경우 이전에 다운로드 한 LiquidCrystal_I2C.h 를 포함 합니다.
#포함
그런 다음 LCD I2C 주소를 0x27 또는 16 자 2 줄 디스플레이에 대해 위에 제공된 스캐너 코드를 실행하여 얻은 주소로 설정합니다.
LiquidCrystal_I2C lcd (0x27, 16,2);
에서는 설정 기능, 문자 (16)가 2 선 직렬 통신을 초기화하고 LCD 백라이트를 켜. 백라이트를 끄려면 lcd .noBacklight ()를 사용하고 원하는대로 setCursor () 함수를 변경 하십시오.
void setup () { Serial.begin (9600); lcd.init (); lcd.backlight (); lcd.setCursor (0,0); lcd.print ("Hello, world!"); 지연 (1000); lcd.setCursor (0,1); lcd.print ("circuitdigest.com"); 지연 (3000);
LCD는 먼저 직렬 모니터 사용 지침 을 표시하고 표시 할 문자를 입력합니다.
Serial Monitor 옵션을 "No Line Ending"으로 설정합니다.
lcd.clear (); lcd.setCursor (0,0); lcd.print ("서버 모니터 사용"); lcd.setCursor (0,1); lcd.print ("표시 할 유형"); }
루프 함수는 Serial.available () 함수를 사용하여 직렬 포트에서 들어오는 직렬 데이터를 지속적으로 확인 합니다. 메시지가 있으면 1 초간 기다렸다가 LCD .write () 및 Serial.read () 함수를 사용하여 LCD 에 메시지를 인쇄합니다.
void loop () {{// 문자가 직렬 포트를 통해 도착할 때… if (Serial.available ()) {delay (100); // 전체 메시지가 도착할 때까지 잠시 기다립니다. lcd.clear (); // 화면 지우기 while (Serial.available ()> 0) {// 사용 가능한 모든 문자 읽기 lcd.write (Serial.read ()); // LCD에 각 문자 표시}}}}
Compete 코드 는 아래와 같으므로 코드를 업로드하고 시리얼 모니터를 엽니 다. 그런 다음 메시지를 입력하고 Enter 키를 누르면 LCD에 메시지가 표시됩니다.
LCD에 적절하지 않거나 응답이 없으면 I2C 컨트롤러 주소를 확인하거나 위의 주어진 코드로 다시 스캔 하여 올바른 주소를 얻으십시오.