아두이노 우노 Q 버튼으로 LED 제어

이 튜토리얼에서는 Arduino UNO Q에서 버튼을 사용하여 LED를 제어하는 방법을 보여줍니다. 두 가지 응용 프로그램이 다루어집니다:

응용 프로그램 1 — LED는 버튼 상태를 따릅니다:

응용 프로그램 2 — 각 누름에서 LED가 토글됩니다:

Arduino UNO Q - 버튼으로 LED 제어

필요한 하드웨어

1×Arduino UNO Q 아마존
1×USB Cable for Arduino Uno Q 아마존
1×캡이 있는 버튼 쿠팡 | 아마존
1×(또는) Panel-mount Push Button 아마존
1×푸시 버튼 모듈 아마존
1×LED 쿠팡 | 아마존
1×LED Module 아마존
1×220 ohm Resistor 아마존
1×브레드보드 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) 아두이노 우노용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) Sensors/Servo Expansion Shield for Arduino Uno 쿠팡 | 아마존
1×(추천) 아두이노 우노용 브레드보드 쉴드 쿠팡 | 아마존
1×(추천) 아두이노 우노용 케이스 쿠팡 | 아마존
1×(추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

배선도

Arduino UNO Q 버튼 LED 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

응용 프로그램 1 — LED는 버튼 상태를 따릅니다

MCU 코드

Arduino UNO Q에는 두 개의 프로세서가 있습니다: STM32 MCU (실시간 하드웨어 제어) 및 Qualcomm MPU (Debian Linux 실행). 이 섹션에서는 STM32 MCU만 프로그래밍됩니다. Linux 측은 유휴 상태입니다. 나중 섹션에서는 두 프로세서가 함께 작동하는 방법을 보여줍니다.

버튼이 눌러지면 (LOW), LED가 켜집니다. 놓아지면 (HIGH), LED가 꺼집니다:

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-button-led */ #define BUTTON_PIN 7 // pin connected to the button #define LED_PIN 3 // pin connected to the LED void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); // set pin to input pull-up mode pinMode(LED_PIN, OUTPUT); // set pin to output mode } void loop() { int buttonState = digitalRead(BUTTON_PIN); // read button state if (buttonState == LOW) { digitalWrite(LED_PIN, HIGH); // button pressed → LED on } else { digitalWrite(LED_PIN, LOW); // button released → LED off } }

빠른 단계

  • Arduino UNO Q를 처음 사용하세요? 계속하기 전에 아두이노 우노 Q 시작하기 튜토리얼을 따라 개발 환경을 준비하세요.
  • 구성 요소를 배선합니다: 배선도에 따라 버튼을 핀 7에, LED (220 Ω 저항 포함)를 핀 3에 연결합니다.
  • 연결: Arduino UNO Q를 USB-C 케이블로 컴퓨터에 연결합니다.
  • Arduino App Lab 열기: Arduino App Lab을 시작하고 Arduino UNO Q를 감지할 때까지 기다립니다.
  • 새 앱 만들기: 새 앱 만들기 버튼을 클릭합니다.
Arduino UNO Q의 아두이노 app lab에서 새 앱 만들기
  • 앱에 이름을 지정합니다 (예: DIYables_ButtonLED).
  • 만들기를 클릭하여 확인합니다.
  • 새 앱 내에서 생성된 폴더 및 파일 집합이 표시됩니다.
Arduino UNO Q의 아두이노 app lab 앱 폴더 및 파일
  • sketch/sketch.ino 파일을 찾습니다. 이것이 MCU 스케치를 붙여넣을 위치입니다.
  • 스케치를 붙여넣습니다: 위의 MCU 코드를 복사하여 스케치 파일에 붙여넣습니다. 다른 파일은 기본값으로 유지합니다.
  • 업로드: Arduino App Lab에서 실행 버튼을 클릭하여 STM32에 컴파일하고 업로드합니다.
  • Arduino UNO Q의 아두이노 app lab에서 실행 버튼 클릭
    • 버튼을 누르고 있습니다 — LED가 켜져야 합니다. 놓으세요 — LED가 꺼져야 합니다.

    응용 프로그램 2 — 각 버튼 누름에서 LED 토글

    MCU 코드 — 디바운스 없음

    이 버전은 HIGHLOW 전환을 감지하고 LED를 토글합니다. 디바운스 없이 빠른 접점 바운싱은 누름당 여러 토글을 일으킬 수 있습니다:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-button-led */ #define BUTTON_PIN 7 // pin connected to the button #define LED_PIN 3 // pin connected to the LED int led_state = LOW; int button_state; int prev_button_state; void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); // set pin to input pull-up mode pinMode(LED_PIN, OUTPUT); // set pin to output mode button_state = digitalRead(BUTTON_PIN); } void loop() { prev_button_state = button_state; button_state = digitalRead(BUTTON_PIN); // read new state if (prev_button_state == HIGH && button_state == LOW) { // button just pressed — toggle LED led_state = !led_state; digitalWrite(LED_PIN, led_state); } }

    빠른 단계

    • 응용 프로그램 1에서 같은 배선과 앱을 사용합니다.
    • 스케치를 위의 코드로 바꾸고 실행을 클릭합니다.
    • 버튼을 여러 번 누르고 놓습니다 — LED가 매번 토글되어야 합니다.
    • 부정확한 동작 (이중 토글)을 볼 수 있습니다 — 이것은 버튼 바운싱으로 인한 것입니다.

    MCU 코드 — 디바운스 포함 (ezButton 사용)

    ezButton 라이브러리는 디바운싱을 자동으로 처리합니다 — 각 버튼 누름은 정확히 하나의 isPressed() 이벤트를 트리거합니다:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-button-led */ #include <ezButton.h> #define BUTTON_PIN 7 // pin connected to the button #define LED_PIN 3 // pin connected to the LED ezButton button(BUTTON_PIN); // create ezButton object attached to pin 7 int led_state = LOW; void setup() { pinMode(LED_PIN, OUTPUT); button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first if (button.isPressed()) { // toggle LED state led_state = !led_state; digitalWrite(LED_PIN, led_state); } }

    빠른 단계

    • 위에서 같은 배선과 앱을 사용합니다.
    • 스케치를 디바운스 버전으로 바꾸고 실행을 클릭합니다.
    • Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.
    add sketch 라이브러리 in 아두이노 app lab on Arduino UNO Q
    • Search for ezButton created by ArduinoGetStarted.com and click the Install button.
    My Apps / DIYables Apps
    Run
    Bricks
    No bricks added...
    Sketch Libraries
    No sketch libra...
    Files
    python
    sketch
    .gitignore
    README.md
    app.yaml
    sketch.ino
    Add sketch library
    ezButton ArduinoGetStarted.com

    Button library supports debounce, pressed/released events and the press counting. It is easy to use with multiple buttons. The library can be used for push-button, momentary switches, toggle switch, magnetic contact switch (door sensor)... It is designed for not only beginners but also experienced users.

    1.0.6
    Install
    More Info
    • Search for Arduino_RouterBridge created by Arduino and click the Install button.
    My Apps / DIYables Apps
    Run
    Bricks
    No bricks added...
    Sketch Libraries
    No sketch libra...
    Files
    python
    sketch
    .gitignore
    README.md
    app.yaml
    sketch.ino
    Add sketch library
    Arduino_RouterBridge Arduino

    This library provides a simple RPC bridge for Arduino UNO Q boards, allowing communication between the board and other devices using MsgPack serialization.

    0.4.1
    Install
    More Info
    • 버튼을 여러 번 누르고 놓습니다 — LED는 이제 누름당 정확히 한 번 토글됩니다.

    Linux + MCU Bridge 프로그래밍

    Arduino UNO Q에는 함께 작동하는 두 개의 프로세서가 있습니다: MPU (Qualcomm, Debian Linux 실행) 및 MCU (STM32, Zephyr OS로 Arduino 스케치 실행). 그들은 Arduino_RouterBridge 라이브러리를 통해 RPC를 사용하여 통신합니다. 절대 원본 시리얼 포트를 통해 통신하지 않습니다.

    • 버튼 및 LED는 MCU (STM32)에 연결됩니다 — 버튼은 디지털 입력 핀에, LED는 STM32의 디지털 출력 핀에 배선됩니다. MCU는 토글 논리 및 ezButton을 사용한 디바운싱을 처리합니다.
    • MPU는 버튼을 읽거나 LED를 직접 제어할 수 없습니다Bridge.call()을 통해 MCU에서 LED 상태를 요청해야 합니다.
    • MPU는 Wi-Fi입니다 — MPU가 Wi-Fi가 있는 전체 Debian Linux를 실행하기 때문에 Telegram을 통해 LED 상태를 보고할 수 있습니다.
    • 통신: Linux 측의 Bridge.call()은 MCU 측의 Bridge.provide() 함수를 호출합니다
    • ⚠️ 예약됨: /dev/ttyHS1 (Linux) 및 Serial1 (MCU)는 Arduino Router에서 사용합니다 — 절대 직접 열지 마십시오

    요약하면: MPU가 LED 상태를 요청 → MCU가 현재 상태를 읽음 → MCU가 ON 또는 OFF를 보고 → MPU가 기록하거나 전달합니다.

    MCU 스케치 — Bridge 및 Monitor 출력이 있는 버튼-LED 토글:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-button-led */ #include "Arduino_RouterBridge.h" #include <ezButton.h> #define BUTTON_PIN 7 #define LED_PIN 3 ezButton button(BUTTON_PIN); int led_state = LOW; void get_led_state() { Monitor.println(led_state == HIGH ? "LED: ON" : "LED: OFF"); } void setup() { pinMode(LED_PIN, OUTPUT); button.setDebounceTime(50); Bridge.begin(); Monitor.begin(); Bridge.provide("get_led_state", get_led_state); Monitor.println("Button-LED Bridge ready"); } void loop() { button.loop(); if (button.isPressed()) { led_state = !led_state; digitalWrite(LED_PIN, led_state); Monitor.println(led_state == HIGH ? "Button pressed → LED ON" : "Button pressed → LED OFF"); } }

    Python 스크립트 (Arduino App Lab) — Linux에서 LED 상태 폴링:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-button-led */ from arduino.app_utils import * import time def loop(): while True: state = Bridge.call("get_led_state") print(f"LED state: {state}") time.sleep(3) App.run(user_loop=loop)
    • 참고: Bridge.begin()이 MCU 스케치에서 호출되는지 확인하고 Linux 측에서 Python 스크립트를 실행하기 전에 스케치가 업로드되었는지 확인합니다.
    • ⚠️ 경고: Linux에서 /dev/ttyHS1을 직접 열거나 MCU에서 Serial1을 사용하지 마십시오 — 이들은 Arduino Router에서 예약되어 있으며 액세스하면 Bridge가 손상됩니다.

    빠른 단계

    • MCU 스케치 업로드: Arduino App Lab을 열고, 새 앱을 만들고, Bridge MCU 스케치를 위의 sketch/sketch.ino에 붙여넣고, ezButtonArduino_RouterBridge 라이브러리를 설치하고, 실행을 클릭합니다.
    • Python 스크립트 추가: 위의 Python 코드를 같은 앱의 Python 탭에 붙여넣습니다.
    • 앱 실행: 실행을 클릭합니다 — Python 측이 3초마다 LED 상태를 폴링합니다.
    • 버튼을 여러 번 누릅니다 LED를 토글합니다.
    • 콘솔 확인: 콘솔 탭을 열고 → MCU Monitor 서브탭으로 실시간으로 토글 이벤트가 기록되는 것을 확인합니다.

    App Lab 콘솔 출력

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    Message (Enter to send a message to "Newbiely" on usb(2820070321))
    New Line
    9600 baud
    Button-LED Bridge ready Button pressed → LED ON Button pressed → LED OFF Button pressed → LED ON

    Telegram 통합

    Telegram을 통해 어디에서나 현재 LED 상태를 원격으로 확인합니다.

    아직 Telegram 봇이 없으면 계속하기 전에 아두이노 우노 Q - 텔레그램 봇을 참고하여 봇 토큰을 획득합니다.

    MCU 스케치: 이전 Bridge 섹션의 같은 MCU 스케치를 유지합니다 — 변경 필요 없음. STM32에 이미 업로드되어 있고 실행 중인지 확인합니다.

    Python 스크립트 (Arduino App Lab) — LED 상태용 Telegram 봇:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-button-led */ from arduino.app_utils import * import requests import time BOT_TOKEN = "YOUR_BOT_TOKEN" API_URL = f"https://api.telegram.org/bot{BOT_TOKEN}" last_update_id = 0 def send_message(chat_id, text): requests.post(f"{API_URL}/sendMessage", json={"chat_id": chat_id, "text": text}) def get_updates(): global last_update_id resp = requests.get(f"{API_URL}/getUpdates", params={"offset": last_update_id + 1, "timeout": 5}) return resp.json().get("result", []) def loop(): global last_update_id updates = get_updates() for update in updates: last_update_id = update["update_id"] msg = update.get("message", {}) chat_id = msg.get("chat", {}).get("id") text = msg.get("text", "").strip() if text == "/state": state = Bridge.call("get_led_state") send_message(chat_id, f"LED is currently: {state}") else: send_message(chat_id, "Commands:\n/state — check current LED state (ON or OFF)") time.sleep(1) App.run(user_loop=loop)
    • 참고: YOUR_BOT_TOKEN을 Telegram의 @BotFather에서 얻은 토큰으로 바꿉니다.
    • /state를 보내 LED가 현재 ON 또는 OFF인지 확인합니다.

    빠른 단계

    • MCU 스케치 업로드: 이전 섹션의 Bridge MCU 스케치를 사용합니다 (아직 완료하지 않았으면 먼저 업로드합니다).
    • Telegram 스크립트를 붙여넣습니다: 위의 Python 코드를 Arduino App Lab의 앱의 Python 탭에 복사합니다.
    • 토큰 설정: 스크립트의 YOUR_BOT_TOKEN을 실제 봇 토큰으로 바꿉니다.
    • 앱 실행: 실행을 클릭합니다 — 봇이 Telegram 메시지를 수신 대기합니다.
    • 테스트: 버튼을 눌러 LED를 토글한 다음 /state를 보냅니다 — 상태가 일치하는지 확인합니다.

    App Lab 콘솔 출력

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    [2026-04-29 12:00:01] Telegram: /state [2026-04-29 12:00:01] LED is currently: ON [2026-04-29 12:03:20] Telegram: /state [2026-04-29 12:03:20] LED is currently: OFF
    Telegram
    Telegram 12:45
    Welcome to Telegram!
    ArduinoBot 10:19
    Chatting with Arduino...
    telegram-botfather
    BotFather Yesterday
    Your bot has been created.

    ArduinoBot

    bot
    Today
    /state
    10:15 AM ✓✓
    LED is currently: ON
    10:16 AM
    /state
    10:17 AM ✓✓
    LED is currently: OFF
    10:18 AM

    OpenClaw 통합

    이 튜토리얼을 OpenClaw에 적용하려면 아두이노 우노 Q - OpenClaw 튜토리얼의 지시를 참고합니다

    응용 프로그램/프로젝트 아이디어

    • Telegram LED 모니터: 물리 버튼을 눌러 램프를 토글하고 Telegram에서 원격으로 상태 확인
    • 물리 경보 토글: 버튼을 사용하여 경보를 활성화/비활성화하고 어디에서나 상태 확인
    • 프레젠테이션 컨트롤러: 버튼으로 디스플레이 또는 알림 표시등을 토글하면서 원격으로 상태 확인
    • 야간 모드 스위치: 버튼을 눌러 기기의 야간 모드를 토글합니다. Telegram을 통해 모니터
    • 액세스 확인: 버튼을 눌러 진입을 확인합니다. Telegram을 통해 LED/게이트 상태 확인

    도전

    • 쉬움: 첫 번째 LED가 켜질 때 꺼지는 두 번째 LED를 추가합니다 (LED 교대)
    • 중간: Bridge 스케치를 확장하여 총 버튼 누름 수를 계산하고 개수를 get_press_count()로 노출합니다
    • 고급: LED 상태가 변경될 때마다 자동으로 알림을 보내는 Telegram 봇을 빌드합니다 — Python에서 모니터링 루프를 사용하여 상태를 폴링하고 이전 값과 비교합니다