Trình mô phỏng xúc xắc
Thuộc phần Màn hình và cảm biến trong hành trình Arduino của Coddy. Bài học 5 trên 24.
random(1, 7) chọn một số nguyên từ 1 đến 6. Số đầu tiên là giá trị thấp nhất bạn có thể nhận được; số thứ hai lớn hơn giá trị cao nhất một đơn vị.
Bảng mạch không có yếu tố ngẫu nhiên thực sự bên trong. random() tính từng số dựa trên số trước đó, bắt đầu từ một số gọi là hạt giống. Với cùng một hạt giống, hàm sẽ cho ra cùng các số mỗi lần chạy: xúc xắc của bạn sẽ ra 2, 2, 6, 3 mỗi lần bật nguồn.
randomSeed() đặt hạt giống. Hãy truyền vào một giá trị thay đổi sau mỗi lần chạy, chẳng hạn thời điểm nhấn nút lần đầu. micros() đếm theo đơn vị một phần triệu giây, và không ai nhấn nút vào cùng một phần triệu giây hai lần:
if (!seeded) {
randomSeed(micros());
seeded = true;
}
int roll = random(1, 7);Đặt hạt giống trong setup() không giúp ích gì: setup() chạy vào cùng một phần triệu giây sau mỗi lần bật nguồn.
Thử thách
Trung bìnhNút được nối với chân 10 và chương trình khởi đầu đã nhận biết thời điểm nút được nhấn. Hãy tạo một con xúc xắc:
- mỗi lần nhấn, chọn
random(1, 7)và hiển thị kết quả bằngshowDigit() - chỉ ở lần nhấn đầu tiên, gọi
randomSeed(micros())để mỗi lần chạy cho ra kết quả khác nhau
Nhấn Chạy rồi nhấn nút vài lần, sau đó nhấn Kiểm tra.
Tự làm thử
const int segmentPins[7] = {2, 3, 4, 5, 6, 7, 8}; // a, b, c, d, e, f, g
// Mỗi chữ số có một mẫu, đọc từ phải sang trái: bit cuối cùng ứng với đoạn a.
// gfedcba
const byte digits[10] = {
0b0111111, // 0
0b0000110, // 1
0b1011011, // 2
0b1001111, // 3
0b1100110, // 4
0b1101101, // 5
0b1111101, // 6
0b0000111, // 7
0b1111111, // 8
0b1101111 // 9
};
void showDigit(int n) {
for (int i = 0; i < 7; i++) {
if (bitRead(digits[n], i) == 1) {
digitalWrite(segmentPins[i], LOW); // sáng
} else {
digitalWrite(segmentPins[i], HIGH); // tắt
}
}
}
const int buttonPin = 10;
bool wasPressed = false;
bool seeded = false;
void setup() {
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
}
pinMode(buttonPin, INPUT_PULLUP);
showDigit(0);
}
void loop() {
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed != wasPressed) {
if (pressed) {
// nút vừa được nhấn: chọn ngẫu nhiên một số từ 1 đến 6 rồi hiển thị số đó
}
delay(50); // chờ nút ổn định
}
wasPressed = pressed;
}
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 Màn hình và cảm biến
1Màn hình LED 7 đoạn
Màn hình LED 7 đoạnMẫu chữ số trong byteĐếm trên màn hìnhĐếm ngược về 0Trình mô phỏng xúc xắcTự luyện tập: Playground Arduino