fadeLights() 함수에는 기존 loop의 페이딩 시퀀스를 그대로 옮깁니다. 시작 상태가 초록이므로 초록부터 페이드 아웃으로 시작합니다.
void fadeLights() {
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
}
작동 확인: 버튼 누르면 시퀀스 실행, 떼면 바로 기본 상태로 복귀해야 합니다. 시퀀스가 맞지 않으면 코드/배선 확인.
3. 버튼으로 페이딩 (딜레이 개선)
앞선 버전은 버튼을 떼어도 delay() 때문에 시퀀스가 끝까지 돌았습니다. 이번에는 페이딩 중에도 버튼 상태를 폴링하여 떼는 즉시 중단되게 개선합니다.
회로도
코드 변경
const int fade = 10; 상수는 더 이상 필요 없으므로 삭제합니다. setup()은 동일.
fadeLights() 내부 각 for 루프마다 버튼 체크 루프를 삽입합니다. delay() 대신 빈 루프(for y)를 돌며 버튼을 읽고, LOW면 return으로 함수 즉시 종료.
void fadeLights() {
for (int i = 255; i >= 0; i--) {
analogWrite(ledGreen, i);
for (int y = 0; y < 1000; y++) {
if (digitalRead(button) == LOW) return;
}
}
for (int i = 0; i <= 255; i++) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) {
if (digitalRead(button) == LOW) return;
}
}
for (int i = 255; i >= 0; i--) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) {
if (digitalRead(button) == LOW) return;
}
}
for (int i = 0; i <= 255; i++) {
analogWrite(ledRed, i);
for (int y = 0; y < 1000; y++) {
if (digitalRead(button) == LOW) return;
}
}
for (int i = 255; i >= 0; i--) {
analogWrite(ledRed, i);
for (int y = 0; y < 1000; y++) {
if (digitalRead(button) == LOW) return;
}
}
for (int i = 0; i <= 255; i++) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) {
if (digitalRead(button) == LOW) return;
}
}
for (int i = 255; i >= 0; i--) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) {
if (digitalRead(button) == LOW) return;
}
}
for (int i = 0; i <= 255; i++) {
analogWrite(ledGreen, i);
for (int y = 0; y < 1000; y++) {
if (digitalRead(button) == LOW) return;
}
}
}
각 내부 루프 횟수(1000, 400)는 대략적인 타이밍 조절용입니다. 루프당 약 10µs 소요되어 원하는 페이딩 속도를 냅니다. 버튼을 떼면 즉시 return으로 빠져나가 기본 LED 상태로 돌아갑니다.
전체 코드 모음
1. 기본 페이딩
int ledRed = 9; int ledYellow = 6; int ledGreen = 3; const int fade = 10;
void setup() { pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT); }
void loop() {
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
}
2. 버튼으로 페이딩
int ledRed = 9; int ledYellow = 6; int ledGreen = 3; int button = 7; const int fade = 10;
void setup() {
pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT);
pinMode(button, INPUT);
digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH);
}
void loop() {
if (digitalRead(button) == HIGH) { delay(15); if (digitalRead(button) == HIGH) fadeLights(); }
else { digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH); }
}
void fadeLights() {
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
}
3. 버튼으로 페이딩 (딜레이 개선)
int ledRed = 9; int ledYellow = 6; int ledGreen = 3; int button = 7; const int fade = 10;
void setup() {
pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT);
pinMode(button, INPUT);
digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH);
}
void loop() {
if (digitalRead(button) == HIGH) { delay(15); if (digitalRead(button) == HIGH) fadeLights(); }
else { digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH); }
}
void fadeLights() {
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); for (int y = 0; y < 1000; y++) { if (digitalRead(button) == LOW) return; } }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) { if (digitalRead(button) == LOW) return; } }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) { if (digitalRead(button) == LOW) return; } }
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); for (int y = 0; y < 1000; y++) { if (digitalRead(button) == LOW) return; } }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); for (int y = 0; y < 1000; y++) { if (digitalRead(button) == LOW) return; } }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) { if (digitalRead(button) == LOW) return; } }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) { if (digitalRead(button) == LOW) return; } }
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); for (int y = 0; y < 1000; y++) { if (digitalRead(button) == LOW) return; } }
}