아두이노 우노 Q LCD I2C
이 튜토리얼은 Arduino UNO Q에서 LCD I2C 16x2 디스플레이를 사용하는 방법을 보여줍니다 — 기본 텍스트부터 커스텀 문자, 스크롤, Telegram 원격 제어까지.
- Arduino UNO Q에 LCD I2C를 연결하는 방법
- LCD의 두 행에 "Hello World" 텍스트를 표시하는 방법
- LCD에 텍스트, 정수, 실수, 16진수를 표시하는 방법
- LCD에 커스텀 문자를 생성하고 표시하는 방법
- LCD 디스플레이에 텍스트를 스크롤하는 방법
- LCD 백라이트를 제어하는 방법
- 커서 및 깜빡임 모드를 사용하는 방법
- Bridge 프로그래밍을 통해 Linux에서 LCD를 원격으로 제어하는 방법
- Bridge 프로그래밍을 통해 Telegram에서 LCD를 원격으로 제어하는 방법

필요한 하드웨어
| 1 | × | Arduino UNO Q | 아마존 | |
| 1 | × | USB Cable for Arduino Uno Q | 아마존 | |
| 1 | × | LCD I2C 16x2 | 쿠팡 | 아마존 | |
| 1 | × | (또는) LCD I2C 20x4 | 쿠팡 | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 우노용 스크루 터미널 블록 쉴드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) Sensors/Servo Expansion Shield for Arduino Uno | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 우노용 브레드보드 쉴드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 우노용 케이스 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 | 아마존 |
LCD I2C 16x2 정보
LCD I2C는 표준 16x2 LCD 패널과 I2C 백팩 모듈을 결합합니다. I2C 인터페이스를 사용하면 배선이 4개의 선만 필요하므로 병렬 LCD 연결보다 훨씬 간단합니다.
LCD 핀배치
LCD I2C에는 네 개의 핀이 있습니다:
- GND — GND에 연결
- VCC — 5V에 연결
- SDA — I2C 데이터 신호
- SCL — I2C 클록 신호

LCD 좌표
LCD I2C 16x2는 16개의 열과 2개의 행을 가지고 있으며, 열과 행은 0부터 시작하여 번호가 매겨집니다.

배선 다이어그램

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
| LCD I2C Pin | Arduino UNO Q Pin |
|---|---|
| GND | GND |
| VCC | 5V |
| SDA | SDA |
| SCL | SCL |
※ 주의:
LCD의 I2C 주소는 제조업체에 따라 다를 수 있습니다. 이 튜토리얼에서는 DIYables 모듈의 기본값인 0x27을 사용합니다.
LCD I2C를 프로그래밍하는 방법
DIYables_LCD_I2C 라이브러리를 사용하면 LCD를 쉽게 제어할 수 있습니다.
- 라이브러리 포함:
- I2C 주소, 열 개수, 행 개수로 LCD 객체 생성:
- setup()에서 LCD 초기화:
- 커서를 위치로 이동 (열, 행):
- 현재 커서 위치에 텍스트 출력:
스크롤, 커스텀 문자 등에 대해서는 "LCD로 더 많이 하기" 섹션을 참조하십시오.
※ 주의:
I2C 주소는 제조업체에 따라 다를 수 있습니다. DIYables에서 지정한 0x27을 사용합니다.
Arduino UNO Q 코드 — LCD I2C에서 Hello World
Arduino UNO Q에는 두 개의 프로세서가 있습니다: STM32 MCU (실시간 하드웨어 제어 담당)와 Qualcomm MPU (Debian Linux 실행). 이 섹션에서는 STM32 MCU만 프로그래밍되며, Linux 측은 유휴 상태입니다. 나중에 두 프로세서가 함께 작동하는 방법을 보여줍니다.
아래 스케치는 LCD의 두 행에 텍스트를 표시합니다.
빠른 단계
- 처음 Arduino UNO Q를 사용하시나요? 계속하기 전에 아두이노 우노 Q 시작하기 튜토리얼을 따라 개발 환경을 준비하십시오.
- LCD 배선: VCC→5V, GND→GND, SDA→SDA, SCL→SCL을 연결합니다.
- 연결: USB-C 케이블로 Arduino UNO Q를 컴퓨터에 연결합니다.
- Arduino App Lab 열기: Arduino App Lab을 시작하고 Arduino UNO Q를 감지할 때까지 기다립니다.
- 새 App 생성: Create New App 버튼을 클릭합니다.

