Menu
CoddyTech

骰子模拟器

本课属于 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() 都会在同一个微秒运行。

challenge icon

挑战

中等

按钮连接在引脚 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;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

显示器与传感器中的所有课

自己练习: Arduino 在线编辑器