Arduino Uno R3开发第二天
来源于https://www.jianshu.com/p/c5f8a8fe0181
3.通过蜂鸣器播放音乐
以下是天空之城的代码,来自https://blog.csdn.net/weixin_40973138/article/details/103872414?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242
但是他这个代码我复制进去没有声音
//对应音符和频率值
#define NOTE_D0 -1
#define NOTE_DL1 261
#define NOTE_DL2 293
#define NOTE_DL3 311
#define NOTE_DL4 349
#define NOTE_DL5 391
#define NOTE_DL6 440
#define NOTE_DL7 493
#define NOTE_D1 523
#define NOTE_D2 587
#define NOTE_D3 659
#define NOTE_D4 698
#define NOTE_D5 783
#define NOTE_D6 880
#define NOTE_D7 987
#define NOTE_DH1 1046
#define NOTE_DH2 1174
#define NOTE_DH3 1318
#define NOTE_DH4 1396
#define NOTE_DH5 1567
#define NOTE_DH6 1760
#define NOTE_DH7 1975
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
/********** 这部分是用英文对应了拍子 **********/
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
/******************************************/
/* 这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数 */
int tune[] = {
NOTE_D0,NOTE_D0,NOTE_D0,NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3,
NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D3,NOTE_D4,NOTE_D3,NOTE_D4,NOTE_DH1,
NOTE_D3,NOTE_D3,NOTE_D0,NOTE_DH1,NOTE_DH1,NOTE_DH1,NOTE_D7,NOTE_D4,NOTE_D4,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D0,NOTE_D6,NOTE_D7,
NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,
NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D2,NOTE_D3,NOTE_D4,NOTE_DH1,NOTE_D7,NOTE_D7,NOTE_DH1,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH3,NOTE_DH1,NOTE_DH1,NOTE_DH1,
NOTE_DH1,NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D7,NOTE_D5,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_DH1,NOTE_DH2,NOTE_DH3,NOTE_DH2,NOTE_DH3,NOTE_DH5,
NOTE_DH2,NOTE_DH2,NOTE_DH2,NOTE_D5,NOTE_D5,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,
NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH2,NOTE_DH2,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_DH4,NOTE_DH3,NOTE_DH2,NOTE_DH1,
NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5,NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,NOTE_DH1,
NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH5,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5,
NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,NOTE_DH1,NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D7
};
/****************************************************/
/* 这部分是整首曲子的接拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的) */
float duration[]= {
1,1,1,0.5,0.5, 1+0.5,0.5,1,1, 1,1,1,0.5,0.5,
1+0.5,0.5,1,1, 1,1,1,1, 1+0.5,0.5,1,1,
1,1,0.5,0.5,0.5,0.5, 1+0.5,0.5,1,1, 1,1,1,0.5,0.5,
1+0.5,0.5,1,1, 1,1,1,0.5,0.5, 1+0.5,0.5,1,1,
1,1,1,0.5,0.5, 1,0.5,0.25,0.25,0.25,0.5, 0.5,0.5,0.5,0.25,0.5,1,
0.5,0.5,0.5,0.5,1,1, 1,1,1,0.5,0.5, 1+0.5,0.5,1,1,
1,1,1,0.5,0.5, 1.5,0.5,1,1, 1,1,1,1,
0.5,0.5,1,1,0.5,0.5, 1.5,0.25,0.5,1, 1,1,1,1,
1,1,1,1, 1,1,1,1, 0.5,0.5,1,1,0.5,0.5,
1,0.5,0.5,1,1, 1,1,1,1, 1,1,1,1,
0.5,0.5,1,1,0.5,0.5, 1,0.5,0.25,0.5,1, 1,1,1,0.5,0.5
};
int length;//定义一个变量用来表示共有多少个音符
int tonePin = 8; //蜂鸣器的pin
void setup()
{
pinMode(tonePin, OUTPUT); //设置蜂鸣器的pin为输出模式
length = sizeof(tune) / sizeof(tune[0]); //这里用了一个sizeof函数,查出数组里有多少个音符
}
void loop()
{
for (int x = 0; x < length; x++) //循环音符的次数
{
tone(tonePin, tune[x]); //依次播放tune数组元素,即每个音符
delay(500 * duration[x]); //每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快
noTone(tonePin);//停止当前音符,进入下一音符
}
delay(5000);//等待5秒后,循环重新开始
}
4.呼吸灯
来源于https://www.jianshu.com/p/c5f8a8fe0181
原理:利用PWM脉宽调制来控制亮度
Pulse Width Modulation 就是通常所说的PWM,译为脉冲宽度调制,简称脉宽调制。脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法,由于计算机不能输出模拟电压,只能输出0 或5V 的的数字电压值,我们就通过使用高分辨率计数器,利用方波的占空比被调制的方法来对一个具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么是5V(ON),要么是0V(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM 进行编码。输出的电压值是通过通和断的时间进行计算的。输出电压=(接通时间/脉冲时间)*最大电压值
PWM 被用在许多地方,调光灯具、电机调速、声音的制作等等。
下面介绍一下PWM 的三个基本参数:
1、脉冲宽度变化幅度(最小值/最大值)
2、脉冲周期(1 秒内脉冲频率个数的倒数)
3、电压高度(例如:0V-5V)
①按照以下进行连接
②将代码敲入
int ledPin = 3;
void setup ()
{
pinMode(ledPin,OUTPUT);
}
void loop()
{
for (int a=0; a<=255;a++) //循环语句,控制PWM亮度的增加
{
analogWrite(ledPin,a);
delay(8); //当前亮度级别维持的时间,单位毫秒
}
for (int a=255; a>=0;a--) //循环语句,控制PWM亮度减小
{
analogWrite(ledPin,a);
delay(8); //当前亮度的维持的时间,单位毫秒
}
}
③解释说明
analogWrite()
analogWrite(pin, value)
在指定引脚输出指定占空比的PWM方波
参数:
pin:输出引脚
value:占空比,取0-255
5.PWM调光
4已经说过了PWM原理,可以去翻看一下
现在直接开始吧
①如下连接
②代码如下
int potpin=0;//定义模拟接口0
int ledpin=11;//定义数字接口11(PWM 输出)
int val=0;// 暂存来自传感器的变量数值
void setup()
{
pinMode(ledpin,OUTPUT);//定义数字接口11 为输出
Serial.begin(9600);//设置波特率为9600
//注意:模拟接口自动设置为输入
}
void loop()
{
val=analogRead(potpin);// 读取传感器的模拟值并赋值给val
Serial.println(val);//显示val 变量
analogWrite(ledpin,val/4);// 打开LED 并设置亮度(PWM 输__________出最大值255)
delay(10);//延时0.01 秒
}
解释说明
analogRead()
analogRead(pin)
读取指定模拟引脚的值。
参数:模拟输入引脚。
返回:0到1024之间的整数。
在 这里有必要解释一下各个接线端了
GND:电线接地端
电位器:电位器是可变电阻的一种
通过旋转旋钮改变2号脚位置,从而改变2号脚到两端的阻值。实验中将1脚和3脚分别接到开发板的5V和GND,再通过模拟输入引脚A0来读取电位器2号脚分得的电压,其范围在0V和5V之间。
此实验如下
5.感光灯
①如下进行连接
②代码如下
int potpin=0;//定义模拟接口0 连接光敏电阻
int ledpin=11;//定义数字接口11 输出PWM 调节LED 亮度
int val=0;//定义变量val
void setup()
{
pinMode(ledpin,OUTPUT);//定义数字接口11 为输出
Serial.begin(9600);//设置波特率为9600
}
void loop()
{
val=analogRead(potpin);//读取传感器的模拟值并赋值给val
Serial.println(val);//显示val 变量数值
analogWrite(ledpin,val);// 打开LED 并设置亮度(PWM 输出最大值255)
delay(10);//延时0.01 秒
}
③解释说明
光敏电阻:光照越强,阻值越小
工作解释:
此处光照越小,阻值越大,LED越亮
//因为刚开始学,我猜测的话,LED和光敏电阻处于并联,光照越强,光敏电阻越大,上面电压越大
//而与LED串联的电阻,阻值越小,LED越亮,因为阻值越小通过LED的电流越大,所以越亮
6.火焰报警器
①如下图连接
②代码如下
int beep = 8;//定义蜂鸣器接口为数字8 接口
int flameVal = 0; //存储火焰传感器数据
void setup() {
pinMode(beep, OUTPUT); //定义beep 为输出接口
}
void loop() {
flameVal = analogRead(A0); //读取火焰传感器的模拟值
if (flameVal >= 200) //当模拟值大于200时蜂鸣器鸣响,阈值根据实际测试进行修改
{
digitalWrite(beep, HIGH);//
}
else
{
digitalWrite(beep, LOW);
}
}
③解释说明
火焰传感器(即红外接收三极管)是机器人专门用来搜寻火源的传感器,本传感器对火焰特别灵敏。实物如图:
原理
火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号,输入到中央处理器,中央处理器根据信号的变化做出相应的程序处理。
工作状态:
当火焰靠近时,发出警报,可以自己修改临界值