- 예를 들어 DIYables_LCD_I2C 같은 앱 이름을 입력합니다.
- Create를 클릭하여 확인합니다.
- 새 App 내에 생성된 폴더 및 파일 세트가 표시됩니다.

- sketch/sketch.ino 파일을 찾습니다 — 이것이 MCU 스케치를 붙여넣을 곳입니다.
- Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.

- Search for Arduino_RouterBridge created by Arduino and click the Install button.
- Search for DIYables LCD I2C created by DIYables.io and click the Install button.
- 업로드: Arduino App Lab에서 Run 버튼을 클릭하여 STM32에 컴파일하고 업로드합니다.

LCD를 보면 — 행 0에 "Hello, World!"가 표시되고 행 1에 "Arduino UNO Q"가 표시됩니다!
※ 주의:
LCD에 아무것도 표시되지 않거나 검은색 정사각형만 표시되면 작은 드라이버를 사용하여 I2C 모듈 뒷면의 대비 포텐셔미터를 조정합니다. LCD I2C에서 문제 해결을(를) 참조하세요.
Arduino UNO Q 코드 — LCD I2C에 텍스트 및 숫자 표시
이 예제는 일반 텍스트 문자열, 정수, 실수, 16진수를 LCD에 표시하는 방법을 보여줍니다.
빠른 단계
- 위의 코드를 복사하여 sketch/sketch.ino에 붙여넣습니다.
- Arduino App Lab에서 Run 버튼을 클릭합니다.

LCD는 먼저 텍스트와 정수를 표시한 다음 3초 후에 지워지고 실수와 16진수를 표시합니다.
유용한 LCD 함수 참조
일반적으로 사용되는 DIYables_LCD_I2C 함수의 빠른 참조:
- lcd.init() — LCD 초기화
- lcd.backlight() — 백라이트 켜기
- lcd.noBacklight() — 백라이트 끄기
- lcd.setCursor(col, row) — 열 *col*, 행 *row*로 커서 이동 (둘 다 0부터 시작)
- lcd.print("text") — 현재 커서 위치에 문자열 출력
- lcd.print(number) — 정수 출력
- lcd.print(number, HEX) — 16진수로 정수 출력
- lcd.print(floatVal, decimals) — 지정된 소수 자릿수로 실수 출력
- lcd.clear() — 디스플레이를 지우고 커서를 (0, 0)으로 이동
- lcd.home() — 지우지 않고 커서를 (0, 0)으로 이동
- lcd.createChar(id, array) — 커스텀 문자 등록 (id 0–7)
- lcd.write((byte)id) — 등록된 커스텀 문자 표시
- lcd.scrollDisplayLeft() — 모든 내용을 한 열 왼쪽으로 이동
- lcd.scrollDisplayRight() — 모든 내용을 한 열 오른쪽으로 이동
- lcd.cursor() — 밑줄 커서 표시
- lcd.noCursor() — 커서 숨기기
- lcd.blink() — 깜빡이는 블록 커서 표시
- lcd.noBlink() — 깜빡이는 블록 커서 중지
Arduino UNO Q 코드 — LCD I2C의 커스텀 문자
lcd.print()는 ASCII 문자에만 작동합니다. 특수 기호(예: 하트, 화살표)를 표시하려면 8바이트 픽셀 데이터를 사용하여 커스텀 문자를 정의합니다. LCD 16x2 문자 셀은 8행 × 5열의 픽셀이며, 최대 8개의 커스텀 문자(ID 0–7)를 저장할 수 있습니다.
아래 문자 생성기를 사용하여 문자를 설계하고 이진 코드를 얻으십시오:
빠른 단계
- 위의 코드를 복사하여 sketch/sketch.ino에 붙여넣습니다.
- Arduino App Lab에서 Run 버튼을 클릭합니다.

LCD는 4개의 커스텀 기호를 표시합니다: 하트, 웃는 얼굴, 음표, 화살표 — 각 행마다 2개씩.
※ 주의:
고유한 문자를 설계하려면 LCD 커스텀 문자 생성기를 사용하십시오 — 픽셀 패턴을 그리고 코드에 사용할 바이트 배열을 출력할 수 있습니다. 위의 대화형 생성기를 사용할 수도 있습니다.
Arduino UNO Q 코드 — LCD I2C에서 텍스트 스크롤
scrollDisplayLeft()와 scrollDisplayRight()는 전체 디스플레이 콘텐츠를 호출당 한 열씩 이동합니다 — 두 행이 함께 이동합니다. 짧은 지연으로 루프를 사용하여 부드러운 스크롤 효과를 만듭니다.
빠른 단계
- 위의 코드를 복사하여 sketch/sketch.ino에 붙여넣습니다.
- Arduino App Lab에서 Run 버튼을 클릭합니다.

