本实验根据温度传感器的温度变化,利用蜂鸣器播放歌曲
当温度超过30度时,自动播放歌曲葫芦娃
蜂鸣器分为有源蜂鸣器和无源蜂鸣器,这里采用的是无源蜂鸣器
温度传感器(DS18B20)
无源蜂鸣器与Arduino UNO开发板的连接
温度传感器与Arduino UNO开发板的连接
最后用USB线将Arduino UNO开发板与电脑连接
链接:https://downloads.arduino.cc/arduino-1.8.9-windows.zip
链接:https://github.com/zwj-state/Arduino-Uno.git
描述:
源码文件:Active.ino
库:Arduino-Temperature-Control-Library-master.zip
库:OneWire.zip
导入源码:文件-打开
导入库(上一步骤中的库):项目-加载库-添加.zip库
通过对温度传感器的操作,改变温度,使得蜂鸣器播放/不播放音乐
这里是引用
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float tempC = 0;
#define NOTE_D0 -1
#define NOTE_D1 262
#define NOTE_D2 293
#define NOTE_D3 329
#define NOTE_D4 349
#define NOTE_D5 392
#define NOTE_D6 440
#define NOTE_D7 494
#define NOTE_DL1 147
#define NOTE_DL2 165
#define NOTE_DL3 175
#define NOTE_DL4 196
#define NOTE_DL5 221
#define NOTE_DL6 248
#define NOTE_DL7 278
#define NOTE_DH1 523
#define NOTE_DH2 586
#define NOTE_DH3 658
#define NOTE_DH4 697
#define NOTE_DH5 783
#define NOTE_DH6 879
#define NOTE_DH7 987
//以上部分是定义是把每个音符和频率值对应起来,这里用NOTE_D+数字表示音符,NOTE_DH+数字表示上面有点的那种音符,NOTE_DL+数字表示下面有点的那种音符。
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
//这部分是用英文对应拍子
int tune[] =
{
NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,
NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,NOTE_D6,
NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,NOTE_D6,
NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,
NOTE_D1,NOTE_D1,NOTE_D3,
NOTE_D1,NOTE_D1,NOTE_D3,NOTE_D0,
NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,
NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,
NOTE_DH1,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,
NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,
NOTE_D7,NOTE_D7,NOTE_D5,NOTE_D3,
NOTE_D5,
NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,
NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,
NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,
NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,
NOTE_D3,NOTE_D3,NOTE_D1,NOTE_DL6,
NOTE_D1,
NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,
NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,
NOTE_DH1,NOTE_D0,NOTE_D7,NOTE_D5,
NOTE_D6,
};
//这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数
float duration[]=
{
1,1,0.5,0.5,1,
0.5,0.5,0.5,0.5,1,0.5,0.5,
0.5,1,0.5,1,0.5,0.5,
0.5,0.5,0.5,0.5,1,1,
1,1,1+1,
0.5,1,1+0.5,1,
1,1,0.5,0.5,1,
0.5,1,1+0.5,1,
0.5,0.5,0.5,0.5,1+1,
0.5,1,1+0.5,1,
1+1,0.5,0.5,1,
1+1+1+1,
0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25,
0.5,1,0.5,1,1,
0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25,
0.5,1,0.5,1,1,
1+1,0.5,0.5,1,
1+1+1+1,
0.5,1,0.5,1+1,
0.5,1,0.5,1+1,
1+1,0.5,0.5,1,
1+1+1+1
};
//这部分是整首曲子的节拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应)
int length;//这里定义一个变量,后面用来表示共有多少个音符
int tonePin=9;//蜂鸣器的pin
void setup()
{
pinMode(tonePin,OUTPUT);//设置蜂鸣器的pin为输出模式
length = sizeof(tune)/sizeof(tune[0]);//这里用了一个sizeof函数,可以查出tone序列里有多少个音符
ensors.begin();//启动单总线
Serial.begin(9600);//波特率设置为9600
}
void loop()
{
sensors.requestTemperatures();//获取温度值
tempC = sensors.getTempCByIndex(0);//将温度的值赋给tempC
delay(1000);//等待5秒后
Serial.println(tempC);//输出温度值
if(tempC>30)//当温度超过30度,蜂鸣器开始播放葫芦娃
{
for(int x=0;x<length;x++)
{
tone(tonePin,tune[x]);//此函数依次播放tune序列里的数组,即每个音符
delay(400*duration[x]);//每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快
noTone(tonePin);//停止当前音符,进入下一音符
}
delay(5000);//等待5秒后,循环重新开始
}
}
原代码来源:
Arduino Uno 送你一首葫芦娃 无源蜂鸣器实验: https://blog.csdn.net/ling3ye/article/details/56490163
如何用Arduino UNO和DS18B20防水传感器制作一个温度计: https://www.yiboard.com/forum.php?mod=viewthread&tid=1099&highlight=ds18b20