美国国歌与灯光
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 6 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
|
关于这个项目
在过去的一年里,我开始为最终的圣诞灯饰和音乐项目编程。这是一个有人让我做的副项目,并认为它会很有趣。最初这只是一首带灯的歌曲,但这只是蹩脚的。
这是一个链接,以防您对视频有疑问:
https://youtu.be/C2jyn80Mjus
该项目使用 Arduino Nano。在这个项目中,我使用两个不同的按钮使用 Tone() 函数来做两首不同的歌曲。一种是“冲锋”声,另一种是“美国国歌”。在按下按钮之前,它会做一些随机的照明效果。
在这个草图中,我大量使用函数来简化我的函数编写过程,但保持对灯光/声音过程的完全控制,所以如果我不喜欢我听到/看到的东西,我可以毫不费力地做一些小的调整.
我发布这个项目的目标是分享我在设计/编码中学到的一些东西,这样如果你正在做类似的事情,这会有所帮助。
这是我在测试系统和代码时在试验板上的初始设计。
这是电源系统设置。我选择 9 伏电池的大小,不依赖于 USB 墙壁或计算机电源。
这就是从内部焊接所有东西后的样子。强烈建议只焊接顶盖,然后再添加侧面
代码
- USA_ANTHEM_Updated.ino
USA_ANTHEM_Updated.inoArduino
带有 LED、充电、音调和所有功能的星条旗。只需复制和粘贴。频率(Hz)的整数,&持续时间(n中的时间)-LED在编写函数时由我自己半随机选择-函数被构建为随着每次播放而增加音调(在启动/硬件重置时重置为正常音调)-音调计算为整体的 1/12 或 0.06 按钮设计/接线-每个通道上的 3 个红色、蓝色和绿色 LED 组,包括 2 个并联。-外部复位按钮-用于歌曲中断歌曲充电的开始按钮* ///**************************************************** *************** 声明的整数 const int ChargeButton=3; //(Nano D3) uno pin 2 应该是interupt pin const int StartButton=5; //(Nano D5) uno pin 4 const int BuzzerPin=9; //(Nano D9) uno pin 9 const int RedLED=6; //(Nano D6) uno pin 6 const int WhiteLED=7; //(Nano D7) uno pin 7 const int BlueLED=8; //(Nano D8) uno pin 8 int n=1000; //声明这个值将随着每首歌曲而改变的整数 int DurationOn=n; //后面的声明整数将用于stacatto计算 int DurationRest=n; //稍后声明整数将用于 stacatto 计算 //x &y 的总和应该是 1 我稍后在 float x=.66 上对此有更多说明; //在浮动 y=.34 上声明浮动时间; //声明浮动时间关闭 //等待按钮输入时灯随机闪烁的速率 int Twinkle_Rate=250; //请注意,如果大幅增加按钮可能不会在 100% 的时间内响应 //较低的闪烁率可提高按钮按下响应 //为按钮状态设置整数 int StartButtonState; int ChargeButtonState; //注意中间C是4C(降B和降E) int Note1=233; //3Bb 233Hz int Note2=294; //4D 294Hz int Note3=330; //4E 330Hz int Note4=349; //4F 349Hz int Note5=392; //4G 392Hz int Note6=440; //4A 440Hz int Note7=466; //4Bb 466Hz int Note8=523; //5C 523Hz int Note9=587; //5D 587Hz int Note10=622; //5Eb 622Hz int Note11=698; //5F 698Hz //******************************************** ******************充电功能/Songvoid Charge(){ n=600; //歌曲进展的速率 //格式:写入引脚,特定频率的音调(这种方式不受国歌结束时的变化,稍后会详细介绍),延迟与相同的时间音调同步音乐,//写针(s)关闭并延迟休息digitalWrite(RedLED,HIGH);音调(BuzzerPin,392,n/3);延迟(n/3);数字写入(红色LED,低);延迟(70);数字写入(WhiteLED,高);音调(BuzzerPin,523,n/3);延迟(n/3);数字写入(WhiteLED,低);延迟(70);数字写入(BlueLED,高);音调(BuzzerPin,659,n/3);延迟(n/3);数字写入(BlueLED,低);延迟(70);数字写入(红色LED,高);数字写入(WhiteLED,高);数字写入(BlueLED,高);音调(BuzzerPin,784,n*3/4);延迟(n*3/4);数字写入(BlueLED,低);数字写入(红色LED,低);数字写入(WhiteLED,低);延迟(70);数字写入(BlueLED,高);音调(BuzzerPin,659,n/4);延迟(n/4);数字写入(BlueLED,低);延迟(70);数字写入(红色LED,高);数字写入(WhiteLED,高);数字写入(BlueLED,高);音调(蜂鸣器引脚,784,n*2);延迟(n*2);数字写入(BlueLED,低);数字写入(红色LED,低);数字写入(WhiteLED,低);延迟(70);}//********************************************** ********************SingleDW functionvoid SingleDWwithNote(int HZ, int TurnOn, int Duration, int Staccato){ //音符所在的赫兹 (参考 Note#) / /turn on=pin (red/white/blue LED) that will betuned on //duration is a long // Staccato 1=yes, 0=no 导致音符稍微缩短,或者高 int x 值只是一个短暂停顿 if (Staccato==1){DurationOn=Duration*x;} //音调和灯光亮多久是 DurationShort else if (Staccato==0){DurationOn=Duration;} digitalWrite(TurnOn, HIGH);音调(BuzzerPin,HZ,DurationOn);延迟(持续时间);数字写入(开启,低); if (Staccato==1) { DurationRest=Duration*y;延迟(DurationRest); }}//**************************************************** ****************美国国歌功能/Songvoid USNationalAnthem(){ n=577; //声音播放的速率计算自:60,000 (ms/BPM factor) / 104 BPM =577 ms /* 四分音符值为 n*2 个八分音符中的 n 个半音符值 n/2 个八分音符为 n*3 /4 */ //x &y 整数用于断奏/在音符后添加休止符 //注意 x+y 必须 =1 或 int。 n rate 将被抛弃 // 减少 x 并增加 y 虽然使音符更加发音和跳跃/乐观 x=.92; //真正的断奏大约是 1/2 或 2/3 的值,所以对于真正的断奏 y=.08,x 值大约在 0.5 到 0.7 之间; //1.00-.92(x value) =.08 //第 1-5 条,第 1 行 SingleDWwithNote(Note4, RedLED, n*3/4, 1); SingleDWwithNote(Note2, WhiteLED, n/4, 1); SingleDWwithNote(Note1, RedLED, n, 1); SingleDWwithNote(Note2, WhiteLED, n, 1); SingleDWwithNote(Note4, RedLED, n, 1); SingleDWwithNote(Note7, WhiteLED, n*2, 1); SingleDWwithNote(Note9, BlueLED, n*3/4, 1); SingleDWwithNote(Note8, WhiteLED, n/4, 1); SingleDWwithNote(Note7, RedLED, n, 1); SingleDWwithNote(Note2, WhiteLED, n, 1); SingleDWwithNote(Note3, BlueLED, n, 1); SingleDWwithNote(Note4, RedLED, n*2, 1); SingleDWwithNote(Note4, RedLED, n/2, 1); SingleDWwithNote(Note4, RedLED, n/2, 1); //bar6-9 line 2 SingleDWwithNote(Note9, BlueLED, n*3/2, 1); SingleDWwithNote(Note8, WhiteLED, n/2, 1); SingleDWwithNote(Note7, RedLED, n, 1); SingleDWwithNote(Note6, BlueLED, n*2, 1); SingleDWwithNote(Note5, WhiteLED, n/2, 1); SingleDWwithNote(Note6, BlueLED, n/2, 1); SingleDWwithNote(Note7, RedLED, n, 1); SingleDWwithNote(Note7, RedLED, n, 1); SingleDWwithNote(Note4, BlueLED, n, 1); SingleDWwithNote(Note2, WhiteLED, n, 1); SingleDWwithNote(Note1, BlueLED, n, 1); SingleDWwithNote(Note4, RedLED, n*3/4, 1); SingleDWwithNote(Note2, WhiteLED, n/4, 1); //bars 10-13 line 3 SingleDWwithNote(Note1, RedLED, n, 1); SingleDWwithNote(Note2, WhiteLED, n, 1); SingleDWwithNote(Note4, RedLED, n, 1); SingleDWwithNote(Note7, WhiteLED, n*2, 1); SingleDWwithNote(Note9, BlueLED, n*3/4, 1); SingleDWwithNote(Note8, WhiteLED, n/4, 1); SingleDWwithNote(Note7, RedLED, n, 1); SingleDWwithNote(Note2, WhiteLED, n, 1); SingleDWwithNote(Note3, BlueLED, n, 1); SingleDWwithNote(Note4, RedLED, n*2, 1); SingleDWwithNote(Note4, RedLED, n/2, 1); SingleDWwithNote(Note4, RedLED, n/2, 1); //第 14-17 栏,第 4 行,第 1 页结束 SingleDWwithNote(Note9, BlueLED, n*3/2, 1); SingleDWwithNote(Note8, WhiteLED, n/2, 1); SingleDWwithNote(Note7, RedLED, n, 1); SingleDWwithNote(Note6, BlueLED, n*2, 1); SingleDWwithNote(Note5, WhiteLED, n/2, 1); SingleDWwithNote(Note6, BlueLED, n/2, 1); SingleDWwithNote(Note7, RedLED, n, 1); SingleDWwithNote(Note7, RedLED, n, 1); SingleDWwithNote(Note4, BlueLED, n, 1); SingleDWwithNote(Note2, WhiteLED, n, 1); SingleDWwithNote(Note1, RedLED, n, 1); SingleDWwithNote(Note9, BlueLED, n/2, 1); SingleDWwithNote(Note9, BlueLED, n/2, 1); //第 18-21 栏,第 5 行,第 2 页的开始 SingleDWwithNote(Note9, BlueLED, n, 1); SingleDWwithNote(Note10, RedLED, n, 1); SingleDWwithNote(Note11, WhiteLED, n, 1); SingleDWwithNote(Note11, WhiteLED, n*2, 1); SingleDWwithNote(Note10, RedLED, n/2, 1); SingleDWwithNote(Note9, BlueLED, n/2, 1); SingleDWwithNote(Note8, WhiteLED, n, 1); SingleDWwithNote(Note9, BlueLED, n, 1); SingleDWwithNote(Note10, RedLED, n, 1); SingleDWwithNote(Note10, RedLED, n*2, 1); SingleDWwithNote(Note10, RedLED, n, 1); //第 22-25 条,第 6 行 SingleDWwithNote(Note9, WhiteLED, n*3/2, 1); SingleDWwithNote(Note8, BlueLED, n/2, 1); SingleDWwithNote(Note7, WhiteLED, n, 1); SingleDWwithNote(Note6, RedLED, n*2, 1); SingleDWwithNote(Note5, BlueLED, n/2, 1); SingleDWwithNote(Note6, RedLED, n/2, 1); SingleDWwithNote(Note7, WhiteLED, n, 1); SingleDWwithNote(Note2, BlueLED, n, 1); SingleDWwithNote(Note3, RedLED, n, 1); SingleDWwithNote(Note4, WhiteLED, n*2, 1); SingleDWwithNote(Note4, RedLED, n, 1); n=n*1.08; //60,000 / 96 bpm =625 毫秒;只是稍微延迟//第 26-28 条,第 7 行 SingleDWwithNote(Note7, WhiteLED, n, 1); SingleDWwithNote(Note7, WhiteLED, n, 1); SingleDWwithNote(Note7, WhiteLED, n/2, 1); SingleDWwithNote(Note6, BlueLED, n/2, 1); SingleDWwithNote(Note5, RedLED, n, 1); SingleDWwithNote(Note5, RedLED, n, 1); SingleDWwithNote(Note5, RedLED, n, 1); SingleDWwithNote(Note8, WhiteLED, n, 1); SingleDWwithNote(Note10, RedLED, n/2, 1); SingleDWwithNote(Note9, BlueLED, n/2, 1); SingleDWwithNote(Note8, WhiteLED, n/2, 1); SingleDWwithNote(Note7, RedLED, n/2, 1); //bars 29-30 SingleDWwithNote(Note7, RedLED, n, 1); SingleDWwithNote(Note6, BlueLED, n*2, 1); //2x 用于持有 SingleDWwithNote(Note4, RedLED, n/2, 1); SingleDWwithNote(Note4, RedLED, n/2, 1); SingleDWwithNote(Note7, BlueLED, n*3/2, 1); SingleDWwithNote(Note8, WhiteLED, n/2, 1); SingleDWwithNote(Note9, BlueLED, n/2, 1); SingleDWwithNote(Note10, RedLED, n/2, 1); n=n*1.2; //大延迟//小节31-34首歌曲结尾SingleDWwithNote(Note11, WhiteLED, n*2, 1); //额外保留免费的SingleDWwithNote(Note7, RedLED, n/2, 1); SingleDWwithNote(Note8, WhiteLED, n/2, 1); SingleDWwithNote(Note9, BlueLED, n*3/2, 1); SingleDWwithNote(Note10, RedLED, n/2, 1); SingleDWwithNote(Note8, WhiteLED, n, 1); SingleDWwithNote(Note7, RedLED, n*3, 1); //仅保留 3 个值 //将所有音符按 3 个步骤调整 //1.06 源自音乐理论。以赫兹为单位记笔记,然后除以 // 它下面的音符(升和降都算作一个音符)整整为 1.06 //您可以删除下一段以避免频率变化,或者如果您想要 Note1=Note1 则将其更改*1.06*1.06*1.06;注2=注2*1.06*1.06*1.06;注3=注3*1.06*1.06*1.06;注4=注4*1.06*1.06*1.06;注5=注5*1.06*1.06*1.06;注6=注6*1.06*1.06*1.06; Note7=Note7*1.06*1.06*1.06;注8=注8*1.06*1.06*1.06;注9=注9*1.06*1.06*1.06; Note10=Note10*1.06*1.06*1.06; Note11=Note11*1.06*1.06*1.06;}/***************************************** *************************Twinkle void Twinkle(int Twinkle_Time) //在()中放置一个数字显示闪烁发生的时间{ //built这个函数用于另一个用途,所以它有一个奇怪的开始不必要的计算//将时间和速率更改为一个较小的整数,注意它前端舍入了 Twinkle_Time=Twinkle_Time/Twinkle_Rate; // 在这种情况下 Tiwkle Time is =to Twinkle Rate 所以值是 1 for(Twinkle_Time;Twinkle_Time>0;Twinkle_Time--) //因为值是 1 只处理一次 { int B=random(1,4); // 1、2 或 3 的随机整数 int C=random(1,4); // 1、2 或 3 的随机整数 //如果两个整数相同则没有问题,只有一个 LED 亮起,增加了随机性 //评估每个整数以在特定颜色的 LED 上运行 if(B==1){ digitalWrite(RedLED, HIGH);} if(B==2){digitalWrite(WhiteLED, HIGH);} if(B==3){digitalWrite(BlueLED, HIGH);} if(C==1){digitalWrite( RedLED, HIGH);} if(C==2){digitalWrite(WhiteLED, HIGH);} if(C==3){digitalWrite(BlueLED, HIGH);} delay(Twinkle_Rate);// 保持 LED 点亮一段时间设置一段时间 //然后我们将相应的 LED 写为低电平。冷可能简化并且只写所有 3 个低可能会加快计时 if(B==1){digitalWrite(RedLED, LOW);} if(B==2){digitalWrite(WhiteLED, LOW);} if(B==3){digitalWrite(BlueLED, LOW);} if(C==1){digitalWrite(RedLED, LOW);} if(C==2){digitalWrite(WhiteLED, LOW);} if(C==3) {digitalWrite(BlueLED, LOW);} }}/***************************************** *************************Setupvoid setup(){ pinMode(ChargeButton, INPUT_PULLUP); //作为输入并启用按钮 pinMode(StartButton, INPUT_PULLUP) 的内部上拉电阻; //作为输入并启用按钮 pinMode(RedLED, OUTPUT) 的内部上拉电阻; //LED 配置为输出 pinMode(WhiteLED, OUTPUT); //LED 配置为输出 pinMode(BlueLED, OUTPUT); //LED 配置为输出 pinMode(BuzzerPin, OUTPUT); //蜂鸣器配置为输出 //digitalWrite(ChargeButton, HIGH);没有必要,因为它作为上拉启用,它只是多余的 //digitalWrite(StartButton, HIGH);没有必要,因为它作为上拉启用,它只是多余的 // 将所有 LED 设置为低电平以避免任何错误。对于我的设计 HIGH=ON, LOW=OFF digitalWrite(RedLED, LOW);数字写入(WhiteLED,低);数字写入(BlueLED,低); } //**************************************************** ***************Main Loopvoid loop(){ // 读取按钮状态,引脚连接到配置为高电平的内部电阻 // 按下时引脚将处于低电平 StartButtonState =digitalRead(StartButton); //low=pressed ChargeButtonState =digitalRead(ChargeButton); //low=pressed //针对整数进行评估以执行第一个被抵抗为低的功能引脚 //读取按钮的采样率是int twinkle_rate(.25秒) if (StartButtonState==LOW){USNationalAnthem();} else if (ChargeButtonState==LOW){Charge();} else{Twinkle(Twinkle_Rate);} // 如果没有按下引脚,则闪烁!再...再...再...再... }示意图
使用面包板显示电气连接 无需焊接即可显示接线 跟着线路走! 显示每件商品的成本、总成本和购买地点。制造工艺