Arduino 蜂窝器实验 与进阶实验
快速学会用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); }

相关新闻

CSDN官方Markdown语句

CSDN官方Markdown语句

食用方法 使用方法:找到原文档,下载后保存到csdn的草稿箱,点击编辑并切换到markdown编辑器,即有Markdown和预览的对照,直观了解markdown文档的使用;平替版教程:Markdown编辑器使用教程也可使用A…

2026/5/17 12:25:54 阅读更多 →
5分钟上手oh-my-logo:打造专属终端ASCII艺术徽标

5分钟上手oh-my-logo:打造专属终端ASCII艺术徽标

5分钟上手oh-my-logo:打造专属终端ASCII艺术徽标 【免费下载链接】oh-my-logo Display giant ASCII-art logos with colorful gradients in your terminal — like Claude Code or Gemini CLI. 项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-logo oh-m…

2026/5/17 12:25:54 阅读更多 →
0142-基于单片机-直流电机自控-系统设计(数码管+AD0832+DA0808+MAX7219)

0142-基于单片机-直流电机自控-系统设计(数码管+AD0832+DA0808+MAX7219)

功能描述1、采用51单片机作为主控,控制直流电机并测速; 2、两种驱动模式,通过按键进行切换; 3、自动模式:AD0832检测输入电压强度,控制DA0808输出强度,改变转速; 4、手动控制&#x…

2026/7/4 20:50:10 阅读更多 →

最新新闻

电机控制进阶——PID速度环参数整定实战与调优

电机控制进阶——PID速度环参数整定实战与调优

1. PID速度环控制基础概念 第一次接触电机PID控制时,我盯着那三条看似简单的曲线发愣——比例、积分、微分,这三个数学概念怎么就能让电机转速乖乖听话呢?后来在实验室熬了三个通宵才明白,PID控制就像教小朋友骑自行车&#xff1a…

2026/7/5 5:41:44 阅读更多 →
Meshroom完整指南:免费开源3D重建软件从入门到精通

Meshroom完整指南:免费开源3D重建软件从入门到精通

Meshroom完整指南:免费开源3D重建软件从入门到精通 【免费下载链接】Meshroom Node-based Visual Programming Toolbox 项目地址: https://gitcode.com/gh_mirrors/me/Meshroom 你是否曾想过,能否将手机拍摄的普通照片变成逼真的3D模型&#xff1…

2026/7/5 5:41:44 阅读更多 →
企业级接口自动化测试框架搭建:基于pytest+requests+Allure+YAML实战

企业级接口自动化测试框架搭建:基于pytest+requests+Allure+YAML实战

1. 项目概述:为什么我们需要一个企业级接口自动化框架? 在当前的软件研发流程中,接口作为前后端、微服务之间通信的基石,其稳定性和正确性直接决定了整个系统的质量。如果你还在用 Postman 手动点来点去,或者写一堆零…

2026/7/5 5:37:43 阅读更多 →
MeshLab终极指南:3D网格处理从入门到精通完整教程

MeshLab终极指南:3D网格处理从入门到精通完整教程

MeshLab终极指南:3D网格处理从入门到精通完整教程 【免费下载链接】meshlab The open source mesh processing system 项目地址: https://gitcode.com/gh_mirrors/me/meshlab 你是否曾经面对杂乱无章的3D扫描数据感到束手无策?或者想要优化模型却…

2026/7/5 5:33:41 阅读更多 →
三步搞定开源DPS统计工具:深度解析《碧蓝幻想:Relink》战斗数据

三步搞定开源DPS统计工具:深度解析《碧蓝幻想:Relink》战斗数据

三步搞定开源DPS统计工具:深度解析《碧蓝幻想:Relink》战斗数据 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: https://gitcode.com/gh_mirrors/gb…

2026/7/5 5:33:41 阅读更多 →
硅光人才需求暴涨,光电融合赛道四家优质企业全景解读

硅光人才需求暴涨,光电融合赛道四家优质企业全景解读

在人工智能与高性能计算的驱动下,数据中心对芯片算力的需求呈指数级增长。然而,一个核心瓶颈日益凸显:连接这些算力芯片的数据互连技术,其发展速度已难以跟上算力增长的步伐,传统铜缆电互连技术难以匹配高带宽、低功耗…

2026/7/5 5:33:41 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