Arduino Uno R3开发(1)——据说通过蜂鸣器可以播放《鸡你太美》?
昨天写了一篇RFID开发,但是视频课程太难,只能从更基础的Arduino Uno R3 开发进行学习一起进行Arduino Uno R3的学习吧,我之前从未接触硬件第一步Arduino驱动的安装,以及环境的搭建此处跳转到Arduino论坛,有详细步骤第二步操刀干1.第一行代码...
昨天写了一篇RFID开发,但是视频课程太难,只能从更基础的Arduino Uno R3 开发进行学习
一起进行Arduino Uno R3的学习吧,我之前从未接触硬件
如果奔着鸡你太美来的直接翻到最后
第一步Arduino驱动的安装,以及环境的搭建
第二步操刀干
1.第一行代码
输入R,输入Hello world,在PC端
以下会出现的名词(先大致了解)
波特率:波特率表示每秒钟传送的码元符号的个数,它是对符号传输速率的一种度量,它用单位时间内载波调制状态改变的次数来表示,1波特即指每秒传输1个符号(选自百度百科)
①步骤
先通过USB数据线将Arduino和电脑连接起来
然后打开Arduino软件,输入下述代码
最后进行编译上传
点击工具-》串口监视器-》在发送栏发送R,会看到开发板进行一次闪烁,并输出Hello world
出现错误的话,点击这里有解决方案
int val;//定义变量val
int ledpin=13;//定义数字接口13
void setup()
{
Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。
pinMode(ledpin,OUTPUT);//设置数字13 口为输出接口,Arduino 上我们用到的I/O 口都要进行类似这样的定义。
}
void loop()
{
val=Serial.read();//读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val
if(val=='R')//判断接收到的指令或字符是否是“R”。
{
//如果接收到的是“R”字符
digitalWrite(ledpin,HIGH);//点亮数字13 口LED。
delay(500);//延时500ms
digitalWrite(ledpin,LOW);//熄灭数字13 口LED
delay(500);//延时500ms
Serial.println("Hello World!");//显示“Hello World!”字符串
}
}
②解释说明
每次新建一个文件,会将代码部分直接分为如下两部分
void setup(){
//put your setup code here, to run once;
}
void loop(){
//put you main code here, to run repeatedly
}
setup()代码部分解释翻译就是,只会执行一次
loop()代码部分解释翻译就是,会不断地循环执行
pinMode()
void pinMode (pin, mode)设置引脚模式
配置引脚为输出或输出模式.
参数:
pin 引脚编号
mode: INPUT, OUTPUT, 或 INPUT_PULLUP.
digitalWrite()
void digitalWrite (pin, value)
写数字引脚, 对应引脚的高低电平. 在写引脚之前, 需要将引脚设置为OUTPUT模式.
参数:
pin: 引脚编号
value: HIGH 或 LOW
begin()
Serial.begin (speed)打开串口
参数:
speed: 波特率
read()
Serial.read()
读串口数据,read()继承自Stream实用类。
print()
往串口发数据,无换行 描述 以人类可读的ASCII码形式向串口发送数据,该函数有多种格式。整数的每一数位将以ASCII码形式发送。浮点数同样以ASCII码形式发送,默认保留小数点后两位。字节型数据将以单个字符形式发送。字符和字符串会以其相应的形式发送
println()
往串口发数据,类似Serial.print(),但有换行
delay()
dalay(time)
延时time个毫秒
参数
time:毫秒数
2.交通灯
①将板子如图连好
②敲入以下代码
int redled = 10;//定义数字10的接口
int yellowled = 7;//定义7的接口
int greenled = 4;//定义4的接口
setup(){
pinMode(redled,OUTPUT);//定义红色小灯接口为输出接口
pinMode(yellowled,OUTPUT);//定义黄色小灯接口为输出接口
pinMode(greenled,OUTPUT);//定义绿色小灯接口为输出接口
}
void loop(){
digitalWrite(greenled, HIGH);//点亮绿色小灯
delay(5000);//延时5秒
digitalWrite(greenled, LOW);//熄灭绿色小灯
for(int i=0;i<3;i++){
delay(500);
digitalWrite(yellowled,HIGH);//点亮黄色小灯
delay(500);//延时0.5秒
digitalWrite(yellowled,LOW);//点亮黄色小灯
}
delay(500);
digitalWrite(redled, HIGH);//点亮红色小灯
delay(5000);//延时5秒
digitalWrite(redled,LOW);//点亮红色小灯
}
3.按键控制LED灯点亮、熄灭
①按照下图将板子连好
②将下述代码敲入
int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val
void setup()
{
pinMode(ledpin,OUTPUT);//定义小灯接口为输出接口
pinMode(inpin,INPUT);//定义按键接口为输入接口
}
void loop()
{
val=digitalRead(inpin);//读取数字7 口电平值赋给val
if(val==LOW)//检测按键是否按下,按键按下时小灯亮起
{
digitalWrite(ledpin,LOW);}
else{
digitalWrite(ledpin,HIGH);}
}
③解释说明
当按键按下时,按钮处为通路,就会在7接口形成高电平,此时就会使数字11接口产生高电平,从而使led灯发亮
当按键松开时,按钮处为开路,7接口就会是低电平,数字11接口仍然会保持低电平,led熄灭
点击跳转Arduino函数参考手册
digitalRead()
int digitalRead (pin)
读数字引脚, 返回引脚的高低电平. 在读引脚之前, 需要将引脚设置为INPUT模式.
参数:
pin 引脚编号
返回:
HIGH或LOW
利用蜂鸣器播放音乐
①如图连接好
②将以下代码敲入
int
buzzer=8;//设置控制蜂鸣器的数字IO脚
void
setup()
{
pinMode(buzzer,OUTPUT);//设置数字IO脚模式,OUTPUT为辒出
}
void
loop()
{
unsigned char i,j;//定义变量
while(1)
{
for(i=0;i<80;i++)//辒出一个频率的声音
{
digitalWrite(buzzer,HIGH);//发声音
delay(1);//延时1ms
digitalWrite(buzzer,LOW);//不发声音
delay(1);//延时ms
}
for(i=0;i<100;i++)//辒出另一个频率癿声音
{
digitalWrite(buzzer,HIGH);//发声音
delay(2);//延时2ms
digitalWrite(buzzer,LOW);//不发声音
delay(2);//延时2ms
}
}
}
③将以下代码敲入可以播放葫芦娃(将蜂鸣器换成无源蜂鸣器)
代码来源于,已经过修改
//对应音符和频率值
#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
//整首曲子的音符部分
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,
};
//曲子的节拍,即音符持续时间
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
};
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(400 * duration[x]); //每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快
noTone(tonePin);//停止当前音符,进入下一音符
}
delay(5000);//等待5秒后,循环重新开始
}
④解释说明:
tone()
tone(pin, frequency, duration)
在指定引脚产生指定频率的方波,可用于蜂鸣器或扬声器播放音调。
参数:
pin:产生音调的引脚。
frequency:音调频率,单位赫兹。
duration:音调持续时间(毫秒单位),此参数可不写。
noTone()
noTone(pin)
停止产生方波。
参数
pin:需要停止产生音调的引脚。
博主补充,我扒了下鸡你太美的谱子,但是播放出来总是怪怪的应该是没有扒正确,扒出来好多没有想象中那么欢乐,他好多都是空拍。
/*
BUZZER2
使用无源蜂鸣器播放《葫芦娃》
*/
//对应音符和频率值
#define M0 -1
#define L2 261
#define L2 293
#define L3 311
#define L4 349
#define L5 391
#define L6 440
#define L7 493
#define M1 523
#define M2 587
#define M3 659
#define M4 698
#define M5 783
#define M6 880
#define M7 987
#define H1 1046
#define H2 1174
#define H3 1318
#define H4 1396
#define H5 1567
#define H6 1760
#define H7 1975
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
//整首曲子的音符部分
int tune[] =
{
M0, L6, M3, M3, M6, M0,
M0, M0, L6, L6, M0, M0,
M0, L6, M3, M3, M6, M0,
M0, M0, L6, L6, M0, M0, L6,
M3, M3, M3, M3, M3, M6, M0,
M0, M0, L6, L6, M0, M0,
M0, L6, M3, M3, M6, M0,
M0, M0, L6, L6, M0, M0,
M0, M0
};
//曲子的节拍,即音符持续时间
float duration[] =
{
0.5, 0.5, 0.5, 0.5, 1, 1,
1, 0.5, 0.25, 0.25, 1, 1,
0.5, 0.5, 0.5, 0.5, 1, 1,
1, 0.5, 0.25, 0.25, 1, 0.5, 0.5,
0.5, 0.5, 0.5, 0.5, 1, 1,
1, 0.5, 0.25, 0.25, 1, 1,
0.5, 0.5, 0.5, 0.5, 1, 1,
1, 0.5, 0.25, 0.25, 1, 0.5, 0.5,
2, 2
};
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(600 * duration[x]); //每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快
noTone(tonePin);//停止当前音符,进入下一音符
}
delay(5000);//等待5秒后,循环重新开始
}
//
// 1, 1, 0.5, 0.5, 0.5,0.5,
// 1.5, 0.25, 0.25+0.5, 0.25,0.25+0.5, 0.25, 0.25+0.5,
// 0.25, 0.25+0.5, 0.25, 0.25+0.5, 0.5, 0.5, 0.5,
// 1.5, 0.25, 0.25+0.5, 0.25, 0.25+0.5, 0.25,0.25+0.5,
//
// 0.25, 0.25+0.5, 0.25, 0.25+0.5, 0.5, 0.5, 0.5,
// 1.5, 0.25, 0.25+0.5, 0.25, 0.25+0.5, 0.25,0.25+0.5,
// 0.25, 0.25+0.5, 0.25, 0.25+0.5, 0.5, 0.5, 0.5,
// 1.5, 0.25, 0.25+0.5, 0.25, 0.25, 0.5, 0.5+0.5,
//
// 0.25, 0.25, 0.5, 0.25, 0.25+0.5, 0.5, 0.5, 0.25, 0.25,
// 0.25, 025, 0.25, 0.25, 0.25, 0.25, 0.5, 0.25, 0.25, 0.25, 0.25+0.25, 0.25, 0.25, 0.25,
// 0.25, 025, 0.25, 0.25, 0.25, 0.25, 0.5, 0.25, 0.25, 0.25, 0.25+0.5, 0.5,
// 1.5, 0.5 + 1, 0.5, 0.5,
//
//
//NOTE_D0, NOTE_D0, NOTE_D0, NOTE_D6, NOTE_DH3, NOTE_DH3,
// NOTE_D6, NOTE_DH6*2, NOTE_DH6*2, NOTE_DH3*2, NOTE_DH3*2, NOTE_DH4*2, NOTE_DH4*2,
// NOTE_DH2*2, NOTE_DH2*2, NOTE_DH3*2, NOTE_DH3*2, NOTE_D6, NOTE_DH3, NOTE_DH3,
// NOTE_D6, NOTE_DH6*2, NOTE_DH6*2, NOTE_DH3*2, NOTE_DH3*2, NOTE_DH4*2, NOTE_DH4*2,
//
// NOTE_DH2*2, NOTE_DH2*2, NOTE_DH3*2, NOTE_DH3*2, NOTE_D6, NOTE_DH3, NOTE_DH3,
// NOTE_D6, NOTE_DH6*2, NOTE_DH6*2, NOTE_DH3*2, NOTE_DH3*2, NOTE_DH4*2, NOTE_DH4*2,
// NOTE_DH2*2, NOTE_DH2*2, NOTE_DH3*2, NOTE_DH3*2, NOTE_D6, NOTE_DH3, NOTE_DH3,
// NOTE_D6, NOTE_DH6, NOTE_DH6, NOTE_DH3, NOTE_DH3, NOTE_DH1, NOTE_DH4,
//
// NOTE_DH2, NOTE_DH2, NOTE_DH6, NOTE_DH3, NOTE_DH3, NOTE_DH1, NOTE_DH2, NOTE_DH3,
// NOTE_DH6, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH2, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3,
// NOTE_DH6, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH2, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_DH3, NOTE_D6,
// NOTE_D4, NOTE_D4, NOTE_DH6, NOTE_DH6,
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)