亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

带有预设歌曲的电子钢琴键盘

组件和用品

Arduino UNO
× 1
Adafruit 标准 LCD - 16x2 蓝底白字
× 1
SparkFun 按钮开关 12mm
× 8
电阻 220 ohm
× 4
电阻 560 ohm
× 1
电阻 1k ohm
× 1
电阻 4.7K ohm
× 1
电阻 10k ohm
× 3
电阻 1M ohm
× 1
蜂鸣器
× 1
LED(通用)
× 1
单圈电位器 - 10k ohms
× 1
跳线(通用)
× 1
面包板(通用)
× 1

关于这个项目

介绍

首先,我应该告诉你,我对电子世界完全陌生。我在编码方面有不错的背景,这很有帮助,但我总是对我创建的任何项目的新想法和建议持开放态度。

最近,我对压电蜂鸣器和所涉及的编码有了更多的了解,这是我根据迄今为止所学知识的创作。新功能或开关的扩展空间很大,我计划稍后再做,但现在要迎接下一个挑战!

下面是该设备如何工作的视频,包括预设歌曲的菜单。我承认,技术上歌曲 4 和 5 是相同的,但我能说的是,我有创造更大更好的东西的冲动,并且为更多歌曲编写音乐代码不是其中之一!主循环和单个歌曲循环的基本编码很容易适应您自己的想法,因此您可以随意更改。

看到它在行动!

如何设置硬件

钢琴键...

钢琴键开关使用电阻梯连接。电阻器按顺序放置,将每个开关连接到电源。对于我的项目,我选择使用(以欧姆为单位)1M、10k、4.7K、1K、560 和 220。第一个钢琴开关(左侧)连接到电源,也连接到电路中的下一个开关。第二个开关连接到最小的电阻器,之后的每个开关连接到串联中的下一个最大的电阻器。最后一个开关通过 10k 欧姆电阻将连接接地,并将所有 7 个开关连接到 Arduino 上的“模拟输入”引脚 A0。主要草图定义了与每个钢琴键相关联的音符频率。对于这个项目,我使用了 C4、D4、E4、F4、G4、A4 和 B4,其中 C4 是最左边的开关。更改频率值,或添加其他开关以完全自定义您自己的项目!

液晶屏...

根据下面的电路图连接 LCD 引脚。将 LCD 引脚 3 连接到电位计以控制屏幕的对比度。电位器的外部引脚连接到电源和地以完成此电路。 LCD 引脚 15 通过 220 欧姆电阻连接到电源。如果这些引脚中的任何一个在您自己的项目中发生变化,请相应地更新代码。

菜单开关...

将菜单开关连接到电源,并通过 10K 欧姆电阻将其接地。此开关也应连接到 Arduino 上的引脚 7,以便您可以通过编码对其进行控制。

LED...

LED用于指示您何时处于“菜单模式”,并且钢琴键已被禁用。一旦按下菜单开关,LED 灯就会亮起。将LED的正极(正极)连接到Arduino的6脚,通过220欧电阻将LED接地。

压电蜂鸣器...

要集成压电蜂鸣器,只需将一端连接到 Arduino 引脚 8,另一端通过 220 欧姆电阻接地。代码中的“tone”函数会寻找这个pin来播放被调用的音符。

代码如何工作

设置...

  • 草图首先导入“LiquidCrystal.h”和“pitches.h”库,以便我们稍后可以在代码中引用它们中的各种项目
  • 接下来,通过定义菜单开关的名称、确定哪些引脚是输入和输出以及为 7 个钢琴键中的每一个设置频率值来设置代码
  • 为每首歌曲创建了一个新标签,以使我的代码更有条理、更易于理解,并在以后进行扩展。如果您想删除或添加更多歌曲,请务必同时更改“电子键盘”主草图中的代码。

主循环...

  • 键盘开始时 LED 关闭,所有钢琴键都处于活动状态
  • 一旦循环检测到菜单按钮已被按下,它将禁用钢琴键并打开 LED 以指示您处于“菜单模式”

