아두이노 LCD 20x4
이 Arduino LCD 20x4 I2C 튜토리얼에서는 I2C 인터페이스를 통해 LCD 20x4(액정 디스플레이)를 Arduino 보드에 연결하는 방법을 배워보겠습니다.
준비물
| 1 | × | 아두이노 우노 R3 | 쿠팡 | 아마존 | |
| 1 | × | USB 2.0 타입 A-to-B 케이블 (USB-A PC용) | 쿠팡 | 아마존 | |
| 1 | × | USB 2.0 타입 C-to-B 케이블 (USB-C PC용) | 아마존 | |
| 1 | × | LCD 20x4 | 쿠팡 | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 우노용 스크루 터미널 블록 쉴드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) Sensors/Servo Expansion Shield for Arduino Uno | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 우노용 브레드보드 쉴드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 우노용 케이스 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 | 아마존 |
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
LCD I2C 20x4에 관하여
핀배열
LCD 20x4 I2C는 I2C 인터페이스를 사용하기 때문에 4개의 핀을 가지고 있습니다:
- GND 핀: GND(0V)에 연결해야 합니다.
- VCC 핀: LCD의 전원 공급 장치로, VCC(5V)에 연결해야 합니다.
- SDA 핀: I2C 데이터 신호
- SCL 핀: I2C 클록 신호

LCD 좌표
LCD I2C 20x4는 20열과 4행을 포함합니다. 열과 행은 0부터 인덱싱됩니다.

선연결

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
| LCD I2C | Arduino Uno, Nano | Arduino Mega |
|---|---|---|
| Vin | 5V | 5V |
| GND | GND | GND |
| SDA | A4 | 20 |
| SCL | A5 | 21 |
LCD I2C를 위한 프로그래밍 방법
DIYables_LCD_I2C 라이브러리 덕분에 LCD 사용이 식은 죽 먹기입니다.
- 라이브러리를 포함합니다:
#include <DIYables_LCD_I2C.h> // LCD를 위한 라이브러리
I2C 주소, 열의 수, 행의 수를 가진 DIYables_LCD_I2C 객체를 선언하십시오:
DIYables_LCD_I2C lcd(0x27, 20, 4); // I2C 주소 0x27, 20열 및 4행
LCD를 초기화하십시오.
lcd.init(); //lcd 초기화
lcd.backlight(); //백라이트 켜기
커서를 원하는 위치(열 인덱스, 행 인덱스)로 이동하세요.
lcd.setCursor(column_index, row_index);
LCD에 메시지를 출력합니다.
lcd.print("Hello World!");
※ 주의:
LCD의 I2C 주소는 제조업체에 따라 달라질 수 있습니다. 코드에서는 DIYables 제조업체가 지정한 0x27을 사용했습니다.
아두이노 코드
/*
* 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다
* 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/arduino/arduino-lcd-20x4
*/
#include <DIYables_LCD_I2C.h>
DIYables_LCD_I2C lcd(0x27, 20, 4); // I2C 주소 0x27, 20열 4행
void setup() {
lcd.init(); // lcd를 초기화합니다
lcd.backlight();
lcd.setCursor(0, 0); // 커서를 첫 번째 행으로 이동합니다
lcd.print("LCD 20x4"); // 첫 번째 행에 메시지를 출력합니다
lcd.setCursor(0, 1); // 커서를 두 번째 행으로 이동합니다
lcd.print("I2C Address: 0x27"); // 두 번째 행에 메시지를 출력합니다
lcd.setCursor(0, 2); // 커서를 세 번째 행으로 이동합니다
lcd.print("DIYables"); // 세 번째 행에 메시지를 출력합니다
lcd.setCursor(0, 3); // 커서를 네 번째 행으로 이동합니다
lcd.print("www.diyables.io"); // 네 번째 행에 메시지를 출력합니다
}
void loop() {
}
사용 방법
- Arduino IDE의 왼쪽 바에서 Libraries 아이콘으로 이동하세요.
- "DIYables LCD I2C"를 검색한 다음, DIYables가 작성한 DIYables_LCD_I2C 라이브러리를 찾으세요.
- DIYables_LCD_I2C 라이브러리를 설치하려면 Install 버튼을 클릭하세요.

- 위의 코드를 복사하고 Arduino IDE로 열기
- Arduino IDE에서 Upload 버튼을 클릭하여 Arduino에 코드를 업로드하십시오
- LCD에서 결과를 확인하십시오