LCD 콘텐츠는 왼쪽으로 16칸 이동하고, 일시 중지한 후, 오른쪽으로 16칸 이동하여 원래 위치로 돌아옵니다.
Arduino UNO Q 코드 — LCD I2C에서 백라이트 제어
lcd.backlight()를 사용하여 I2C 백팩의 백라이트 LED를 켜고 lcd.noBacklight()를 사용하여 끕니다. 이 데모는 켜기 → 끄기 → 켜기 → 깜빡이기 패턴을 순환합니다.
빠른 단계
- 위의 코드를 복사하여 sketch/sketch.ino에 붙여넣습니다.
- Arduino App Lab에서 Run 버튼을 클릭합니다.

LCD 백라이트가 켜지고, 꺼지고, 다시 켜지고, 마지막으로 5번 깜빡입니다.
Arduino UNO Q 코드 — LCD I2C에서 커서 및 깜빡임
LCD는 두 가지 커서 스타일을 지원합니다: 밑줄 커서 (lcd.cursor())와 깜빡이는 블록 커서 (lcd.blink()). 둘 다 개별적으로 또는 함께 표시할 수 있습니다.
빠른 단계
- 위의 코드를 복사하여 sketch/sketch.ino에 붙여넣습니다.
- Arduino App Lab에서 Run 버튼을 클릭합니다.

