버튼 스톱워치
Coddy Arduino 여정의 delay 없이 타이밍 제어하기 섹션에 포함된 레슨. 18개 중 18번째.
스톱워치에는 실행 중과 정지라는 두 가지 상태가 있으며, 버튼을 누르면 한 상태에서 다른 상태로 전환됩니다. 안전한 방식으로 시간을 측정합니다. 시작할 때 millis() 값을 저장하고, 끝날 때 빼면 됩니다.
if (!running) {
running = true;
startTime = millis();
} else {
running = false;
Serial.println(millis() - startTime);
}버튼은 모드 버튼에서와 같은 방식으로 디바운싱합니다. 입력값이 바뀌면 동작한 다음 20 ms 기다립니다. 두 번의 버튼 입력 모두 같은 20 ms를 기다리므로, 그 사이의 시간은 정확하게 유지됩니다.
LED는 상태를 보여 줍니다. 스톱워치가 실행되는 동안 켜집니다.
챌린지
중급버튼은 이미 읽고 디바운싱되었으며, onPress()는 누를 때마다 한 번 실행됩니다. onPress()를 작성하세요:
- 스톱워치가 실행 중이 아니면: 시작하고,
millis()를startTime에 저장한 다음 LED를 켭니다 - 실행 중이면: 중지하고, LED를 끈 다음 시간을 밀리초 단위로 출력합니다
Run을 누르고 버튼을 두 번 누른 다음 Check를 누르세요.
직접 해보기
const int ledPin = 13;
const int buttonPin = 2;
bool wasPressed = false;
bool running = false;
unsigned long startTime = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
// 버튼을 누를 때마다 한 번 호출됩니다.
void onPress() {
// 실행 중이 아닐 때: 시작하고, 시간을 기록하고, LED를 켭니다
// 실행 중일 때: 멈추고, LED를 끄고, 시간을 ms 단위로 출력합니다
}
void loop() {
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed != wasPressed) {
if (pressed) {
onPress();
}
wasPressed = pressed;
delay(20); // 접점이 안정될 때까지 기다립니다
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
delay 없이 타이밍 제어하기의 모든 레슨
직접 연습해 보세요: Arduino 플레이그라운드