Arduino控制蜂鸣器、实现PWM调节光亮
Arduino 学习笔记2!
一.蜂鸣器输出实验
1.源代码
int buzzer=2;//设置控制蜂鸣器的数字口对应板子上2口
void setup()
{
pinMode(buzzer,OUTPUT);//设置对应的输出模式
}
void loop()
{
unsigned char i,j;//定义变量
while(1)
{
for(i=0;i<50;i++)//输出一个频率的声音
{
digitalWrite(buzzer,HIGH);//高电平打开蜂鸣器发声
delay(1);//延时1ms 通过这个延时可以改变声音的频率不同
digitalWrite(buzzer,LOW);//低电平关闭蜂鸣器不发声音
delay(1);//延时ms 通过这个延时可以改变声音的频率不同
}
for(i=0;i<50;i++)//输出另一个频率癿声音
{
digitalWrite(buzzer,HIGH);//高电平打开蜂鸣器发声
delay(5);//延时2ms 通过这个延时可以改变声音的频率不同
digitalWrite(buzzer,LOW);//低电平关闭蜂鸣器不发声音
delay(5);//延时2ms 通过这个延时可以改变声音的频率不同
}
}
}
2.定义数字引脚
int buzzer=2;//设置控制蜂鸣器的数字口对应板子上2口
int redLed=2;//定义板子上数字口2
int yellowLed=3;//定义板子上数字口3
int greenLed=4;//定义板子上数字口4
在 Arduino 中,数字引脚可以使用 int
或 uint8_t
来定义。int
是有符号整数类型,通常用于表示更大的数字范围,而 uint8_t
是无符号的 8 位整数类型(相当于C语言中的long
),可以表示 0-255 的数字范围,这对于表示数字引脚非常方便。在实际应用中,两种类型都可以使用,具体取决于你的需求和个人喜好。
3.unsigned char
在 C/C++ 中,char
类型数据可以被看作是整数类型。unsigned char
表示无符号的 8 位整数类型,其表示范围为 0-255。当你使用 unsigned char i,j;
定义变量 i
和 j
后,它们就被分配了 1 个字节(8 位)的内存空间,可以用来存储整数值。
由于 i
和 j
都是整数类型,因此你可以对它们进行加、减、乘、除等基本数学运算,以及自增和自减运算。在这种情况下,执行 i++
操作时,编译器会将 i
的值加 1,并将结果存回到变量 i
中。如果 i
已经达到了 255,再执行 i++
运算时,i
的值会被重置为 0,因为 unsigned char
类型的取值范围为 0-255。
需要注意的是,在 unsigned char
类型中执行数学运算或自增/自减操作时,可能会出现溢出现象。例如,当 i
的值为 255 时再进行 i++
运算,i 的值就会变成 0。因此,在使用 unsigned char
类型时应该特别小心,确保不会出现意外结果。
4.蜂鸣器
蜂鸣器通常有正负极之分。在接线时,应确保将红色或标有"+“符号的线连接到电源的正极,黑色或标有”-"符号的线连接到电源的负极,否则蜂鸣器可能无法正常工作。
蜂鸣器可以分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器指的是需要外接振荡器或者驱动信号才能发声的蜂鸣器。这种蜂鸣器通常需要在电路中加上一个谐振电路,才能产生所需要的共振频率,并发出声音。相反,无源蜂鸣器是一种自带驱动电路的蜂鸣器,可以直接接到电源上即可发出声音。无缘蜂鸣器适用于需要简单操作、易于使用的场合,例如电子闹钟、计时器、温度计等。
本次实验用的无源蜂鸣器。
5.实现不同频率
本次实验的电路图与常用数字引脚控制LED灯电路图类似,即蜂鸣器的正极接数字引脚,负极接负极GND。实现不同频率,通过delay()延时函数来设置不同的频率,即每次的延时时间不同,蜂鸣器的频率也不同。
二.蜂鸣器控制实验
1.源代码
int buzzer=2;//设置控制蜂鸣器的数字口对应板子上2口
int key=4;//定义板子上数字4口
int flag=0;//定义一个变量记录按键按下后蜂鸣器是关闭还是打开
void setup()
{
pinMode(buzzer,OUTPUT);//设置对应的输出模式
pinMode(key,INPUT_PULLUP);//定义按键为上拉输入模式
}
void loop()
{
if(digitalRead(key)==LOW)//判断按键是否按下,按键按下时为高电平
{
if(flag==0){//判断蜂鸣器是否打开
flag=1; //标志蜂鸣器打开
digitalWrite(buzzer,HIGH);//对应的蜂鸣器发声
}else{
flag=0; //标志蜂鸣器关闭
digitalWrite(buzzer,LOW);//对应的蜂鸣器不发声
}
while(!digitalRead(key));//按键释放时候退出while循环,防止按键按下多次触发
}
}
2.电路图
3.理解
同样是用按键控制电路,所以本次实验较按键控制LED实验思路受一样的,也无新的陌生函数,唯一不同就是这里的蜂鸣器是常规接法,而按键控制LED灯接法比较特殊,所以digitalWrite(buzzer,HIGH)
表示开启蜂鸣器,digitalWrite(buzzer,LOW)
表示关闭蜂鸣器。
三.电位器调节实验
1.源代码
int dwqPin=14; //定义电位器接口14(这个是板子的模拟口A0)
void setup()
{
pinMode(dwqPin,INPUT); //定义数字接口为输出接口
Serial.begin(9600); //设置波特率为9600
}
void loop()
{
Serial.println("模拟量值为:"); //显示字符串"模拟量值为:"
Serial.println(analogRead(dwqPin)); //读取模拟接口A0的值,并且通过串口进行显示出来
delay(2000);//延时2秒
}
2.电路图
3.电位器
Arduino电位器指的是一种用于控制模拟信号的模拟输入设备。它通常由一个可调节的旋钮和两个输出端口组成,其中一个输出端口连接到Arduino板子上的模拟输入引脚,另一个输出端口则连接到地线。通过旋转旋钮,可以改变电位器的输出电压,从而改变连接到模拟输入引脚的电压值。Arduino电位器常用于控制LED灯的亮度、音调发生器的频率等场合。
4.数字引脚和模拟引脚
Arduino板子上的数字引脚和模拟引脚都是用于输入和输出信号的引脚,但它们之间有很大的区别。
Arduino的数字引脚只能够输出两种状态:高电平和低电平,因此它们也被称为IO(Input/Output)引脚。数字引脚用于控制数字电路中的开关、继电器等应用,以及读取数字传感器如按钮、光敏电阻等的状态。在Arduino Uno板子上,有14个数字引脚(0-13),其中6个引脚可以作为PWM输出(3, 5, 6, 9, 10, 和 11)。
相比之下,Arduino的模拟引脚可以输出连续变化的电压信号。它们通常用于传输和处理模拟信号,例如声音、图像、温度和湿度等物理量。Arduino Uno板子上有6个模拟引脚(A0-A5),它们可以根据外部设备提供的电压来产生10位数字值的模拟输入数据,或者通过PWM技术产生模拟输出信号。
需要注意的是,Arduino的数字引脚和模拟引脚可以互相转换使用。例如,可以将一个数字引脚设置为输出,并将其连接到一个LED,然后使用analogWrite()函数在该引脚上产生PWM信号,从而控制LED的亮度。此外,也可以将一个模拟引脚设置为数字输入并读取其状态。因此,在设计Arduino程序时,需要根据具体应用需求选择合适的引脚类型。
常使用下面数字定义模拟引脚:
模拟引脚 | 数字引脚 |
---|---|
A0 | 14 |
A1 | 15 |
A2 | 16 |
A3 | 17 |
A4 | 18 |
A5 | 19 |
5.PWM技术
PWM输出是一种电子信号,使用脉宽调制(Pulse Width Modulation, PWM)技术来控制输出信号的能量。PWM输出通常用于控制电机速度、LED亮度和音频信号的调制等应用。
PWM信号由一系列脉冲组成,在此过程中每个脉冲的宽度(即通断时间)确定了平均输出功率的大小。这些脉冲的频率通常是固定的,但占空比(开通时间与总周期时间之比)可以通过软件或硬件来改变,从而控制输出信号的平均能量。
为了使用微控制器生成PWM输出,软件需要设置一个定时器以在固定的频率下产生周期性中断。在每次中断时,软件根据所需的输出级别更新占空比。硬件随后会在输出引脚上生成相应的PWM波形。
同时,专用的PWM集成电路(PWM ICs)通常具有内置定时器和其他功能,简化了生成PWM输出的过程。这些IC还可以提供额外的功能,例如故障检测和保护电路,因此在许多应用中都很流行。
6.analogRead()函数
-
作用:本指令用于从Arduino的模拟输入引脚读取数值。
-
Arduino控制器有多个10位数模转换通道。这意味着Arduino可以将0-5伏特的电压输入信号映射到数值0-1023。换句话说,我们可以将5伏特等分成1024份。0伏特的输入信号对应着数值0,而5伏特的输入信号对应着1023。
-
语法:
analogRead(pin)
-
参数:被读取的模拟引脚号码
-
返回值:0到1023之间的值
四.光控小灯实验
1.源代码
int led = 2; //定义小灯的输出引脚数字口2
int lightR = 14;//定义光敏电阻的输入引脚14,也就是对应的模拟口A0
int val;
void setup()
{
pinMode(led,OUTPUT);//设置连接小灯的引脚为输出模式
pinMode(lightR,INPUT);
Serial.begin(9600); //设置波特率为9600
}
void loop()
{
val=analogRead(lightR); //读取模拟接口A0的值,也就是14号口,把值赋给val
Serial.println(val); //通过串口打印对应的val值,并且通过串口进行显示出来
delay(1000);//延时1秒
if(val>300)//判断是否大于设定值
{
digitalWrite(led,HIGH);//点亮led
}else{
digitalWrite(led,LOW);//关闭led
}
}
2.电路图
3.波特率
波特率是指数据在通信中传输的速率,它是衡量串行通信速度的一个参数。9600 是比较常见的波特率之一,因为它既可用于低速通信,也可以用于高速通信。
在计算机和现代电子设备中,串行通信通常使用异步串行通信协议进行通信。在这种协议中,传输数据需要发送方和接收方都采用相同的波特率。9600 是一个合理的选择,因为它可以很好地平衡通信速度和传输距离之间的关系,并且在大多数情况下具有良好的兼容性和稳定性。
此外,9600 波特率还具有与其他常用波特率(例如 300、1200、2400、4800 和 19200)相比相对较高的数据传输速度,因此它在许多应用中被广泛使用。
4.VCC
在Arduino中,VCC通常指的是芯片上的电源引脚,也就是电路板上用于提供电源的正极。一般来说,VCC引脚连接到外部电源或者芯片内部的稳压器,用于为整个系统提供稳定的电源。
电源引脚在模拟引脚旁边。
Arduino的电源引脚数量取决于不同型号的开发板,但通常都会包括以下几个电源引脚:
- VCC(或VIN):用于连接外部电源或者芯片内部的稳压器,以提供系统所需的电源。
- GND:用于连接电路板和其他组件的地线,提供回路的闭合路径。
- 3.3V(或5V):一些Arduino型号可能还包括一个额外的电源引脚,一般用于连接低功耗的外围设备和传感器,例如无线模块、温度传感器等。
五.PWM调节光亮实验
1.源代码
int ledpin=3;//定义数字接口3输出PWM波
int dwqPin=14; //定义电位器接口14(这个是板子的模拟口A0)
int val = 0; //定义变量
void setup()
{
pinMode(ledpin,OUTPUT); //定义LED灯控制口为输入
pinMode(dwqPin,INPUT); //定义数字接口为输出接口
Serial.begin(9600); //设置波特率为9600
}
void loop()
{
val=analogRead(dwqPin);//读取电位器的值传给val变量
Serial.println("模拟量值为:"); //显示字符串"模拟量值为:"
Serial.println(val/4); //读取模拟接口A0的值,并且通过串口进行显示出来
analogWrite(ledpin,val/4);// 用产生的pwm波控制小灯,其中pwm波的范围为0到255
delay(100);//延时100ms
}
2.电路图
3.analogWrite()函数
- 作用:将一个模拟数值写进Arduino引脚。
- 语法:
analogWrite(pin, value)
- 参数1:
pin
表示要写进模拟数值的引脚号码 - 参数2:
value
是0到255之间的PWM频率值, 0对应off, 255对应on
其中,0表示PWM信号的低电平占空比为100%,也就是输出电压为0V,灯熄灭;255表示PWM信号的高电平占空比为100%,也就是输出电压为5V,灯亮。
4.占空比
占空比(Duty Cycle)是指PWM信号高电平持续时间与周期时间之比。在Arduino等系统中,PWM信号的周期时间通常是固定的,因此占空比可以用来控制信号高电平的持续时间。
占空比通常用百分数或小数表示,范围从0到1或0%到100%。例如,一个50%的占空比意味着PWM信号的高电平持续时间为周期时间的一半。
在控制LED、电机、舵机等电子设备时,占空比是非常重要的参数。它可以控制输出设备的亮度、速度、位置等属性。例如,通过改变PWM信号的占空比,可以实现LED的调光、电机的调速、舵机的转动角度控制等功能。
六.说明
接上一篇博客,arduino学习笔记2!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)