레슨 98-3: 아두이노로 푸시 버튼을 사용하여 토글 LED를 켜고 끄는 방법
푸시 버튼은 어디에나 있습니다 — 리모컨, 가전제품, 제어 패널 등에 말이죠 — 그리고 단 하나의 버튼이 한 가지 이상의 역할을 해야 하는 순간, 토글 로직이 필요해집니다. 이 프로젝트는 하나의 푸시 버튼으로 첫 번째 누름에 LED를 켜고 다음 누름에 끄는 방법을 보여주므로, 불이 꺼진 상태 그대로 유지됩니다. 이 "한 번 누르면 고정되고, 다시 누르면 해제되는" 동작은 여러분이 앞으로 만들 거의 모든 메뉴 버튼, 전원 스위치, 모드 선택기의 기초가 됩니다.
토글을 이해하고 나면, 동일한 코드 패턴이 실제 하드웨어로 확장됩니다. 다음과 같은 용도로 사용할 수 있습니다:
- 단일 패널 버튼으로 AC 램프나 데스크 조명을 제어하는 릴레이를 전환합니다.
- 두 개 대신 하나의 버튼으로 모터나 펌프를 시작하고 정지합니다.
- 기기의 작동 모드를 순환합니다 (예: 느림 / 빠름 / 끔).
- 누군가 확인할 때까지 켜져 있는 래칭 알람을 만듭니다.
- 상태를 기억하는 오디오 프로젝트용 음소거 버튼을 만듭니다.
- 기계식 스위치를 대체하여 배터리 구동 기기의 소프트 전원 스위치 역할을 합니다.
강사는 이 점을 영상에서 직접 언급합니다 (영상 19:52 부분): 이 프로젝트는 사실 LED에 관한 것이 전혀 아니며 — 릴레이, 모터 드라이버 또는 기타 다른 출력에 적용할 수 있는 토글 기법에 관한 것입니다.
하드웨어 및 부품
부품 목록은 의도적으로 최소한이므로, 이제 막 시작하는 분들에게 아주 좋은 프로젝트입니다. 필요한 것은:
- Arduino 보드 — Uno, Nano, Mega 모두 작동합니다.
- LED 하나, 3 mm 또는 5 mm, 색상 무관.
- LED용 저항 하나, 200 Ω에서 1000 Ω 사이 아무거나. 스크립트에서 그 이유를 설명합니다 (영상 03:49 부분): LED는 약 2 V를 떨어뜨리고 약 10 mA를 소비하므로, 5 V 공급에서 나머지 3 V는 저항에 의해 떨어져야 합니다. 옴의 법칙에 따르면 3 V ÷ 0.01 A = 300 Ω이며, 300 Ω에서 1000 Ω까지 어떤 값이든 작동합니다 — 값이 높을수록 LED가 더 어두워질 뿐입니다.
- 푸시 버튼 스위치 하나. 영상에서는 작은 4핀 택타일 타입과 더 긴 핀 버전을 모두 보여줍니다 (영상 12:43 부분). 푸시 버튼이 없다면 일반 스위치도 작동합니다 — 회로를 연결하고 끊는 두 단자를 찾기만 하면 됩니다.
- 브레드보드와 몇 개의 듀폰 점퍼 와이어.
영상에서 얻은 실용적인 팁 하나 (영상 07:50 부분): 4핀 택타일 버튼에는 내부적으로 연결된 두 쌍의 핀이 있습니다. 연속성 모드의 멀티미터를 사용하여 어느 두 핀이 함께 삑 소리를 내는지 찾으세요 — 그것이 스위치의 한쪽입니다. 한쪽을 입력 핀에 연결하고 다른 쪽을 접지에 연결하세요.
배선 가이드
배선은 간단한 LED 및 푸시 버튼 회로와 동일하며, 버튼이 추가됩니다. LED의 애노드 (더 긴 다리)는 핀 3에 연결되고, 캐소드 (더 짧은 다리, 본체의 평평한 쪽)는 저항을 통해 접지에 연결됩니다. 푸시 버튼은 핀 2와 접지 사이에 연결됩니다 — 코드가 Arduino의 내부 풀업 저항을 활성화하므로 다른 것은 필요하지 않습니다.
이 내부 풀업은 이해할 가치가 있습니다: 그것이 없으면 플로팅 입력 핀이 무작위 노이즈를 읽게 됩니다. INPUT_PULLUP을 활성화하면 버튼이 열려 있는 동안 핀이 5 V로 유지되고, 버튼을 누르면 0 V로 끌어내려집니다. 이것이 코드가 LOW 판독값을 "눌림"으로 처리하는 이유입니다 — 외부 저항이 있는 일반 접지 스위치와 비교하여 로직이 반전됩니다.
코드 설명
전체 스케치는 이 글 아래에서 확인할 수 있습니다. 여기서는 실제로 변경하고 싶을 부분에 초점을 맞추겠습니다.
파일 상단에서 두 개의 핀 할당이 상수로 정의됩니다. 전선을 다른 핀으로 옮기면 여기만 수정하면 됩니다:
const int pushButtonPin = 2;//define a pin number for push button
const int LEDPin = 3;//define a pin that is connected to LED
다음으로 세 개의 상태 변수가 나옵니다. 일반적으로 이것들을 변경할 필요는 없지만, 무엇을 하는지 아는 것이 도움이 됩니다:
int pushButtonStatus = 0; // push value from pin 2
int lightStatus = 0;//light status
int pushed = 0;//push statuspushButtonStatus는 루프를 돌 때마다 버튼 핀의 원시 판독값을 저장합니다. lightStatus는 이전 순서에서 버튼 핀이 읽은 값을 기억하며, 이를 통해 스케치가 계속 반응하는 대신 새로운 누름의 순간을 감지할 수 있습니다. pushed는 실제 토글 플래그로 — 0과 1 사이를 전환하며 LED를 켤지 끌지 결정합니다.
토글 자체는 깔끔한 산술 트릭으로 수행됩니다(18:30 동영상 참조). 플래그를 1에서 빼면 반전됩니다: 1 - 0은 1이 되고, 1 - 1은 0이 됩니다. 따라서 새로운 누름이 감지될 때마다 한 줄로 상태가 뒤집힙니다:
pushed = 1-pushed;//toggle the pushed value
delay(100);//give some time for finger to press
100 ms 지연은 손가락이 버튼에서 떨어지도록 하기 위한 것입니다. 이것이 없으면 한 번의 물리적 누름이 여러 번 카운트될 수 있습니다. 버튼이 불안정하게 느껴지거나 손가락이 떨린다면 이 값을 늘리세요(40:39 동영상 참조).
토글을 트리거하는 조건이 전체 스케치의 핵심입니다. 이 조건은 버튼이 눌리지 않았고(풀업 때문에 HIGH) 이전 판독값이 LOW일 때만 — 즉 버튼을 눌렀다가 막 놓았을 때만 실행됩니다:
if(pushButtonStatus == HIGH && lightStatus == LOW){
pushed = 1-pushed;//toggle the pushed value
delay(100);//give some time for finger to press
}
마지막으로 LED는 토글 플래그로 구동되고, 현재 버튼 판독값은 다음 비교를 위해 저장됩니다:
lightStatus = pushButtonStatus;
if(pushed == HIGH){
Serial.println("Light ON");
digitalWrite(LEDPin, HIGH); //turn the LED ON
}else{
Serial.println("Light OFF");
digitalWrite(LEDPin, LOW);//turn the LED OFF
}
9600 baud로 시리얼 모니터를 열어 버튼을 누를 때 "Light ON" 및 "Light OFF" 메시지를 확인할 수도 있습니다.
실시간 시연
동영상(19:41 동영상 참조)에서 동작을 확인할 수 있습니다: 첫 번째 누름에서 LED가 켜지고 손가락을 떼도 켜진 상태로 유지됩니다. 다음 누름에서 꺼지고 꺼진 상태로 유지됩니다. 버튼을 계속 누르고 있을 필요가 없으며, 이것이 바로 이 프로젝트와 Lesson 98-2: How to Turn On and Off an LED Using a Push Button with Arduino에서 다룬 더 단순한 "누르고 있어야 켜지는" 버전의 차이점입니다.
동영상에서는 LED를 릴레이 모듈로 바꿔 mains 전원 장치를 전환하거나, 모터 드라이버로 바꿔 모터를 시작 및 정지할 수 있다는 점도 지적합니다. 토글 로직은 바뀌지 않고 — 출력 장치만 바뀝니다.
같은 동영상에서 보여주는 다른 변형들 — LED 페이딩, 시소 패턴, 워킹 라이트, 전압 바 미터, 신호등 — 은 각각 아래에 링크된 자체 튜토리얼에서 다룹니다.
이 동영상의 관련 프로젝트
- Lesson 98-1: How to Turn On and Off an LED with Arduino
- Lesson 98-2: How to Turn On and Off an LED Using a Push Button with Arduino
- Lesson 98-4: Fading an LED Light Using Arduino: Brightness Control
- Lesson 98-5: Fade Light When a Button Is Pressed Using Arduino
- Lesson 98-6: Seesaw LED Game with Arduino
- Lesson 98-7: Walking Light Using Arduino and 5 LEDs
- Lesson 98-8: Walking Light with Push Button and LEDs with Arduino
- Lesson 98-9: LED Voltage Level Meter Using Arduino or walking light with potentiometer
- Lesson 98-10: Arduino Traffic Light
챕터
- [00:00] 10가지 LED 프로젝트 개요
- [01:00] Arduino 단계별 과정 소개
- [02:29] LED 기초: 기호, 애노드, 캐소드, 저항 계산
- [05:53] 프로젝트 1: LED 켜고 끄기
- [12:43] 프로젝트 2: 푸시 버튼으로 LED 제어
- [17:13] 프로젝트 3: 푸시 버튼으로 LED 토글
- [20:12] 프로젝트 4: LED 페이딩
- [23:20] 프로젝트 5: 푸시 버튼으로 LED 페이딩
- [27:32] 프로젝트 6: 두 개의 LED로 시소
- [30:47] 프로젝트 7: 다섯 개의 LED로 워킹 라이트
- [36:41] 프로젝트 8: 푸시 버튼으로 진행하는 고급 워킹 라이트
- [42:25] 프로젝트 9: 포텐셔미터를 사용한 LED 전압 레벨 미터
- [49:25] 프로젝트 10: Arduino 신호등
This code has not been parsed yet. Please return to the admin panel to parse it.
필요할 수 있는 것들
-
아마존SunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
아마존
-
아마존
자원 및 참고자료
-
문서화Documentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
파일📁
아두이노 라이브러리 (zip)
-
SunFounder 3-in-1 스마트 카 학습 키트 소스 코드
3in1-kit-main-v2.zip12.80 MB
사용자 매뉴얼
-
SunFounder 3-in-1 Arduino 스마트 카 조립 설명서이 문서는 SunFounder 3-in-1 Arduino 스마트 카의 단계별 조립을 보여줍니다.
SunFounder_car_assembly_manual.pdf1.20 MB