ocrobot:alpha:kitone:tutorial15
差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
ocrobot:alpha:kitone:tutorial15 [2019/07/15 02:35] – 董凯萍 | ocrobot:alpha:kitone:tutorial15 [2023/06/07 04:23] (当前版本) – 外部编辑 127.0.0.1 | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | ~~NOTOC~~ | ||
+ | ====== | ||
+ | <WRAP left round info 100%> | ||
+ | 这个例子演示了怎样使用tone函数来产生音符,配合三个按键,弹奏出不同的音调,</ | ||
+ | |||
+ | ===== ALPHA MEGA328-U核心 ===== | ||
+ | ==== 硬件 ==== | ||
+ | * [[ocrobot: | ||
+ | * [[ocrobot: | ||
+ | * [[ocrobot: | ||
+ | * [[ocrobot: | ||
+ | ==== 搭建电路 ==== | ||
+ | |||
+ | - ALPHA MEGA328-U模块插入并行扩展版1号槽位。 | ||
+ | - ALPHA 蜂鸣器模块插入1号槽位,堆叠于MEGA328-U上。 | ||
+ | - ALPHA 微动开关模块插入并行扩展板2号槽位。 | ||
+ | - USB线连接计算机与ALPHA MEGA328-U。 | ||
+ | {{ocrobot: | ||
+ | ==== 代码 ==== | ||
+ | |||
+ | |||
+ | <code cpp>/* | ||
+ | keyboard | ||
+ | | ||
+ | */ | ||
+ | |||
+ | #include " | ||
+ | |||
+ | const int buttonPin1 = 15; // | ||
+ | const int buttonPin2 = 16; | ||
+ | const int buttonPin3 = 17; | ||
+ | const int threshold = 10; // 产生声音的最小值,阈值 | ||
+ | |||
+ | int buttonState1; | ||
+ | int buttonState2; | ||
+ | int buttonState3; | ||
+ | int lastButtonState1 = LOW; // 上一次读取到的输入状态为低电平 | ||
+ | int lastButtonState2 = LOW; // 上一次读取到的输入状态 | ||
+ | int lastButtonState3 = LOW; // 上一次读取到的输入状态 | ||
+ | |||
+ | |||
+ | long lastDebounceTime1 = 0; // 最后一次输出脚触发时间 | ||
+ | long lastDebounceTime2 = 0; | ||
+ | long lastDebounceTime3 = 0; | ||
+ | long debounceDelay = 50; // 设置消抖时间,增加它,如果输出不稳定 | ||
+ | |||
+ | int notes[] = { | ||
+ | NOTE_A4, NOTE_B4, | ||
+ | |||
+ | |||
+ | void sound1() | ||
+ | { if (digitalRead(buttonPin1)!= lastButtonState1) // | ||
+ | { | ||
+ | lastDebounceTime1 = millis(); // 重置消抖时间 | ||
+ | } | ||
+ | if ((millis() - lastDebounceTime1) > debounceDelay) // 比较按键的相差时间,若大于消抖时间,则说明时间不管读取到什么,时间已经比消抖延时长,所以认为它是真实的当前状态 | ||
+ | { | ||
+ | if (digitalRead(buttonPin1) != buttonState1) | ||
+ | { | ||
+ | buttonState1 = digitalRead(buttonPin1); | ||
+ | if (buttonState1 == HIGH) // | ||
+ | { | ||
+ | tone(3, notes[0], 120); // | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | lastButtonState1 = digitalRead(buttonPin1); | ||
+ | } | ||
+ | void sound2() | ||
+ | { if (digitalRead(buttonPin2)!= lastButtonState2) // | ||
+ | { | ||
+ | lastDebounceTime2 = millis(); // 重置消抖时间 | ||
+ | } | ||
+ | if ((millis() - lastDebounceTime2) > debounceDelay) // 比较按键的相差时间,若大于消抖时间,则说明时间不管读取到什么,时间已经比消抖延时长,所以认为它是真实的当前状态 | ||
+ | { | ||
+ | if (digitalRead(buttonPin2) != buttonState2) | ||
+ | { | ||
+ | buttonState2 = digitalRead(buttonPin2); | ||
+ | if (buttonState2 == HIGH) // | ||
+ | { | ||
+ | tone(3, notes[1], 120); // | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | lastButtonState2 = digitalRead(buttonPin2); | ||
+ | } | ||
+ | void sound3() | ||
+ | { if (digitalRead(buttonPin3)!= lastButtonState3) // | ||
+ | { | ||
+ | lastDebounceTime3 = millis(); // 重置消抖时间 | ||
+ | } | ||
+ | if ((millis() - lastDebounceTime3) > debounceDelay) // 比较按键的相差时间,若大于消抖时间,则说明时间不管读取到什么,时间已经比消抖延时长,所以认为它是真实的当前状态 | ||
+ | { | ||
+ | if (digitalRead(buttonPin3) != buttonState3) | ||
+ | { | ||
+ | buttonState3 = digitalRead(buttonPin3); | ||
+ | if (buttonState3 == HIGH) // | ||
+ | { | ||
+ | tone(3, notes[2], 120); // | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | lastButtonState3 = digitalRead(buttonPin3); | ||
+ | } | ||
+ | |||
+ | void setup() { | ||
+ | pinMode(buttonPin1, | ||
+ | pinMode(buttonPin2, | ||
+ | pinMode(buttonPin3, | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | sound1(); | ||
+ | sound2(); | ||
+ | sound3(); | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | 上面的代码用到了pitches.h文件。这个文件包含了典型单音音高的值。例如NOTE_C4是中音c,NOTE_FS4是高音F。这个音符表是Brett Hagman原创的,tone命令就是基于此。当你想创作音乐的时候你会发现它太有用了。 | ||
+ | 为了得到pitches.h 文件,点击右上角的new Tab按钮 | ||
+ | 然后粘贴以下的代码 | ||
+ | |||
+ | <code cpp>/ | ||
+ | * Public Constants | ||
+ | | ||
+ | |||
+ | #define NOTE_B0 | ||
+ | #define NOTE_C1 | ||
+ | #define NOTE_CS1 35 | ||
+ | #define NOTE_D1 | ||
+ | #define NOTE_DS1 39 | ||
+ | #define NOTE_E1 | ||
+ | #define NOTE_F1 | ||
+ | #define NOTE_FS1 46 | ||
+ | #define NOTE_G1 | ||
+ | #define NOTE_GS1 52 | ||
+ | #define NOTE_A1 | ||
+ | #define NOTE_AS1 58 | ||
+ | #define NOTE_B1 | ||
+ | #define NOTE_C2 | ||
+ | #define NOTE_CS2 69 | ||
+ | #define NOTE_D2 | ||
+ | #define NOTE_DS2 78 | ||
+ | #define NOTE_E2 | ||
+ | #define NOTE_F2 | ||
+ | #define NOTE_FS2 93 | ||
+ | #define NOTE_G2 | ||
+ | #define NOTE_GS2 104 | ||
+ | #define NOTE_A2 | ||
+ | #define NOTE_AS2 117 | ||
+ | #define NOTE_B2 | ||
+ | #define NOTE_C3 | ||
+ | #define NOTE_CS3 139 | ||
+ | #define NOTE_D3 | ||
+ | #define NOTE_DS3 156 | ||
+ | #define NOTE_E3 | ||
+ | #define NOTE_F3 | ||
+ | #define NOTE_FS3 185 | ||
+ | #define NOTE_G3 | ||
+ | #define NOTE_GS3 208 | ||
+ | #define NOTE_A3 | ||
+ | #define NOTE_AS3 233 | ||
+ | #define NOTE_B3 | ||
+ | #define NOTE_C4 | ||
+ | #define NOTE_CS4 277 | ||
+ | #define NOTE_D4 | ||
+ | #define NOTE_DS4 311 | ||
+ | #define NOTE_E4 | ||
+ | #define NOTE_F4 | ||
+ | #define NOTE_FS4 370 | ||
+ | #define NOTE_G4 | ||
+ | #define NOTE_GS4 415 | ||
+ | #define NOTE_A4 | ||
+ | #define NOTE_AS4 466 | ||
+ | #define NOTE_B4 | ||
+ | #define NOTE_C5 | ||
+ | #define NOTE_CS5 554 | ||
+ | #define NOTE_D5 | ||
+ | #define NOTE_DS5 622 | ||
+ | #define NOTE_E5 | ||
+ | #define NOTE_F5 | ||
+ | #define NOTE_FS5 740 | ||
+ | #define NOTE_G5 | ||
+ | #define NOTE_GS5 831 | ||
+ | #define NOTE_A5 | ||
+ | #define NOTE_AS5 932 | ||
+ | #define NOTE_B5 | ||
+ | #define NOTE_C6 | ||
+ | #define NOTE_CS6 1109 | ||
+ | #define NOTE_D6 | ||
+ | #define NOTE_DS6 1245 | ||
+ | #define NOTE_E6 | ||
+ | #define NOTE_F6 | ||
+ | #define NOTE_FS6 1480 | ||
+ | #define NOTE_G6 | ||
+ | #define NOTE_GS6 1661 | ||
+ | #define NOTE_A6 | ||
+ | #define NOTE_AS6 1865 | ||
+ | #define NOTE_B6 | ||
+ | #define NOTE_C7 | ||
+ | #define NOTE_CS7 2217 | ||
+ | #define NOTE_D7 | ||
+ | #define NOTE_DS7 2489 | ||
+ | #define NOTE_E7 | ||
+ | #define NOTE_F7 | ||
+ | #define NOTE_FS7 2960 | ||
+ | #define NOTE_G7 | ||
+ | #define NOTE_GS7 3322 | ||
+ | #define NOTE_A7 | ||
+ | #define NOTE_AS7 3729 | ||
+ | #define NOTE_B7 | ||
+ | #define NOTE_C8 | ||
+ | #define NOTE_CS8 4435 | ||
+ | #define NOTE_D8 | ||
+ | #define NOTE_DS8 4978 | ||
+ | </ | ||
+ | |||
+ | 保存并重命名为 pitches.h | ||
+ | |||
+ | |||
+ | <WRAP left round tip 100%> | ||
+ | 这个例子中我们使用了一个新函数:[[reference: | ||
+ | |||
+ | </ | ||
+ | [[ocrobot: |
ocrobot/alpha/kitone/tutorial15.txt · 最后更改: 2023/06/07 04:23 由 127.0.0.1