Luân phiên các chế độ bằng nút bấm
Thuộc phần Định thời không dùng delay trong hành trình Arduino của Coddy. Bài học 11 trên 18.
Nhiều thiết bị có một nút để chuyển lần lượt qua các chế độ: đèn xe đạp tắt, sáng, nhấp nháy, nhấp nháy nhanh, rồi lại tắt. Đó là một máy trạng thái, trong đó mỗi lần nhấn nút, chứ không phải đồng hồ, sẽ chuyển sang trạng thái tiếp theo.
Đặt bước chuyển này trong một hàm riêng. Câu lệnh switch dựa trên chế độ hiện tại để đặt chế độ tiếp theo, còn chế độ cuối cùng sẽ quay lại chế độ đầu tiên:
void nextMode() {
switch (mode) {
case OFF:
mode = ON;
Serial.println("ON");
break;
// ... và cứ thế, cho đến khi FAST trở lại OFF
}
}Bản phác thảo gọi nextMode() một lần cho mỗi lần nhấn. Nút được khử dội theo cách bạn đã học trong phần Inputs: khi số đọc thay đổi, hãy xử lý thay đổi đó, rồi đợi 20 ms để các tiếp điểm ổn định. Một câu lệnh switch thứ hai dựa trên mode để điều khiển LED.
Thử thách
Trung bìnhNút bấm và đèn LED đã được viết sẵn cho bạn. Hãy viết nextMode() để mỗi lần nhấn sẽ chuyển sang chế độ tiếp theo và in tên chế độ đó: OFF, ON, BLINK, FAST, rồi lại đến OFF.
Nhấn Chạy, nhấn nút vài lần, rồi nhấn Kiểm tra.
Tự làm thử
const int ledPin = 13;
const int buttonPin = 2;
enum Mode { OFF, ON, BLINK, FAST };
Mode mode = OFF;
bool wasPressed = false;
unsigned long blinkPrevious = 0;
int ledState = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
// Chuyển sang chế độ tiếp theo và in ra tên chế độ đó.
void nextMode() {
// Mỗi chế độ có một case: đặt chế độ tiếp theo, in ra tên chế độ đó, rồi dùng break
}
// Đổi trạng thái LED sau mỗi interval ms.
void blinkEvery(unsigned long interval) {
unsigned long now = millis();
if (now - blinkPrevious >= interval) {
blinkPrevious = now;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);
}
}
void loop() {
// 1. Một lần nhấn (đã chống dội) gọi nextMode()
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed != wasPressed) {
if (pressed) {
nextMode();
}
wasPressed = pressed;
delay(20); // Chờ các tiếp điểm ổn định
}
// 2. Chế độ quyết định hoạt động của LED
switch (mode) {
case OFF:
digitalWrite(ledPin, LOW);
break;
case ON:
digitalWrite(ledPin, HIGH);
break;
case BLINK:
blinkEvery(500);
break;
case FAST:
blinkEvery(100);
break;
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Định thời không dùng delay
2Máy trạng thái
Ghi nhớ chế độChọn bằng switchĐặt tên trạng thái bằng enumMáy trạng thái đèn giao thôngLuân phiên các chế độ bằng nút bấmTự luyện tập: Playground Arduino