快速学会用Arduino 做蜂窝器实验 与进阶实验一.实验效果视频VID2025111321585465684adec8f7518fb02b49e0522e二.Arduino 蜂窝器实验**1.必须的组件**Arduino UNO 控制板有源蜂鸣器2.在frizing的模拟的连接图**3.实验的代码**const int buzzerPin 3; //蜂鸣器模块连接引脚10 void setup() { pinMode(buzzerPin,OUTPUT); } void loop() { tone(buzzerPin,532); //播放频率532赫兹的音符do delay(100); tone(buzzerPin,587); //播放频率587赫兹的音符re delay(100); tone(buzzerPin,659); //播放频率659赫兹的音符mi delay(100); }4.tone()函数说明**tone()函数可以产生固定频率的PWM信号来驱动扬声器发声。发声时间长度和声调都可以通过参数控制。定义发声时间长度有两种方法第一种是通过tone()函数的参数来定义发声时长另一种是使用noTone()函数来停止发声。如果您在使用tone()函数时没有定义发声时间长度那么除非您通过noTone()函数来停止声音否则Arduino将会一直通过tone()函数产生声音信号。Arduino一次只能产生一个声音。假如Arduino的某一个引脚正在通过tone()函数产生发声信号那么此时让Arduino使用另外一个引脚通过tone()函数发声是不行的。5.注意点**对于Arduino Mega以外的控制器使用tone()函数时会影响引脚3和引脚11的PWM信号输出。如果你想要使用不同的引脚产生不同的声音音调每一次更换发声引脚以前都要使用noTone函数停止上一个引脚发声。Arduino是不支持两个引脚同时发声的。三.进阶实验**1.把原来的代码换成这个**const int buzzerPin 3; // 蜂鸣器连接引脚 // 定义蜜蜂相关的音符频率 #define NOTE_BEE_LOW 440 // 蜜蜂低频音A4 #define NOTE_BEE_MID 880 // 蜜蜂中频音A5比低频高八度 #define NOTE_BEE_HIGH 1760 // 蜜蜂高频音A6比中频高八度 #define NOTE_ALARM 1047 // 警报音C6 void setup() { pinMode(buzzerPin, OUTPUT); Serial.begin(9600); // 初始化串口用于调试输出 Serial.println(蜜蜂声音实验开始...); // 实验序列依次演示不同的蜜蜂声音模式 experimentStartupSound(); // 启动提示音 delay(1000); experimentNormalBeeSound(3); // 正常蜜蜂声音重复3次 delay(1000); experimentDisturbedBeeSound(); // 被干扰的蜜蜂声音 delay(1000); experimentSwarmSound(); // 蜂群声音 delay(1000); experimentQueenBeeCall(); // 蜂王召唤声 } void loop() { // 循环执行核心实验序列 experimentNormalBeeSound(2); // 正常声音重复2次 delay(2000); experimentDisturbedBeeSound(); // 干扰声音 delay(3000); } // 自定义函数启动提示音 void experimentStartupSound() { Serial.println(播放启动提示音); playNote(NOTE_BEE_MID, 300); delay(100); playNote(NOTE_BEE_HIGH, 300); noTone(buzzerPin); // 停止发声 } // 自定义函数正常蜜蜂声音 // 参数repeat - 重复次数 void experimentNormalBeeSound(int repeat) { Serial.print(播放正常蜜蜂声音重复); Serial.print(repeat); Serial.println(次); for(int i 0; i repeat; i){ // 模拟蜜蜂持续的嗡嗡声低频与中频交替节奏平缓 for(int j 0; j 5; j){ playNote(NOTE_BEE_LOW, 150); playNote(NOTE_BEE_MID, 150); } delay(500); // 每次循环间隔 } noTone(buzzerPin); } // 自定义函数被干扰的蜜蜂声音 void experimentDisturbedBeeSound() { Serial.println(播放被干扰的蜜蜂声音); // 被干扰时声音更急促、音调更高高频警报音交替 for(int i 0; i 10; i){ playNote(NOTE_BEE_HIGH, 50); playNote(NOTE_ALARM, 50); } noTone(buzzerPin); } // 自定义函数蜂群声音 void experimentSwarmSound() { Serial.println(播放蜂群声音); // 模拟多个蜜蜂同时发声频率渐变模拟群体层次感 for(int i 0; i 8; i){ playNote(NOTE_BEE_LOW i*50, 200); // 频率从低到高渐变 } noTone(buzzerPin); } // 自定义函数蜂王召唤声 void experimentQueenBeeCall() { Serial.println(播放蜂王召唤声); // 蜂王声音更低沉、节奏更慢比低频音更低持续时间长 for(int i 0; i 3; i){ playNote(NOTE_BEE_LOW - 100, 400); // 比低频音低100Hz delay(200); // 间隔时间 } noTone(buzzerPin); } // 基础工具函数播放指定音符 // 参数frequency - 频率(Hz)duration - 持续时间(毫秒) void playNote(int frequency, int duration) { tone(buzzerPin, frequency); // 输出指定频率的方波 delay(duration); // 保持声音持续时间 }2.实验说明**定义了多个与蜜蜂相关的音符频率让声音更贴合实验主题实现了多个自定义函数每个函数对应不同的蜜蜂声音模式启动提示音实验开始的提示正常蜜蜂声音模拟蜜蜂平静时的嗡嗡声被干扰的蜜蜂声音模拟蜜蜂被打扰时的急促声音蜂群声音模拟大量蜜蜂聚集时的声音蜂王召唤声模拟蜂王发出的低频召唤声基础播放函数用于统一控制音符播放增加了串口输出功能可以在串口监视器中看到当前正在播放的声音类型在 setup () 中执行了一套完整的实验演示序列在 loop () 中循环播放部分声音模式四.实验拓展1.这两个实验你观察到什么现象蜂鸣器发出的声音不同当发出的频率不同时发出的声音也不同2. #define 是什么如何理解语法又是怎样的**。#define 是 C/C 中的预处理指令预处理阶段执行的命令主要用于定义宏Macro。它的核心作用是在代码编译前让编译器用预先定义的内容替换代码中所有出现的宏名相当于 “文本替换” 工具。用途定义常量如引脚号、数值。简化重复代码如常用表达式。实现条件编译结合 #ifdef 等指令。合理使用 #define 可以让代码更简洁、易维护但需注意其 “无类型、纯替换” 的特性避免隐藏错误。// 定义数值常量 #define PI 3.1415926 #define MAX_SIZE 100 // 定义字符串 #define GREET Hello, World! // 定义代码片段简化重复操作 #define LED_ON digitalWrite(LED_PIN, HIGH)3.你怎么理解experimentNormalBeeSound函数里面两个for循环的。**第一个循环是重复蜜蜂嗡嗡声次数第二个循环是控制蜜蜂声音节奏4. 上述代码该有些点可以优化**。常量定义优化使用constexpr替代#define提供更好的类型安全和作用域控制参数集中管理将循环次数等参数提取为常量便于统一调整而无需修改多处代码代码可读性提升增加NOTE_QUEEN常量避免魔法数字使用printf简化串口输出代码增加注释说明各部分功能功能封装新增stopSound()函数统一处理停止发声逻辑提高可维护性鲁棒性增强添加while (!Serial)确保串口就绪后再输出适合需要等待串口连接的场景代码一致性统一各声音函数的结构和停止声音的方式const int buzzerPin 3; // 蜂鸣器连接引脚 // 定义音符频率常量使用constexpr增强类型安全 constexpr int NOTE_BEE_LOW 440; // 蜜蜂低频音A4 constexpr int NOTE_BEE_MID 880; // 蜜蜂中频音A5 constexpr int NOTE_BEE_HIGH 1760; // 蜜蜂高频音A6 constexpr int NOTE_ALARM 1047; // 警报音C6 constexpr int NOTE_QUEEN NOTE_BEE_LOW - 100; // 蜂王声音 // 声音参数配置集中管理便于调整 constexpr int NORMAL_REPEAT_LOOP 5; // 正常声音循环次数 constexpr int DISTURBED_REPEAT 10; // 干扰声音重复次数 constexpr int SWARM_STEPS 8; // 蜂群声音阶梯数 constexpr int QUEEN_REPEAT 3; // 蜂王声音重复次数 void setup() { pinMode(buzzerPin, OUTPUT); Serial.begin(9600); while (!Serial); // 等待串口就绪对部分板卡必要 Serial.println(蜜蜂声音实验开始...); // 实验序列执行 experimentStartupSound(); delay(1000); experimentNormalBeeSound(3); delay(1000); experimentDisturbedBeeSound(); delay(1000); experimentSwarmSound(); delay(1000); experimentQueenBeeCall(); } void loop() { // 循环执行核心实验序列 experimentNormalBeeSound(2); delay(2000); experimentDisturbedBeeSound(); delay(3000); } // 启动提示音 void experimentStartupSound() { Serial.println(播放启动提示音); playNote(NOTE_BEE_MID, 300); delay(100); playNote(NOTE_BEE_HIGH, 300); stopSound(); // 显式停止声音 } // 正常蜜蜂声音 // 参数repeat - 重复次数 void experimentNormalBeeSound(int repeat) { Serial.printf(播放正常蜜蜂声音重复%d次\n, repeat); for(int i 0; i repeat; i){ // 模拟蜜蜂持续的嗡嗡声 for(int j 0; j NORMAL_REPEAT_LOOP; j){ playNote(NOTE_BEE_LOW, 150); playNote(NOTE_BEE_MID, 150); } delay(500); } stopSound(); } // 被干扰的蜜蜂声音 void experimentDisturbedBeeSound() { Serial.println(播放被干扰的蜜蜂声音); // 更急促、音调更高的声音 for(int i 0; i DISTURBED_REPEAT; i){ playNote(NOTE_BEE_HIGH, 50); playNote(NOTE_ALARM, 50); } stopSound(); } // 蜂群声音 void experimentSwarmSound() { Serial.println(播放蜂群声音); // 频率渐变模拟群体层次感 for(int i 0; i SWARM_STEPS; i){ playNote(NOTE_BEE_LOW i*50, 200); } stopSound(); } // 蜂王召唤声 void experimentQueenBeeCall() { Serial.println(播放蜂王召唤声); // 更低沉、节奏更慢的声音 for(int i 0; i QUEEN_REPEAT; i){ playNote(NOTE_QUEEN, 400); delay(200); } stopSound(); } // 播放指定音符 void playNote(int frequency, int duration) { tone(buzzerPin, frequency); delay(duration); } // 停止声音封装停止逻辑便于统一修改 void stopSound() { noTone(buzzerPin); }**5. 如果我不要playNote函数了该如何修改代码从而达 到相同的效果**。**如果不需要 playNote() 函数只需将原本调用 playNote(frequency, duration) 的地方直接替换为 tone(buzzerPin, frequency) 和 delay(duration) 这两行代码即可核心逻辑完全不变const int buzzerPin 3; // 蜂鸣器连接引脚 // 定义蜜蜂相关的音符频率 #define NOTE_BEE_LOW 440 // 蜜蜂低频音A4 #define NOTE_BEE_MID 880 // 蜜蜂中频音A5比低频高八度 #define NOTE_BEE_HIGH 1760 // 蜜蜂高频音A6比中频高八度 #define NOTE_ALARM 1047 // 警报音C6 void setup() { pinMode(buzzerPin, OUTPUT); Serial.begin(9600); // 初始化串口用于调试输出 Serial.println(蜜蜂声音实验开始...); // 实验序列依次演示不同的蜜蜂声音模式 experimentStartupSound(); // 启动提示音 delay(1000); experimentNormalBeeSound(3); // 正常蜜蜂声音重复3次 delay(1000); experimentDisturbedBeeSound(); // 被干扰的蜜蜂声音 delay(1000); experimentSwarmSound(); // 蜂群声音 delay(1000); experimentQueenBeeCall(); // 蜂王召唤声 } void loop() { // 循环执行核心实验序列 experimentNormalBeeSound(2); // 正常声音重复2次 delay(2000); experimentDisturbedBeeSound(); // 干扰声音 delay(3000); } // 自定义函数启动提示音 void experimentStartupSound() { Serial.println(播放启动提示音); // 替换 playNote(NOTE_BEE_MID, 300) tone(buzzerPin, NOTE_BEE_MID); delay(300); delay(100); // 原有的间隔不变 // 替换 playNote(NOTE_BEE_HIGH, 300) tone(buzzerPin, NOTE_BEE_HIGH); delay(300); noTone(buzzerPin); // 停止发声 } // 自定义函数正常蜜蜂声音 // 参数repeat - 重复次数 void experimentNormalBeeSound(int repeat) { Serial.print(播放正常蜜蜂声音重复); Serial.print(repeat); Serial.println(次); for(int i 0; i repeat; i){ // 模拟蜜蜂持续的嗡嗡声低频与中频交替节奏平缓 for(int j 0; j 5; j){ // 替换 playNote(NOTE_BEE_LOW, 150) tone(buzzerPin, NOTE_BEE_LOW); delay(150); // 替换 playNote(NOTE_BEE_MID, 150) tone(buzzerPin, NOTE_BEE_MID); delay(150); } delay(500); // 每次循环间隔 } noTone(buzzerPin); } // 自定义函数被干扰的蜜蜂声音 void experimentDisturbedBeeSound() { Serial.println(播放被干扰的蜜蜂声音); // 被干扰时声音更急促、音调更高高频警报音交替 for(int i 0; i 10; i){ // 替换 playNote(NOTE_BEE_HIGH, 50) tone(buzzerPin, NOTE_BEE_HIGH); delay(50); // 替换 playNote(NOTE_ALARM, 50) tone(buzzerPin, NOTE_ALARM); delay(50); } noTone(buzzerPin); } // 自定义函数蜂群声音 void experimentSwarmSound() { Serial.println(播放蜂群声音); // 模拟多个蜜蜂同时发声频率渐变模拟群体层次感 for(int i 0; i 8; i){ int freq NOTE_BEE_LOW i*50; // 计算当前频率 // 替换 playNote(freq, 200) tone(buzzerPin, freq); delay(200); } noTone(buzzerPin); } // 自定义函数蜂王召唤声 void experimentQueenBeeCall() { Serial.println(播放蜂王召唤声); // 蜂王声音更低沉、节奏更慢比低频音更低持续时间长 for(int i 0; i 3; i){ int queenFreq NOTE_BEE_LOW - 100; // 蜂王频率 // 替换 playNote(queenFreq, 400) tone(buzzerPin, queenFreq); delay(400); delay(200); // 间隔时间不变 } noTone(buzzerPin); }