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 会保存每个按钮上一次的读数。后续步骤会在按钮松开时记录一次按下操作。这些按钮不会抖动,因此检查边沿就足够了。
挑战
中等让这四种颜色亮起来并发出声音:
- 在
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 并停止播放音符
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
项目中的所有课
自己练习: Arduino 在线编辑器