骰子模拟器
本课属于 Coddy Arduino 学习旅程的“显示器与传感器”单元。第 5 课,共 24 课。
random(1, 7) 会从 1 到 6 中选出一个整数。第一个数字是你可能得到的最小值;第二个数字比最大值大 1。
这个电路板内部并没有真正的随机性。random() 会根据前一个数字计算出每个数字,计算从一个称为种子的数字开始。使用相同的种子,每次运行都会得到相同的数字:每次给它通电,骰子都会依次掷出 2、2、6、3。
randomSeed() 用来设置种子。给它一个每次运行都会变化的值,比如第一次按下按钮的时间。micros() 以微秒为单位计数,而没人会两次都在同一个微秒按下按钮:
if (!seeded) {
randomSeed(micros());
seeded = true;
}
int roll = random(1, 7);在 setup() 中设置种子没有帮助:每次通电后,setup() 都会在同一个微秒运行。
挑战
中等按钮连接在引脚 10 上,起始代码已经能检测到按钮按下的瞬间。制作一个骰子:
- 每次按下按钮时,调用
random(1, 7)并用showDigit()显示结果 - 只在第一次按下按钮时,调用
randomSeed(micros()),这样每次运行时掷出的结果都会不同
点击运行,按几次按钮,然后点击检查。
亲手试试
const int segmentPins[7] = {2, 3, 4, 5, 6, 7, 8}; // a, b, c, d, e, f, g
// 每个数字对应一种图案,从右往左读:最后一位对应线段 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); // 亮起
} else {
digitalWrite(segmentPins[i], HIGH); // 熄灭
}
}
}
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) {
// 按钮刚被按下:随机生成一个 1 到 6 的数字并显示出来
}
delay(50); // 等待按钮状态稳定
}
wasPressed = pressed;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
显示器与传感器中的所有课
自己练习: Arduino 在线编辑器