4.22-4.28arduino学习记录

一、模拟输出

以呼吸灯为例。首先介绍相关概念以及要用到的编程语言。

1、PWM

PWM信号,即脉冲宽度调制信号,是一种通过改变脉冲的宽度来控制信号平均电平的数字信号。PWM信号由一系列周期性的方波脉冲组成,每个脉冲的宽度可以根据需要调整。通过调节脉冲的占空比(即脉冲宽度与周期的比例),可以控制输出信号的平均电平、能量或信号的特性。PWM信号在许多邻域都有广泛的应用,如电动机控制、LED亮度调节、音频信号生成、电源控制和温度控制等。

analogWrite(ledPin,127)  //设置LED亮度百分比为50%(255*50%~=127)

2、analogWrite()

analogWrite(pin, value)  //value:0到255之间的PWM频率值, 0对应off, 255对应on。
将一个模拟数值写进Arduino引脚。无返回值。这个操作可以用来控制LED的亮度, 或者控制电机的转速. Arduino每一次对引脚执行analogWrite()指令,都会给该引脚一个固定频率的PWM信号。
调用analogWrite()函数前,无需使用pinMode()函数来设置该引脚。

3、for语句

for(表达式1; 表达式2; 表达式3){
语句块
}
1) 先求解表达式1。
2) 求解表达式2,若其值为真(非0),则执行括号中的语句块,否则将结束循环。
3) 每一次执行完语句块,Arduino将求解表达式3。
4) 重复执行步骤 2) 和 3),直到循环结束。
注意:表达式1仅在第一次循环时求解,以后都不会再执行,可以认为这是一个初始化语句。

4、代码

这里我只列出loop()内的一段代码,另一段只需在此基础上稍加修改即可。

void loop(){
for (int brightness = 0; brightness <= 255; brightness++){
    analogWrite(9, brightness);   
    Serial.println(brightness);  //把参数显示在串口监视器上
    delay(10);
}

5、实验效果

通过analogWrite()将模拟数值输入9号引脚,给引脚一个PWM信号,并通过for循环语句,实现LED灯由明到暗,由暗到明的不断循环。如视频所示。

二、模拟输入

以通过电位器控制LED亮度为例。首先介绍相关概念及代码中所用到的编程语言。

1、电位器

可以把它看成一个滑动变阻器,旋动旋钮R1-2和R2-3大小随之变化,当1和3号引脚处接入电源时,实现2号引脚处电位的变化。

ddabb622117a4e9694a2a05e4785c3b4.jpeg

通常电位器的引脚连接方式如下图所示。

56e869c064504ca3af44b363f1395cbe.jpeg

2、analogRead()

analogRead(pin)  //pin为引脚号码
本指令用于从Arduino的模拟输入引脚读取数值。返回值为0-1023之间的值。可以认为将5伏特等分成1024份,将0-5伏特的电压输入信号映射到数值0-1023(因为arduino控制器上有多个10位数模转换通道);0伏特的输入信号对应着数值0,而5伏特的输入信号对应着1023。

注:数模转换通道就是模拟输入引脚。数模转换也就是数字信号(开关)与模拟信号(电位器)的转换。
注意:在模拟输入引脚没有任何连接的情况下,用analogRead()指令读取该引脚,这时获得的返回值为不固定的数值。这个数值可能受到多种因素影响,如将手靠近引脚也可能使得该返回值产生变化。

通过下面一段代码熟悉一下analogRead()和电位器的使用。

void loop(){
 // 读取模拟输入值:
  int analogInputVal = analogRead(A0);
  // 将结果通过串口监视器显示:
  Serial.println(analogInputVal);
}

实现效果:通过电位器改变引脚2(A0)处的电位,并通过analogRead()读取数值,返回0-1023之间的数,显示在串口监视器上。如视频所示。(在实际操作时,受多种因素影响,串口监视器显示的数值会有略微变化)

3、map()映射函数

用来将某一数值从一个区间等比映射到一个新的区间。
map (x, in_min, in_max, out_min, out_max) 
x: 要映射的值
in_min: 映射前区间最小值
in_max: 映射前区间最大值
out_min: 映射后区间最小值
out_max 映射后区间最大值

注意:map()函数不会将数值限制在映射区间内,当超过映射区间时,程序将继续按照比例映射。

4、代码

void loop() {
  // put your main code here, to run repeatedly:
  int analogInputVal = analogRead(A0);  // 读取模拟输入值
 
  int brightness = map(analogInputVal, 0, 1023, 0, 255); //将模拟输入数值(0 - 1023)等比映射到模拟输出数值区间(0-255)内
  
  analogWrite(9, brightness);  //根据模拟输入值调节LED亮度
}

5、实验效果

fa06367c4fa6467d971552abd715c9b4.jpeg

通过电位器改变A0引脚电位,并通过analogRead()读取返回0-1023之间的数值,再用map()函数映射为0-255直接(0为熄灭,255为最亮),最后analogWrite()读取给9号引脚PWM信号。从而实现旋动旋钮控制LED亮度。如视频所示。

6、额外的实验发现

将map()函数输出区间改为(-255,255)时,旋钮从最左端旋转到最右端的过程中,LED由暗变亮,熄灭,又由暗变亮,以255为一个周期。如视频所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值