횡단 버튼
Coddy Arduino 여정의 프로젝트 섹션에 포함된 레슨. 24개 중 3번째.
보행자는 도로를 건너기 위해 신호를 요청할 방법이 필요합니다. 2번 핀의 파란색 버튼은 횡단 버튼입니다. 초록불이 켜져 있을 때 버튼을 누르면 초록불이 즉시 끝나고, 자동차 신호가 노란불로 바뀐 다음 빨간불이 켜집니다.
신호등은 millis()를 사용해 작동하므로, loop()는 초록불 상태를 초당 수천 번 지나가며 시계와 함께 버튼도 매번 확인할 수 있습니다. 다음 두 조건 중 하나라도 참이면 초록불이 끝납니다. 이것이 ||(또는)가 의미하는 것입니다.
case GREEN:
if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
// 노란색으로 변경
}
break;버튼은 2번 핀을 접지에 연결하므로 핀을 INPUT_PULLUP으로 설정합니다. 버튼이 핀을 LOW로 끌어내리기 전까지는 HIGH를 읽습니다.
초록불 상태에서만 버튼을 읽습니다. 노란불과 빨간불일 때는 자동차가 이미 멈추고 있으며, 노란불은 운전자가 멈출 시간을 확보할 수 있도록 1초를 온전히 유지합니다.
챌린지
중급2번 핀에 횡단보도 버튼을 추가하세요:
- 2번 핀을
INPUT_PULLUP으로 설정하세요 - 불빛이 초록색일 때 버튼을 누르면 초록불이 즉시 끝납니다(불빛이 노란색으로 바뀝니다)
- 버튼을 눌렀는지 여부와 관계없이 노란불과 빨간불은 정해진 시간을 유지합니다
Run을 누르고 초록불이 켜질 때까지 기다린 다음, 파란색 버튼을 누르고 Check를 누르세요.
직접 해보기
// 자동차 신호등
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// 보드 자체의 LED: 컨트롤러의 상태 표시등
const int statusPin = 13;
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0; // 현재 신호등이 켜진 시점
bool statusOn = false;
unsigned long lastBlink = 0;
// 신호등 하나를 켜고 나머지 두 개는 끕니다.
void showLight(int pin) {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(pin, HIGH);
}
void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(statusPin, OUTPUT);
showLight(greenPin);
}
void loop() {
unsigned long now = millis();
switch (light) {
case GREEN:
if (now - lightStart >= 3000) {
light = YELLOW;
lightStart = now;
showLight(yellowPin);
}
break;
case YELLOW:
if (now - lightStart >= 1000) {
light = RED;
lightStart = now;
showLight(redPin);
}
break;
case RED:
if (now - lightStart >= 3000) {
light = GREEN;
lightStart = now;
showLight(greenPin);
}
break;
}
// 자동차 신호등의 동작과 관계없이 상태 표시등은 500 ms마다 깜빡입니다.
if (now - lastBlink >= 500) {
lastBlink = now;
if (statusOn) {
statusOn = false;
digitalWrite(statusPin, LOW);
} else {
statusOn = true;
digitalWrite(statusPin, HIGH);
}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
프로젝트의 모든 레슨
직접 연습해 보세요: Arduino 플레이그라운드