스마트 디바이스 실습 5.2주차

ESP32 LCD 주소 찾기

한세대학교 컴퓨터공학과 22학번 김선영


실습 보고서

실습 목차
  1. 온습도를 Serial Monitor에 출력하기
  2. LCD에 Hello world 출력하기
  3. 온습도를 LCD에 출력하기

I2C

I2C 통신
  1. I2C 통신은 마치 두 사람이 대화하는 것과 비슷함. 각각의 사람은 이름과 주소가 있고 이 이름과 주소를 통해 상대방과 통신을 할 수 있음.
  2. 마스터는 기준 클럭(SCL)을 생성하고, 이 클럭에 맞춰 데이터(SDA)를 전송하고 수신함. 각 슬레이브는 해당 주소를 가진 디바이스만 응답하는 방식으로 서로 데이터를 주고 받음. Arduino와 LCD 모듈이 연결되어 있다면, Arduino는 LCD 모듈의 주소를 알고 있음.

Arduino I2C
  1. 아두이노에서는 내장된 I2C 기능, SDA 핀은 A4(아날로그 4번핀), SCL 핀은 A5(아날로그 5번핀)으로 설정되어 있음. 100kHz의 기준 클럭으로 작동함. Wire 라이브러리를 사용하면 I2C 통신을 쉽게 구현할 수 있음.
  2. 관련 함수 : begin(), beginTransmission(), write(), read(), requestFrom(), available(), onReceive(), onRequest(), endTransmission()

LCD I2C
  1. Arduino가 LCD 모듈에게 명령을 보낼 때, Arduino는 LCD 모듈의 주소를 사용하여 통신합함. LCD 모듈은 주소를 확인하고 명령을 수행함. 여러 개의 장치들이 하나의 버스를 공유하며 통신할 수 있고 I2C 통신은 두 장치 사이에 데이터를 전송하는 데에 사용되며, 한 번에 여러 개의 장치와 통신할 수 있음.

실습 : 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(); 
        }    
        }
    }

                                    

코드 구성 요소
  1. LiquidCrystal_I2C.h 라이브러리를 포함함
  2. LCD에 필요한 행 및 열 수를 정의함.
  3. LiquidCrystal_I2C 객체를 생성하여 LCD의 I2C 주소와 크기를 설정함.
  4. setup() 함수 내부는 Wire 및 Serial 통신을 초기화하고, LCD를 초기화하고 백라이트를 켬
  5. loop() 함수 내부에서는 I2C 주소를 검색함. 검색된 디바이스의 수와 각 주소를 Serial 모니터 및 LCD에 출력함.
  6. Wire.beginTransmission() 함수를 사용하여 주소를 전송하고, Wire.endTransmission() 함수를 사용하여 에러를 확인함.
  7. 에러가 발생하지 않은 경우, 디바이스를 찾은 것으로 간주하고 검색된 디바이스의 수를 증가시킴.
  8. 검색 중 에러가 발생한 경우, 에러 코드를 Serial 모니터 및 LCD에 출력함.
  9. 검색이 완료되면, Serial 모니터에 검색된 디바이스의 수가 표시됨.

실행 결과


실습을 통해 느낀점

- I2C 통신을 이용하여 연결된 모든 장치들의 주소를 스캔할 수 있음 -> 프로젝트를 구성하거나 문제 해결

- LiquidCrystal_I2C 라이브러리를 사용하여 I2C 통신을 이용하여 LCD 화면에 출력하는 방법을 배움 (I2C 통신과 LCD 화면 출력에 대한 이해)


Previous   /   Next