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

실습 보고서

I2C

I2C 통신

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 주소 찾기 실습

  • 준비물 : LCD, ESP32, 브래드보드, 점퍼 4개

설계도

순서

  1. 아두이노 라이브러리에서 LiquidCrystal by Arduino,Adafruit를 설치함.
  2. LCD에 연결한 점퍼(암-수)을 GND핀 - GND, VCC핀 - 5V, SDA핀 - PIN 21, SCL핀 - PIN 22에 연결함.
  3. 코드를 컴파일하고 아두이노 보드에 업로드하여 실행한 후, 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 화면 출력에 대한 이해)
⚠️ **GitHub.com Fallback** ⚠️