프로젝트 01: 나만의 3색 신호등 시스템 🚥
세 개의 LED를 순차적으로 제어하여 도로 위의 안전을 책임지는 신호등을 만들어 봅시다.
1. 프로젝트 개요
이번 프로젝트의 목표는 빨간색, 노란색, 초록색 LED를 사용해 실제 교차로의 신호등 체계를 재현하는 것입니다.
단순히 불을 켜는 것이 아니라, C언어의 배열(Array)을 활용해 수많은 LED 핀번호를 스마트하게 관리하는 고급 기법을 익히게 됩니다.
📦 준비물
아두이노 우노 x 1
브레드보드 x 1
빨강, 노랑, 초록 LED 각 1개
330Ω 저항 x 3
점퍼 와이어 다수
2. 회로 구성 (Wiring)
각 LED의 긴 다리(+)에는 저항을 연결해 아두이노의 디지털 핀에 꽂고, 짧은 다리(-)는 모두 모아 GND에 연결합니다.
▲ 신호등 회로 연결 가이드: 12(빨), 11(노), 10(초) 핀을 사용합니다.
3. 코드 작성하기 (배열 활용 버전)
변수를 redLED = 12; 처럼 하나씩 만들 수도 있지만, LED가 많아지면 관리가 힘듭니다. **배열과 for문**을 사용해 아주 깔끔하게 코드를 짜보겠습니다.
// 1. LED 핀 번호를 배열에 담습니다.
int ledPins[] = {12, 11, 10};
int ledCount = 3;
void setup() {
// 2. for문을 사용해 모든 핀을 한 번에 출력으로 설정!
for(int i = 0; i < ledCount; i++) {
pinMode(ledPins[i], OUTPUT);
}
}
void loop() {
// 단계 1: 초록불 켜기 (5초)
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
delay(5000);
// 단계 2: 노란불 켜기 (주의! 2초)
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
delay(2000);
// 단계 3: 빨간불 켜기 (정지! 5초)
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
delay(5000);
}
4. 💡 업그레이드: 함수(Function) 사용하기
코드에서 digitalWrite가 반복되는 것이 불편해 보이죠? 6장에서 배운 **함수**를 만들어 코드를 더 아름답게 리팩토링해 봅시다.
void setTrafficLight(int r, int y, int g) {
digitalWrite(12, r);
digitalWrite(11, y);
digitalWrite(10, g);
}
void loop() {
setTrafficLight(LOW, LOW, HIGH); // 초록
delay(5000);
setTrafficLight(LOW, HIGH, LOW); // 노랑
delay(2000);
setTrafficLight(HIGH, LOW, LOW); // 빨강
delay(5000);
}
✨ 무엇이 좋아졌나요?
이제 loop 함수 안의 코드가 마치 영어 문장처럼 읽힙니다! 가독성이 높아지고, 나중에 핀 번호가 바뀌어도 setTrafficLight 함수 한 곳만 수정하면 되기 때문에 유지보수가 아주 쉬워집니다.
5. 🎯 심화 챌린지: 보행자 버튼 추가
실제 길거리에는 보행자가 버튼을 눌렀을 때만 초록불로 바뀌는 신호등이 있죠? 2장에서 배운 버튼 입력 기능을 추가하여 **'수동 보행자 신호등'**으로 개조해 보세요!
- 버튼을 누르지 않으면 계속 빨간불 유지
- 버튼을 누르면 잠시 후 노란불 → 초록불 순서로 변경