5.2 ESP32 LCD 주소 찾기 - sunbang123/Smart_device GitHub Wiki

I2C 통신은 마치 두 사람이 대화하는 것과 비슷함. 각각의 사람은 이름과 주소가 있고 이 이름과 주소를 통해 상대방과 통신을 할 수 있음.
- 컴퓨터에서도 각각의 장치들은 이름과 주소를 가지고 있음. I2C 통신에서는 이러한 이름과 주소를 사용하여 장치들 간에 통신함. I2C는 두 개의 신호선을 사용하는 통신방식으로, 마스터와 다수의 슬레이브로 구성되며 각각 개별 주소를 가지고 있음.
- 마스터는 기준 클럭(SCL)을 생성하고, 이 클럭에 맞춰 데이터(SDA)를 전송하고 수신함. 각 슬레이브는 해당 주소를 가진 디바이스만 응답하는 방식으로 서로 데이터를 주고 받음. Arduino와 LCD 모듈이 연결되어 있다면, Arduino는 LCD 모듈의 주소를 알고 있음.
- Arduino가 LCD 모듈에게 명령을 보낼 때, Arduino는 LCD 모듈의 주소를 사용하여 통신합함. LCD 모듈은 주소를 확인하고 명령을 수행함. 여러 개의 장치들이 하나의 버스를 공유하며 통신할 수 있고 I2C 통신은 두 장치 사이에 데이터를 전송하는 데에 사용되며, 한 번에 여러 개의 장치와 통신할 수 있음.
- 아두이노에서는 내장된 I2C 기능
- SDA 핀은 A4(아날로그 4번핀), SCL 핀은 A5(아날로그 5번핀)으로 설정되어 있음. 100kHz의 기준 클럭으로 작동함. Wire 라이브러리를 사용하면 I2C 통신을 쉽게 구현할 수 있음.
관련 함수 : begin(), beginTransmission(), write(), read(), requestFrom(), available(), onReceive(), onRequest(), endTransmission()
- 준비물 : LCD, ESP32, 브래드보드, 점퍼 4개

- 아두이노 라이브러리에서 LiquidCrystal by Arduino,Adafruit를 설치함.
- LCD에 연결한 점퍼(암-수)을 GND핀 - GND, VCC핀 - 5V, SDA핀 - PIN 21, SCL핀 - PIN 22에 연결함.
- 코드를 컴파일하고 아두이노 보드에 업로드하여 실행한 후, LCD 패널에 "Hello world"가 출력되는지 확인함.
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// set the LCD number of columns and rows
int lcdColumns = 16;
int lcdRows = 2;
// LCD 주소, 열 및 행 수 설정
// 표시 주소를 모를 경우 I2C 스캐너 스케치를 실행합니다
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial);
Serial.println("\nI2C Scanner");
// initialize LCD
lcd.init();
// turn on LCD backlight
lcd.backlight();
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
lcd.print("Scanning...");
delay(1000);
lcd.clear();
// lcd setCursor
// set cursor to first column, first row
lcd.setCursor(0, 0);
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
for(address = 1; address < 127; address++ )
{
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
lcd.setCursor(0,1);
lcd.print("0x");
if (address<16){
Serial.print("0");
lcd.print("0");
}
Serial.print(address,HEX);
Serial.println(" !");
lcd.print(address,HEX);
delay(2000);
lcd.clear();
nDevices++;
}
else if (error==4)
{
Serial.print("Unknow error at address 0x");
lcd.setCursor(0,1);
lcd.print("0x");
if (address<16) {
Serial.print("0");
lcd.print("0");
}
Serial.println(address,HEX);
lcd.print(address,HEX);
delay(2000);
lcd.clear();
}
}
}
-
LiquidCrystal_I2C.h 라이브러리를 포함함
-
LCD에 필요한 행 및 열 수를 정의함.
-
LiquidCrystal_I2C 객체를 생성하여 LCD의 I2C 주소와 크기를 설정함.
-
setup() 함수내부는 Wire 및 Serial 통신을 초기화하고, LCD를 초기화하고 백라이트를 켬
-
loop() 함수내부에서는 I2C 주소를 검색함. 검색된 디바이스의 수와 각 주소를 Serial 모니터 및 LCD에 출력함.
-
Wire.beginTransmission() 함수를 사용하여 주소를 전송하고, Wire.endTransmission() 함수를 사용하여 에러를 확인함.
-
에러가 발생하지 않은 경우, 디바이스를 찾은 것으로 간주하고 검색된 디바이스의 수를 증가시킴.
-
검색 중 에러가 발생한 경우, 에러 코드를 Serial 모니터 및 LCD에 출력함.
-
검색이 완료되면, Serial 모니터에 검색된 디바이스의 수가 표시됨.
KakaoTalk_20230421_185933208.mp4
- I2C 통신을 이용하여 연결된 모든 장치들의 주소를 스캔할 수 있음 -> 프로젝트를 구성하거나 문제 해결
- LiquidCrystal_I2C 라이브러리를 사용하여 I2C 통신을 이용하여 LCD 화면에 출력하는 방법을 배움 (I2C 통신과 LCD 화면 출력에 대한 이해)