LCD는 다음을 순환합니다: 밑줄 커서 표시 → 숨김 → 깜빡이는 블록 커서 → 중지됨 → 커서와 깜빡임 모두 → 모두 끄기.
LCD I2C에서 문제 해결
- LCD에 아무것도 표시되지 않음 / 백라이트 꺼짐 — VCC→5V 및 GND 확인. setup()에서 lcd.backlight() 호출 확인.
- LCD 양쪽 행에 검은색 정사각형 표시 — 대비가 너무 높게 설정되었습니다. I2C 백팩의 포텐셔미터를 돌려 대비를 줄입니다.
- LCD에 흐리거나 보이지 않는 텍스트 표시 — 대비가 너무 낮게 설정되었습니다. 포텐셔미터를 통해 증가시킵니다.
- 잘못된 문자 표시 — I2C 주소가 잘못되었을 수 있습니다. 0x27이 작동하지 않으면 0x3F를 시도하거나 I2C 스캐너 스케치를 실행하여 주소를 찾으십시오.
- 스케치는 업로드되지만 LCD는 공백 — SDA와 SCL 연결이 바뀌지 않았는지 다시 확인합니다.
Linux + MCU Bridge 프로그래밍
Arduino UNO Q에는 함께 작동하는 두 개의 프로세서가 있습니다: MPU (Qualcomm, Debian Linux 실행)와 MCU (STM32, Zephyr OS에서 Arduino 스케치 실행). 이들은 Arduino_RouterBridge 라이브러리를 사용하여 RPC를 통해 통신합니다 — 원시 직렬 포트를 통해 통신하지 않습니다.
- LCD는 MCU (STM32)에 연결됩니다 — I2C 버스 (SDA/SCL)를 통해. MCU만 LCD를 직접 구동할 수 있습니다.
- MPU는 LCD를 직접 제어할 수 없습니다 — Bridge.call("set_line1", "text")를 통해 MCU 함수를 호출하면 LCD를 업데이트하고 결과를 반환합니다.
- MPU는 Wi-Fi를 가지고 있습니다 — MPU가 전체 Debian Linux와 Wi-Fi를 실행하기 때문에 Telegram 명령을 받고 LCD에 모든 메시지를 표시할 수 있습니다.
- 통신: Linux 측의 Bridge.call()은 MCU 측의 Bridge.provide_safe() 함수를 호출합니다 (LCD 쓰기는 하드웨어 API 호출이므로).
- ⚠️ 예약됨: /dev/ttyHS1 (Linux) 및 Serial1 (MCU)는 Arduino Router에서 사용됩니다 — 직접 열면 안 됩니다.
요약하면: MPU가 Telegram을 통해 텍스트 전송 → MPU가 Bridge 호출 → MCU가 LCD 업데이트 → MCU가 결과를 MPU로 다시 보고.
MCU 스케치 — Bridge 및 Monitor 출력이 있는 LCD I2C:
Python 스크립트 (Arduino App Lab) — Linux에서 LCD에 텍스트 표시:
- 참고: MCU 스케치에서 Bridge.begin()이 호출되었는지 확인하고 Python 스크립트를 실행하기 전에 스케치를 업로드해야 합니다.
- ⚠️ 경고: /dev/ttyHS1 (Linux)을 직접 열거나 Serial1 (MCU)을 사용하면 안 됩니다 — Arduino Router에서 예약되어 있습니다.
빠른 단계
- 새 App 생성: Arduino App Lab을 열고 Create New App을 클릭하고, DIYables_LCD_I2C_Bridge 이름을 입력하고, Create을 클릭합니다.
- MCU 스케치 붙여넣기: 위의 Bridge MCU 코드를 복사하여 sketch/sketch.ino에 붙여넣습니다.
- Python 스크립트 붙여넣기: 위의 Python 코드를 App의 Python 파일에 붙여넣습니다.
- App 실행: Run 버튼을 클릭합니다 — Python 측이 몇 초마다 LCD를 업데이트합니다.
App Lab 콘솔 출력
Telegram 통합
Telegram을 통해 세계 어디에서나 LCD에 메시지를 전송합니다.
아직 Telegram 봇이 없다면 계속하기 전에 아두이노 우노 Q - 텔레그램 봇을 참조하여 봇 토큰을 가져오세요.
MCU 스케치: 이전 Bridge 섹션의 동일한 MCU 스케치 유지 — 변경할 사항 없음. STM32에 이미 업로드되고 실행 중인지 확인합니다.
Python 스크립트 (Arduino App Lab) — LCD를 제어하는 Telegram 봇:
- 참고: YOUR_BOT_TOKEN을 Telegram의 @BotFather에서 얻은 토큰으로 바꿉니다.
- /display Hello World 전송 — 텍스트가 LCD에 나타납니다.
- /clear 전송 — LCD 화면이 지워집니다.
- /status 전송 — 봇이 현재 LCD 콘텐츠로 응답합니다.
빠른 단계
- MCU 스케치 업로드: 이전 섹션의 Bridge MCU 스케치를 사용합니다 (아직 완료되지 않았으면 먼저 업로드).
- Telegram 스크립트 붙여넣기: 위의 Python 코드를 Arduino App Lab의 앱 Python 탭에 붙여넣습니다.
- 토큰 설정: 스크립트의 YOUR_BOT_TOKEN을 실제 봇 토큰으로 바꿉니다.
- App 실행: Run을 클릭합니다 — 봇이 Telegram 명령을 수신 대기하기 시작합니다.
- 테스트: /display Arduino UNO Q 전송 — LCD에 텍스트가 표시되어야 합니다. /clear를 전송하여 지웁니다.
App Lab 콘솔 출력
ArduinoBot
OpenClaw 통합
아두이노 우노 Q - OpenClaw 튜토리얼의 지침을 참고하여 이 튜토리얼에 OpenClaw를 적용할 수 있습니다.
애플리케이션/프로젝트 아이디어
- IoT 공지판: Telegram을 사용하여 근처의 컴퓨터가 없어도 벽의 LCD에 알림 발송
- 센서 대시보드: MPU 측에서 온도, 습도 또는 기타 센서 값을 실시간으로 LCD에 표시
- 도어 알람 디스플레이: 동작 센서가 트리거되면 LCD에 "MOTION DETECTED" 표시하고 Telegram 알림 전송
- Wi-Fi 날씨 스테이션: MPU에서 API의 날씨 데이터를 가져오고 LCD에 예보를 스크롤
- 카운트다운 타이머: Telegram을 통해 /timer 60 전송하면 LCD가 MCU 루프를 사용하여 초를 카운트다운
도전 과제
- 쉬움: Telegram 봇을 수정하여 /line1 <text>와 /line2 <text> 명령을 지원하여 각 LCD 행을 독립적으로 설정
- 중간: /scroll <text> 명령을 추가하여 긴 텍스트를 LCD 전체에 스크롤하도록 만들기 (루프에서 lcd.scrollDisplayLeft() 사용)
- 고급: LCD에 실시간 센서 데이터 (DHT22의 온도)를 표시하면서 동시에 비블로킹 업데이트 타이머를 사용하여 Telegram 명령에 응답 가능하게 유지