텍스트와 위치를 수정해 보세요.
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.
아래 동영상 데모는 아래 코드를 사용합니다. 동영상은 Arduino Uno R4를 보여주지만 Arduino Uno R3에서도 동일하게 작동합니다:
/*
* 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다
* 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/arduino/arduino-lcd-20x4
*/
#include <Wire.h>
#include <DIYables_LCD_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
// ================= LCD =================
DIYables_LCD_I2C lcd(0x27, 20, 4);
// ================= RFID =================
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
// ================= SERVO =================
Servo doorServo;
#define SERVO_PIN 6
// ================= BUZZER =================
#define BUZZER 8
// ================= ADMIN UID =================
byte adminUID[4] = {0x3C, 0x7F, 0xB3, 0x02};
// ================= STATE =================
enum State { IDLE, SCANNING, GRANTED, DENIED, LOCKED };
State systemState = IDLE;
int failCount = 0;
unsigned long stateTime = 0;
unsigned long lockTime = 0;
// ================= SOUND =================
void beepOK() {
for (int i = 0; i < 2; i++) {
digitalWrite(BUZZER,HIGH);
delay(100);
digitalWrite(BUZZER,LOW);
delay(50);
}
}
void beepFail() {
for (int i = 0; i < 3; i++) {
digitalWrite(BUZZER,HIGH);
delay(150);
digitalWrite(BUZZER,LOW);
delay(80);
}
}
void beepLock() {
digitalWrite(BUZZER,HIGH);
delay(300);
digitalWrite(BUZZER,LOW);
}
// ================= DISPLAY IDLE =================
void showIdle() {
lcd.clear();
lcd.setCursor(0,0); lcd.print("SYSTEM READY");
lcd.setCursor(0,1); lcd.print("PLEASE SCAN CARD");
lcd.setCursor(0,2); lcd.print("DOOR: LOCKED");
lcd.setCursor(0,3); lcd.print("SECURITY: ACTIVE");
Serial.println("[STATE] IDLE");
systemState = IDLE;
}
// ================= DISPLAY SCANNING =================
void showScanning() {
lcd.clear();
lcd.setCursor(0,1);
lcd.print("SCANNING CARD...");
Serial.println("[STATE] SCANNING");
systemState = SCANNING;
}
// ================= GRANTED =================
void showGranted() {
lcd.clear();
lcd.setCursor(0,0); lcd.print("SYSTEM: GRANTED");
lcd.setCursor(0,1); lcd.print("USER: ADMIN");
lcd.setCursor(0,2); lcd.print("OPENING DOOR...");
lcd.setCursor(0,3); lcd.print("AUTO LOCK 3s");
doorServo.write(90);
beepOK();
stateTime = millis();
systemState = GRANTED;
Serial.println("[STATE] GRANTED");
}
// ================= DENIED =================
void showDenied(byte *uid) {
lcd.clear();
lcd.setCursor(0,0); lcd.print("SYSTEM: DENIED");
lcd.setCursor(0,1); lcd.print("UID: ");
for (byte i=0;i<4;i++) {
lcd.print(uid[i], HEX);
lcd.print(" ");
}
lcd.setCursor(0,2); lcd.print("ACCESS BLOCKED");
failCount++;
lcd.setCursor(0,3);
lcd.print("FAIL: ");
lcd.print(failCount);
lcd.print("/3");
beepFail();
stateTime = millis();
systemState = DENIED;
Serial.println("[STATE] DENIED");
}
// ================= CHECK UID =================
bool isAdmin(byte *uid) {
for (byte i=0;i<4;i++) {
if (uid[i] != adminUID[i]) return false;
}
return true;
}
// ================= LOCK SYSTEM =================
void lockSystem() {
systemState = LOCKED;
lcd.clear();
lcd.setCursor(0,1);
lcd.print("SYSTEM LOCKED!");
lcd.setCursor(0,2);
lcd.print("TOO MANY FAILS");
doorServo.write(0);
beepLock();
Serial.println("[STATE] LOCKED");
delay(3000);
failCount = 0;
showIdle();
}
// ================= SETUP =================
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
SPI.begin();
rfid.PCD_Init();
doorServo.attach(SERVO_PIN);
doorServo.write(0);
pinMode(BUZZER, OUTPUT);
showIdle();
}
// ================= LOOP =================
void loop() {
// LOCK CONDITION
if (failCount >= 3 && systemState != LOCKED) {
lockSystem();
return;
}
// AUTO BACK TO IDLE FROM DENIED
if (systemState == DENIED && millis() - stateTime > 2000) {
showIdle();
}
// AUTO CLOSE DOOR
if (systemState == GRANTED && millis() - stateTime > 3000) {
doorServo.write(0);
beepLock();
showIdle();
}
// RFID READ
if (!rfid.PICC_IsNewCardPresent()) return;
if (!rfid.PICC_ReadCardSerial()) return;
showScanning();
byte *uid = rfid.uid.uidByte;
Serial.print("UID: ");
for (byte i=0;i<rfid.uid.size;i++) {
Serial.print(uid[i], HEX);
Serial.print(" ");
}
Serial.println();
delay(300);
if (isAdmin(uid)) {
showGranted();
} else {
showDenied(uid);
}
rfid.PICC_HaltA();
}