Menu
CoddyTech

Simon:按钮与音符

本课属于 Coddy Arduino 学习旅程的“项目”单元。第 13 课,共 24 课。

Simon 是一款记忆游戏:游戏板会播放一组彩灯和音符组成的序列,你要按按钮重复这个序列。每一轮,序列都会增加一项,直到你出错为止。游戏有 4 种颜色,每种颜色都对应一个按钮、一个 LED 和一个音符。

每种元素都有 4 个,用数组可以让程序保持简短。每个数组的第 0 项是红色,第 1 项是绿色,第 2 项是蓝色,第 3 项是黄色,因此只用一个数字 i 就能表示各处的颜色:

const int ledPins[4] = {9, 10, 11, 12};
const int buttonPins[4] = {2, 3, 4, 5};
const int notes[4] = {262, 330, 392, 523};

for 循环会检查全部 4 个按钮。在两个时刻执行操作:按钮按下时(现在是 LOW,上一次是 HIGH),以及按钮松开时(现在是 HIGH,上一次是 LOW)。数组 lastState 会保存每个按钮上一次的读数。后续步骤会在按钮松开时记录一次按下操作。这些按钮不会抖动,因此检查边沿就足够了。

challenge icon

挑战

中等

让这四种颜色亮起来并发出声音:

  • 在 setup() 中,用 for 循环将 LED 引脚设为输出,并将按钮引脚设为 INPUT_PULLUP
  • 按下按钮 i 时,点亮 ledPins[i],并在引脚 8 上播放 notes[i]
  • 松开按钮时,关闭 LED,并调用 noTone()

点击运行,按下按钮试试,然后点击检查。

亲手试试

// 每种颜色对应一个元素:红、绿、蓝、黄
const int ledPins[4] = {9, 10, 11, 12};
const int buttonPins[4] = {2, 3, 4, 5};
const int notes[4] = {262, 330, 392, 523};  // C、E、G 和高音 C
const int buzzerPin = 8;

int lastState[4] = {HIGH, HIGH, HIGH, HIGH};  // 每个按钮上一次的读取值

void setup() {
  // LED 是输出,按钮设为 INPUT_PULLUP

}

void loop() {
  // 对每个按钮:按下时点亮对应的 LED 并播放对应的音符;
  // 松开时,关闭 LED 并停止播放音符

}
quiz icon自我测试

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

项目中的所有课

自己练习: Arduino 在线编辑器