一.pinmode三种模式

1.输入模式

引脚在该模式时,引脚为高阻抗状态,可用于引脚读取传感器信号或者开关信号

该引脚未与上拉电阻或下拉电阻相连时,该引脚电平不稳定,若与上拉电阻相连,该引脚处于高电平状态,若与下拉电阻相连,则处于低电平状态

2.输出模式

引脚为该状态时,引脚为低阻抗状态,此时引脚可以点亮LED或者驱动电机

3.输入上拉模式

定义:对于一个不确定的信号,可以通过arduino微控制器内部自带的电阻与电源VCC相连,使其固定在高电平

输入上拉(INPUT_PULLUP)模式与输入(INPUT)模式的比较

(1)当将Ardiuno上的引脚2设置为INPUT模式,并且引脚2没有接入外部电路,引脚2的电平状态是随机的。

(2)当将Ardiuno上的引脚2设置为INPUT模式,并且引脚2接入电阻时(如图所示),此时引脚2处于高电平状态。

(3)当将Ardiuno上的引脚2设置为INPUT_PULLUP模式时(如图所示),由于Arduino 微控制器自带内部上拉电阻,因此引脚2处于高电平状态。该电路效果与第2个电路图等效

输入上拉和输入下拉模式都是为了避免由于电压的“悬浮”而造成电路的不稳定

二.模拟输出

1.

模拟信号是连续变化的信号,模拟信号可以用连续的电压或者电流表示。
模拟量的概念与数字量相对应,它经过量化之后可以转化为数字量。模拟量在连续的变化过程中的任何一个取值都是一个有具体意义的物理量,如温度,电压,电流。
模拟输入输出的意思是模拟信号的输入输出。
只能用引脚3.5.6.10.11

数字输入输出:通常是接收开关量的信号

2.模拟输出函数analogWrite
(1)analogWrite函数借助PWM调制,将模拟值(pwm波)写入引脚,
引脚生成指定占空比的稳定的矩形波,可以用于输出模拟信号,它有两个参数,第一个参数是模拟引脚号,第二个参数是0到255之间的PWM频率值,0对应“off”,255对应“on”。

(2)在Arduino UNO控制器中,5号引脚和6号引脚的PWM频率为980Hz。在一些基于ATmega168和ATmega328的Arduino控制器中,analogWrite函数支持引脚 3、5、6、9、10、11(在开发板上的引脚处有“~”标记)。

(3)PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域。

(4)PWM频率值0-255对应占空比0%-100%,呈正比关系,如下图所示。如果有规律地改变PWM频率值,就能产生等效的模拟波形(如上图紫色虚线描绘的波形),当然,PWM频率值固定,也能产生一个等效的模拟电压,其值不局限于高电平或低电平标定的电压,电压值取决于PWM频率值。

二.按键控制LED亮度

1.持续按下按键1,LED的亮度会持续下降直至熄灭,持续按下按键2,LED的亮度会持续上升直至程序设定的最大值。

bool pushButton1;   // 创建布尔型变量用来存储按键开关1的电平状态
bool pushButton2;   // 创建布尔型变量用来存储按键开关2的电平状态
int ledPin = 9;        //LED引脚号
int brightness = 128;  //LED亮度参数(255/2=127.5,一个适中的亮度参数)
 
void setup() 
{
  pinMode(2, INPUT_PULLUP); //将引脚2设置为输入上拉模式
  pinMode(8, INPUT_PULLUP); //将引脚8设置为输入上拉模式
  pinMode(ledPin, OUTPUT);  //将LED引脚设置为输出模式
  Serial.begin(9600);      //启动串口通讯,波特率为9600
}
 
void loop() 
{
  pushButton1 = digitalRead(2); //读取引脚2电平状态并将其赋值给布尔变量pushButton1
  pushButton2 = digitalRead(8); //读取引脚8电平状态并将其赋值给布尔变量pushButton2
  
  if (!pushButton1 && brightness > 0)  //当(持续)按下按键开关1并且LED亮度参数大于0
  {
    brightness--;                           //减低LED亮度参数
  } 
  else if (!pushButton2 && brightness < 255) //当(持续)按下按键开关2并且LED亮度参数小于255
  {
    brightness++;                           //增加LED亮度参数
  }
  analogWrite(ledPin, brightness);         //模拟输出控制LED亮度
  Serial.println(brightness);              //将LED亮度参数显示在串口监视器上
  delay(10);
}

三.模拟输入

1.模拟输入函数analogRead

(1)analogRead函数仅有一个参数用于指示模拟引脚,该函数用于从Arduino的模拟输入引脚读取模拟电压的数值。

(2)Arduino控制器有多个10位数模转换通道,这意味着Arduino可以将0-5V的电压输入信号映射到数值0-1023(),就是将输入的模拟量转换成单片机能“读懂”的数字信号,或者说将模拟量转换为二进制的形式供计算机接收。

(3)在模拟输入引脚没有任何连接的情况下,用analogRead指令读取该引脚,这时获得的返回值为不固定的数值,这个数值可能受到多种因素影响,比如将手靠近引脚也可能使得该返回值产生变化。


2.电位器控制LED灯亮度

void setup() 
{
  Serial.begin(9600);  //串口通讯初始化(9600 bps)
  pinMode(9, OUTPUT);  //设置9号引脚为输出模式
}
 
void loop() 
{
  int analogInputVal = analogRead(A0);  //读取模拟输入值 
  int brightness = map(analogInputVal, 0, 1023, 0, 255); //将模拟输入数值(0 - 1023)等比映射到模拟输出数值区间(0-255)内,根据该映射关系由analogInputVal得出brightness
  analogWrite(9, brightness);  //根据模拟输入值调节LED亮度
 
  //将结果通过串口监视器显示
  Serial.print("analogInputVal = ");
  Serial.println(analogInputVal);
   
  Serial.print("brightness = ");
  Serial.println(brightness);
   
  Serial.println("");
}

电位器的两端引脚分别接5V和GND,中间引脚连接Arduino的引脚A0,转动电位器,引脚A0的电压随之发生改变,程序需要不断地将当前电压记录在变量analogInputVal中,当然,记录的值并不完全等于电压值,只是它与实际电压值有一个映射关系(或者说线性关系)。

②analogRead函数的返回值范围为0-1023(针对本项目而言),而LED灯的亮度参数取值范围为0-255,虽然二者取值范围不同,但是可以为它们构造一个等比映射的关系,如下图所示,这样,引脚A0的电压值就能与LED灯的亮度参数存在一个映射关系(或者说线性关系)

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