本帖最后由 lxf 于 2020-8-17 13:36 编辑
目标
1、了解音乐中的音调和节拍 2、掌握音乐的制作方法 3、制作一闪一闪亮晶晶的部分音乐
实验材料
Arduino UNO开发板 蜂鸣器模块 配套USB数据线 配套杜邦线若干 Arduino IDE软件
内容
音调:中音1(do):0 低音1下面一点:-1 高音1上面一点:1 节拍:1 2 3 4 每个音符为1拍,用数字1表示 3 4 5 - 5-为2拍,用2表示 56 54 56和54各占1拍,每个音符上的节拍为0.5拍,用0.5表示
“一闪一闪亮晶晶”部分简谱
接线图
接线方式
Arduino UNO <------> 蜂鸣器模块 5V <------> VCC GND <------> GND D8 <------> IO
程序实现代码
- float Reference_Note[]={1046.5,1174.7,1318.5,1396.9,1568,1760,1975.5}; //创建一个浮点型的Reference_Note基准音数组
- int Musical_note[]={1,1,5,5,6,6,5,4,4,3,3,2,2,1,5,5,4,4,3,3,2,5,5,4,4,3,3,2}; //创建一个整型Musical_note音符数组
- int Beat[]={1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2}; //创建一个整型Beat节拍数组
- int pitch[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //创建一个整型pitch音调数组
- void setup(){
- pinMode(8, OUTPUT); //定义8号数字管脚类型为输出
- }
- void loop(){
- for (int i = (1); i <= (sizeof(Musical_note)/sizeof(Musical_note[0])); i = i + (1)) { //获取 Musical_note音符数组的长度,并进行循环
- tone(8,Reference_Note[(int)(Musical_note[(int)(i - 1)] - 1)] * pow(2, pitch[(int)(i - 1)])); //获取每个音符的音调,并通过8号引脚//蜂鸣器进行播放
- delay((500 * Beat[(int)(i - 1)])); //对应每个音符的发音节拍
- noTone(8); //8号管脚蜂鸣器不响,防止连音
- delay(10); //防止连音
- }
- delay(1000); //全部播放完后延迟等待1000ms
- }
复制代码
sizeof()
sizeof操作符返回一个变量的字节数,或者返回数组占用的字节数。
语法
sizeof(variable)
参数
variable: 任何变量类型或数组(如int,float,byte)
示例程序1:
sizeof操作符用来处理数组非常有效。它能很方便的改变数组的大小而不破坏程序的其他部分。
以下程序一次打印出一个字符串文本的字符。你可以试着改变一下以下程序中第一行语句的字符串内容,看一看运行结果的变化。
- char myStr[] = "this is a test";
- int i;
- void setup(){
- Serial.begin(9600);
- }
- void loop() {
- for (i = 0; i < sizeof(myStr) - 1; i++){
- Serial.print(i, DEC);
- Serial.print(" = ");
- Serial.write(myStr[i]);
- Serial.println();
- }
- delay(5000);
- }
复制代码
运行结果:
示例程序2:
sizeof操作符也可以用来判断各种变量类型所占用的Arduino内存情况。以下示例程序显示几种变量类型所占用的字节大小。
- void setup() {
- Serial.begin(9600);
- bool boolVar;
- byte byteVar;
- int intVar;
- float floatVar;
- long longVar;
- Serial.print("sizeof(boolVar) = ");
- Serial.println(sizeof(boolVar));
- Serial.print("sizeof(byteVar) = ");
- Serial.println(sizeof(byteVar));
- Serial.print("sizeof(intVar) = ");
- Serial.println(sizeof(intVar));
- Serial.print("sizeof(floatVar) = ");
- Serial.println(sizeof(floatVar));
- Serial.print("sizeof(longVar) = ");
- Serial.println(sizeof(longVar));
- }
- void loop() {
- }
复制代码
运行结果:
|