访问菜单...

  • 按菜单键循环播放当前歌曲,按任意钢琴键开始播放液晶屏上显示的歌曲
  • LCD 屏幕将显示当前正在播放的歌曲,然后在歌曲播放完毕后返回菜单中的同一点。从那里,您可以重播或继续播放可用歌曲列表。
  • 双击菜单按钮将从头开始重新启动菜单
  • 要返回使用钢琴键,请循环播放菜单中的其余歌曲。一旦 LCD 屏幕黑屏且 LED 熄灭,钢琴键将重新工作。

代码

  • 电子键盘
  • 歌曲1
  • 歌曲2
  • Song3
  • Song4
  • Song5
  • pitches.h
电子键盘Arduino
主要代码
// LCD Screen, Switch &LED Setup#include #include "pitches.h"LiquidCrystal lcd(12, 11, 5, 4, 3, 2);const int LCDswitchPin =7; // 定义菜单/LCD 开关名称int LCDswitchState =0; // 设置菜单/LCD 开关状态为 off/lowint prevLCDswitchState =0;int blueLED =6;int LCDswitchCounter =0; // 菜单按钮按下次数的计数器 //(此代码计算菜单按钮按下的次数,将它们显示在您的计算机上,// 并在结束“菜单模式”后从零开始。目前对此草图没有其他影响 // , 但这是一个很好的起点,可以用 // 以后的新功能扩展项目 // Music Note Keys - Set frequency valuesint notes[] ={262, 294, 330, 349, 392, 440, 494}; // Set注释 C、D、E、F、G、A、B////////////////////////////////// //////////void setup() { Serial.begin(9600); lcd.begin(16, 2); pinMode(LCDswitchPin, INPUT); pinMode(blueLED, OUTPUT); digitalWrite(blueLED, LOW ); // 当钢琴键打开时 LED 保持关闭 } // 结束设置//////////////////////////////// /////////////void loop() { LCDswitchState =digitalRead(LCDswitchPin); int keyVal =analogRead(A0); Serial.println(keyVal); lcd.noDisplay(); digitalWrite(blueLED, LOW); // 每次主循环开始时关闭 LED // ************** 按下菜单按钮时启动“LCDstart” ******** *** if (LCDswitchState ==HIGH) { digitalWrite(blueLED, HIGH); // 打开 LED 显示钢琴键被禁用且设备处于“菜单模式” lcd.display();液晶显示器();液晶启动(); } // **************************************************** ************************ ////// 键盘注释和频率声明 //////// 使用您创建的电阻梯改变每个钢琴键按钮的电压// 220 ohm =C5 // 560 ohm =D5 // 1K ohm =E5 // 等等... if(keyVal ==1023) {tone(8, notes[0]); // C } // 结束 if else if(keyVal>=990 &keyVal <=1010) {tone(8, notes[1]); // D } // 结束 else if else if(keyVal>=960 &&keyVal <=980) {tone(8, notes[2]); // E } // 结束 else if else if(keyVal>=900 &&keyVal <=945) {tone(8, notes[3]); // F } // 结束 else if else if(keyVal>=650 &&keyVal <=710) {tone(8, notes[4]); // G } // 结束 else if else if(keyVal>=500 &&keyVal <=550) {tone(8, notes[5]); // A } // 结束 else if else if(keyVal>=5 &&keyVal <=10) {tone(8, notes[6]); // B } // end else if else if(keyVal <=1) { // 如果没有按下开关,不播放提示音 noTone(8); } // end else if} //结束频率音循环//////////////////////////////////// //////////////void LCDstart() { int keyVal =analogRead(A0); LCDswitchState =digitalRead(LCDswitchPin); // 检查菜单按钮的状态 while (LCDswitchState ==LOW) { // 在未按下菜单按钮时继续循环 LCDswitchState =digitalRead(LCDswitchPin); // 每次循环开始时检查菜单按钮的状态 //**************** START SONG 1 TITLE LOOP ******************* * if (LCDswitchState ==HIGH) { // 如果按下菜单按钮,则... LCDswitchCounter++; // 将按钮计数设置为 1 Serial.print("按钮按下次数:"); Serial.println(LCDswitchCounter);延迟(300); // 分钟。直到计数的时间再增加 1 Song1title();液晶显示器();休息; } //**************** ELSE SHOW MENU **************** else { // 如果没有按下菜单按钮,则... LCD开关计数器=0; // 设置菜单按钮计数为 0 lcd.clear(); lcd.setCursor(0, 0); lcd.print("哪首歌会"); lcd.setCursor(0, 1); lcd.print("你喜欢玩");延迟(50); // 返回主程序 } } // 结束 while } // 结束 LCDstart 循环 // ************* SONG 1 循环从这里开始 ************* * void Song1title() { int keyVal =analogRead(A0); LCDswitchState =digitalRead(LCDswitchPin); // 再次检查菜单按钮的状态 while (LCDswitchState ==LOW) { // 当菜单按钮未被按下时继续循环 LCDswitchState =digitalRead(LCDswitchPin); // 再次检查菜单按钮的状态 //**************** START SONG 2 TITLE LOOP ******************** if ( LCDswitchState ==HIGH) { // 如果按下菜单按钮,则... LCDswitchCounter++; // 将按钮计数设置为 2 Serial.print("按钮按下次数:"); Serial.println(LCDswitchCounter);延迟(300); // 分钟。直到计数的时间再增加 1 Song2title();液晶显示器();休息; } else { // 如果没有按下菜单按钮 int keyVal =analogRead(A0); Serial.println(keyVal); if(keyVal>=2) { digitalWrite(blueLED, LOW);歌曲1();休息; } // 结束 if lcd.clear(); lcd.setCursor(0, 0); lcd.print("超级马里奥兄弟"); lcd.setCursor(0, 1); lcd.print("主题曲");延迟(50); } } // 结束歌曲 1 -> 2 } // 结束歌曲 1 标题循环// ************* 歌曲 2 循环从这里开始 ************* * void Song2title() { int keyVal =analogRead(A0); LCDswitchState =digitalRead(LCDswitchPin); // 再次检查菜单按钮的状态 while (LCDswitchState ==LOW) { // 当菜单按钮未被按下时继续循环 LCDswitchState =digitalRead(LCDswitchPin); // 再次检查菜单按钮的状态 //**************** START SONG 3 TITLE LOOP ******************** if ( LCDswitchState ==HIGH) { // 如果按下菜单按钮,则... LCDswitchCounter++; // 将按钮计数设置为 3 Serial.print("按钮按下次数:"); Serial.println(LCDswitchCounter);延迟(300); // 分钟。直到计数的时间再增加 1 Song3title();液晶显示器();休息; } else { // 如果没有按下菜单按钮 int keyVal =analogRead(A0); Serial.println(keyVal); if(keyVal>=2) { digitalWrite(blueLED, LOW); Song2();休息; } // 结束 if lcd.clear(); lcd.setCursor(0, 0); lcd.print("超级马里奥兄弟"); lcd.setCursor(0, 1); lcd.print("地下世界");延迟(50); } } // 结束歌曲 2 -> 3 } // 结束 Song2title 循环// ************* SONG 3 循环从这里开始 ************* * void Song3title() { int keyVal =analogRead(A0); LCDswitchState =digitalRead(LCDswitchPin); // 再次检查菜单按钮的状态 while (LCDswitchState ==LOW) { // 当菜单按钮未被按下时继续循环 LCDswitchState =digitalRead(LCDswitchPin); // 再次检查菜单按钮的状态 //**************** START SONG 4 TITLE LOOP ******************** if ( LCDswitchState ==HIGH) { // 如果按下菜单按钮,则... LCDswitchCounter++; // 将按钮计数设置为 4 Serial.print("按钮按下次数:"); Serial.println(LCDswitchCounter);延迟(300); // 分钟。直到计数的时间再增加 1 Song4title();液晶显示器();休息; } else { // 如果没有按下菜单按钮 int keyVal =analogRead(A0); Serial.println(keyVal); if(keyVal>=2) { digitalWrite(blueLED, LOW); Song3();休息; } // 结束 if lcd.clear(); lcd.setCursor(0, 0); lcd.print("危险"); lcd.setCursor(0, 1); lcd.print("主题曲");延迟(50); } } // 结束歌曲 3 -> 4 } // 结束 Song3title 循环// ************* SONG 4 循环从这里开始 ************* * void Song4title() { int keyVal =analogRead(A0); LCDswitchState =digitalRead(LCDswitchPin); // 再次检查菜单按钮的状态 while (LCDswitchState ==LOW) { // 当菜单按钮未被按下时继续循环 LCDswitchState =digitalRead(LCDswitchPin); // 再次检查菜单按钮的状态 //**************** START SONG 5 TITLE LOOP ******************** if ( LCDswitchState ==HIGH) { // 如果按下菜单按钮,则... LCDswitchCounter++; // 将按钮计数设置为 5 Serial.print("按钮按下次数:"); Serial.println(LCDswitchCounter);延迟(300); // 分钟。直到计数的时间再增加 1 Song5title();液晶显示器();休息; } else { // 如果没有按下菜单按钮 int keyVal =analogRead(A0); Serial.println(keyVal); if(keyVal>=2) { digitalWrite(blueLED, LOW); Song4();休息; } // 结束 if lcd.clear(); lcd.setCursor(0, 0); lcd.print("SONG 4"); lcd.setCursor(0, 1); lcd.print("这里的标题");延迟(50); } } // 结束歌曲 4 -> 5 } // 结束 Song4title 循环// ************* SONG 5 循环从这里开始 ************* * void Song5title() { int keyVal =analogRead(A0); LCDswitchState =digitalRead(LCDswitchPin); // 再次检查菜单按钮的状态 while (LCDswitchState ==LOW) { // 当菜单按钮未被按下时继续循环 LCDswitchState =digitalRead(LCDswitchPin); // 再次检查菜单按钮的状态 //**************** START SONG 4 TITLE LOOP ******************** if ( LCDswitchState ==HIGH) { // 如果按下菜单按钮,则... LCDswitchCounter=0; // 将按钮计数设置为 0 Serial.print("按钮按下次数:"); Serial.println(LCDswitchCounter);延迟(300); // 分钟。直到计数增加 1 个 lcd.clear() 的时间; } else { // 如果没有按下菜单按钮 int keyVal =analogRead(A0); Serial.println(keyVal); if(keyVal>=2) { digitalWrite(blueLED, LOW); Song5();休息; } // 结束 if lcd.clear(); lcd.setCursor(0, 0); lcd.print("SONG 5"); lcd.setCursor(0, 1); lcd.print("这里的标题");延迟(50); } } // 结束 while 歌曲 4 -> 5 } // 结束 Song5title 循环
Song1Arduino
第一首歌的代码。当前已加载马里奥兄弟主题曲。
//***************** SONG 1 NOTES HERE *************** ***********///////////////////////////////////// ////////////////////////////////////////////////// ///////////////////// 可以在此处找到有关如何创建 MARIO 歌曲的完整教程://////////// /////////////////// http://www.linuxcircle.com/2013/03/31/playing-mario-bros-tune-with-arduino-and -压电蜂鸣器/ /////////////////////////////////////////// ////////////////////////////////////////////////// ////////void Song1() { lcd.clear();// 旋律中的音符:int melody[] ={ NOTE_E7, NOTE_E7, 0, NOTE_E7, 0, NOTE_C7, NOTE_E7, 0, NOTE_G7, 0、0、0、NOTE_G6、0、0、0、NOTE_C7、0、0、NOTE_G6、0、0、NOTE_E6、0、0、NOTE_A6、0、NOTE_B6、0、NOTE_AS6、NOTE_A6、0、NOTE_G6、NOTE_E7、 NOTE_G7、NOTE_A7、0、NOTE_F7、NOTE_G7、0、NOTE_E7、0、NOTE_C7、NOTE_D7、NOTE_B6、0、0、NOTE_C7、0、0、NOTE_G6、0、0、NOTE_E6、0、0、NOTE_A6、B6、0、NOTE_A6、0、 0、NOTE_AS6、NOTE_A6、0、NOTE_G6、NOTE_E7、NOTE_G7 , NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0, NOTE_C7, NOTE_D7, NOTE_B6, 0, 0};//音符持续时间:4 =四分音符,8 =八分音符,等等:int noteDurations[] ={ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1 12, 12, 12, 12, 12, 12, 12, 9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, }; lcd.setCursor(1, 0); lcd.print("正在播放..."); lcd.setCursor(0, 1); lcd.print("马里奥主题曲"); int size =sizeof(melody) / sizeof(int); for (int thisNote =0; thisNote  
Song2Arduino
第二首歌的代码。当前已加载 Mario Bros Underworld Song。
//***************** SONG 2 NOTES HERE *************** ***********///////////////////////////////////// ////////////////////////////////////////////////// ///////////////////// 可以在此处找到有关如何创建 MARIO 歌曲的完整教程://////////// /////////////////// http://www.linuxcircle.com/2013/03/31/playing-mario-bros-tune-with-arduino-and -压电蜂鸣器/ /////////////////////////////////////////// ////////////////////////////////////////////////// ////////void Song2() { lcd.clear();// 旋律中的音符:int melody[] ={ NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4, NOTE_AS3, NOTE_AS4, 0, 0, NOTE_C4, NOTE_C5、NOTE_A3、NOTE_A4、NOTE_AS3、NOTE_AS4、0、0、NOTE_F3、NOTE_F4、NOTE_D3、NOTE_D4、NOTE_DS3、NOTE_DS4、0、0、NOTE_F3、NOTE_F4、NOTE_D3、NOTE_D4、NOTE_DS3、CS、NOTE_DS4、NOTE_DS3、NOTE_DS4、NOTE_DS4 NOTE_D4、NOTE_CS4、NOTE_DS4、NOTE_DS4、NOTE_GS3、NOTE_G3、NOTE_CS4、NOTE_C4、NOTE_FS4、NOTE_F4、NOTE_E3、NOTE_AS4、NOTE_A4、NOTE_GS4、 NOTE_DS4, NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_GS3, 0, 0, 0};//音符持续时间:4 =四分音符,8 =八分音符,等等:int noteDurations[] ={ 12, 12, 12, 12, 12 , 12, 6, 3, 12, 12, 12, 12, 12, 12, 6, 3, 12, 12, 12, 12, 12, 12, 6, 3, 12, 12, 12, 12, 12, 12 , 6, 6, 18, 18, 18, 6, 6, 6, 6, 6, 6, 18, 18, 18, 18, 18, 18, 10, 10, 10, 10, 10, 10, 3, 3 , 3}; lcd.setCursor(1, 0); lcd.print("正在播放..."); lcd.setCursor(0, 1); lcd.print("马里奥地下世界"); int size =sizeof(melody) / sizeof(int); for (int thisNote =0; thisNote  
Song3Arduino
第三首歌的代码。当前已加载 Jeopardy 主题曲。
//***************** SONG 3 NOTES HERE **************** **********void Song3() { lcd.clear();// 旋律中的音符:int melody[] ={ NOTE_C2, NOTE_F3, NOTE_C3, NOTE_A2, NOTE_A2, NOTE_C3, NOTE_F3, NOTE_C3, NOTE_C3、NOTE_F3、NOTE_C3、NOTE_F3、NOTE_AS3、NOTE_G3、NOTE_F3、NOTE_E3、NOTE_D3、NOTE_CS3、NOTE_C2、NOTE_F3、NOTE_C3、NOTE_A2、NOTE_A2、//重复第一行和第二行NOTE_C3、NOTE_F3、NOTE_F3、NOTE_F3、NOTE_F3、NOTE_30 , NOTE_E3, NOTE_D3, NOTE_CS3, NOTE_C3};// 音符持续时间:4 =四分音符,8 =八分音符,等等:int noteDurations[] ={ 4, 4, 4, 8, 8, 4, 4, 2, 4, 4, 4, 4, 3, 8, 8, 8, 8, 8, 4, 4, 4, 8, 8, // 重复第一行和第二行 4, 4, 2, 4, 8, 8, 4 , 4, 4, 4, 4, 4, 0}; lcd.setCursor(1, 0); lcd.print("正在播放..."); lcd.setCursor(0, 1); lcd.print("危险"); for (int thisNote =0; noteDurations[thisNote] !=0; thisNote++) { // 计算音符持续时间,用一秒 // 除以音符类型。 //例如。四分音符 =1000 / 4,八分音符 =1000/8,等等 int noteDuration =2000/noteDurations[thisNote];音调(8,旋律[thisNote],noteDuration * 0.9); // 为了区分音符,设置它们之间的最短时间。 // 音符的持续时间 + 30% 似乎效果很好: //int pauseBetweenNotes =noteDuration * 1.30; //延迟(pauseBetweenNotes);延迟(注意持续时间); }Song3title(); } // 结束 Song3 循环
Song4Arduino
第四首歌的代码。当前加载了一个简短的通用旋律。
//***************** SONG 4 NOTES HERE *************** ***********void Song4() { lcd.clear();// 旋律中的音符:int melody[] ={ NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 };// 音符持续时间:4 =四分音符,8 =八分音符,等等:int noteDurations[] ={ 4, 8, 8, 4, 4, 4, 4, 4}; lcd.setCursor(1, 0); lcd.print("正在播放..."); lcd.setCursor(0, 1); lcd.print("SONG 4 TITLE"); int thisNote =0; // 要计算音符持续时间,用一秒 // 除以音符类型。 //例如。四分音符 =1000 / 4,八分音符 =1000/8,等等 for (int thisNote =0; thisNote <8; thisNote++) { // 计算音符时长,用一秒 // 除以音符类型。 //例如。四分音符 =1000 / 4,八分音符 =1000/8,等等 int noteDuration =1000 / noteDurations[thisNote];音调(8,旋律[thisNote],noteDuration); // 为了区分音符,设置它们之间的最短时间。 // 音符的持续时间 + 30% 似乎效果很好: int pauseBetweenNotes =noteDuration * 1.30;延迟(pauseBetweenNotes);无音(8); // 停止播放音调: } // 结束 forSong4title(); } // 结束Song4循环
Song5Arduino
第五首歌的代码。当前加载了一个简短的通用旋律。
//***************** SONG 5 NOTES HERE *************** ***********void Song5() { lcd.clear();// 旋律中的音符:int melody[] ={ NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 };// 音符持续时间:4 =四分音符,8 =八分音符,等等:int noteDurations[] ={ 4, 8, 8, 4, 4, 4, 4, 4}; lcd.setCursor(1, 0); lcd.print("正在播放..."); lcd.setCursor(0, 1); lcd.print("SONG 5 TITLE"); int thisNote =0; // 要计算音符持续时间,用一秒 // 除以音符类型。 //例如。四分音符 =1000 / 4,八分音符 =1000/8,等等 for (int thisNote =0; thisNote <8; thisNote++) { // 计算音符时长,用一秒 // 除以音符类型。 //例如。四分音符 =1000 / 4,八分音符 =1000/8,等等 int noteDuration =1000 / noteDurations[thisNote];音调(8,旋律[thisNote],noteDuration); // 为了区分音符,设置它们之间的最短时间。 // 音符的持续时间 + 30% 似乎效果很好: int pauseBetweenNotes =noteDuration * 1.30;延迟(pauseBetweenNotes);无音(8); // 停止播放音调: } // 结束 forSong5title(); } // 结束 Song5 循环
pitches.hArduino
歌曲的音乐笔记库。保存在与其他键盘/歌曲草图相同的文件夹中。
//******************************** *****************//** 定义音乐音符//************************ *************************#define NOTE_B0 31#define NOTE_C1 33#define NOTE_CS1 35#define NOTE_D1 37#define NOTE_DS1 39#define NOTE_E1 41#定义 NOTE_F1 44#define NOTE_FS1 46#define NOTE_G1 49#define NOTE_GS1 52#define NOTE_A1 55#define NOTE_AS1 58#define NOTE_B1 62#define NOTE_C2 65#define NOTE_CS2 69#define NOTE_D2 73#define NOTE_DS2E#define NOTE_DS2E7 87#define NOTE_FS2 93#define NOTE_G2 98#define NOTE_GS2 104#define NOTE_A2 110#define NOTE_AS2 117#define NOTE_B2 123#define NOTE_C3 131#define NOTE_CS3 139#define NOTE_D3 147#define NOTE_GS2 104#define NOTE_AS2 117#define NOTE_C3 147#define NOTE_D3 147#define NOTE_AS2 15#定义16定义 NOTE_FS3 185#define NOTE_G3 196#define NOTE_GS3 208#define NOTE_A3 220#define NOTE_AS3 233#define NOTE_B3 247#define NOTE_C4 262#define NOTE_CS4 277#define NOTE_D4 294#define NOTE_DS4E#define NOTE_AS3 233#define NOTE_DS4F 349#define NOTE_FS4 370#define NOTE_G4 392#define NOTE_GS4 415#define NOTE_A4 440#define NOTE_AS4 466#define NOTE_B4 494#define NOTE_C5 523#define NOTE_CS5 554#define NOTE_G4 392#define NOTE_GS4 415#define NOTE_A4 466#define NOTE_B4 494#define NOTE_C5 523#define NOTE_CS5 554#define NOTE_D5 585#define 5 EDS#define 5 EDS_A4 NOTE_AS4定义 NOTE_FS5 740#define NOTE_G5 784#define NOTE_GS5 831#define NOTE_A5 880#define NOTE_AS5 932#define NOTE_B5 988#define NOTE_C6 1047#define NOTE_CS6 1109#define NOTE_D6 1175#define NOTE2#define16EFS#define 16E16NOTE_A5NOTE_AS5 932#define NOTE_FRE 1480#define NOTE_G6 1568#define NOTE_GS6 1661#define NOTE_A6 1760#define NOTE_AS6 1865#define NOTE_B6 1976#define NOTE_C7 2093#define NOTE_CS7 2217#define NOTE_GS6 1661#define NOTE_A6 NOTE_AS6 1865#define NOTE_B6 1976#define NOTE_C7 2093#define NOTE_CS7 2217#define NOTE_D7 2349#define 37 EFS#define 27 EFS27 EFS_7 FNOTE_define 27 EFS_7 FRE定义 NOTE_G7 3136#define NOTE_GS7 3322#define NOTE_A7 3520#define NOTE_AS7 3729#define NOTE_B7 3951#define NOTE_C8 4186#define NOTE_CS8 4435#define NOTE_D8 4699#define NOTE_DS8 4978 

示意图


制造工艺

  1. TJBot 入门
  2. 干渴警报植物警报
  3. 意大利字时钟
  4. Arduino + LEDs + MIDI 键盘 + MuseScore =Piano Tutor
  5. 带有 Arduino 的简单障碍物传感器
  6. Sigfox kWh Meter
  7. 蓝牙温度监视器
  8. 带有 RDA5807 的迷你立体声收音机
  9. 手势控制锁
  10. 伴侣 IC
  11. USB MIDI 适配器
  12. 测量你的反应时间