《Microduino实战》——3.5 I/O操作——现学现用

简介:

本节书摘来自华章出版社《Microduino实战》一 书中的第3章,第3.5节,作者:姚琪 杨立斌,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.5 I/O操作——现学现用

上一节重点介绍了Microduino-Core的I/O引脚的物理功能以及在程序中对应的函数操作。接下来趁热打铁,将刚学的知识用起来。这也是本书的一大宗旨:强调动手实践,而非深入学习编程的语法或电子器件的原理,即在实践中学习,在学习中实践。
本节所用的示例是用I/O控制LED的亮度,以进一步熟悉I/O的控制。

  1. 基本要求
    用两个按键调节LED的亮度,一个按键增加亮度,另一个减少亮度。
  2. 基本原理
    按键就只有2种状态,按下和断开,如何将按键的两种状态转化成控制板能够识别的高低电平信号呢?

如图3-25所示,下降键采用内部的上拉,所以外部不需要添加电阻。当按下时,D5引脚直接连到GND低电平;而断开时,因为内部上拉的缘故,所以D5引脚接到了高电平。这就将按键的两种状态转化成了高低电平的变化了。

screenshot

上升键则采用了外部下拉,通过一个电阻将D2引脚直接引到了GND上,所以断开时,D2引脚为低电平,而当按下时,直接接到了5V高电平。据此得出了如表3-2所示的映射关系。
screenshot

小知识 简单介绍一下轻触开关的4个引脚的关系。如图3-25所示,1和2引脚是导通的,3和4引脚是导通的,如果按下,4个引脚导通。
明白了如何处理按键的状态之后,再看看PWM是如何调节LED的亮度的。
PWM全称为脉冲宽度调制,如图3-26所示。脉冲是指每个周期高电平的部分。所谓占空比就是方波的宽度占整个周期的百分比。比如占空比25%,就是说在一个周期内,有1/4的时间是高电平,而剩下的3/4是低电平。占空比0%就相当于输出低电平,而占空比100%则相当于输出高电平。

screenshot

本例是D11口通过PWM直接驱动LED,当输出高电平时LED点亮,输出低电平时LED熄灭。可以很直观地想象,随着占空比的增加,高电平宽度越宽,LED会越亮。这就是用PWM控制LED的亮度的原理。
3.具体步骤
screenshot

(1)搭建电路
根据上面提供的硬件清单和电路连接示意图搭建电路,并用USB线与计算机连接起来。
(2)编写并编译程序
程序中采用的是上一节提到的analogWrite(pin, val)函数,即用PWM控制LED的亮度,而用两个按键控制占空比的增加或者减少。
(3)程序清单

/* 功能描述:
* 用两个按键分别控制LED亮度,一个按键可以让灯逐渐变亮,另一个键正好相反
* *
* 引脚映射:
*   2    --> upKey, 即上升键状态输入口
*   5    --> downKey, 即下降键状态输入口
*   11   --> led, 即PWM控制输出口
*/
int upKey=2;
int downKey=5;
int led=11;
int n=0;
void setup ()
{
    pinMode(upKey,INPUT);                //设置upKey端口为输入
    pinMode(downKey,INPUT_PULLUP);        //设置downKey端口为内部上拉输入
    pinMode(led,OUTPUT);                //设置led端口为输出
    Serial.begin(9600);
}

void loop()
{
    int upState =digitalRead(upKey);        //读取上升键的状态
    int downState = digitalRead(downKey);    //读取下降键的状态   
    if (upState==HIGH)
    { 
        Serial.println("upKey is ON!");        //串口打印upKey的状态
        n=n+5;                    // 增加PWM的数值
        if (n>=255) {                //限定n<=255
            n=255;
    }
    analogWrite(led,n);    //使用PWM控制led端口输出,变量n的取值是0~255
Serial.println(n); 
    delay (300);        // 延时300ms
    }
    if (downState==LOW) 
    {
    Serial.println("downKey is ON!");        //串口打印downKey的状态
    n=n-5;                        // 减小PWM的数值
    if (n<=0) {                    //限定n>=0
        n=0;
    }
    analogWrite(led,n);    //使用PWM控制led端口输出,变量n的取值是0~255
    Serial.println(n);
    delay (300);        //延时300ms
    }
}

用容易理解的变量名去映射端口的地址,这样可以让程序更加容易理解,不易出错,而且也有利于软件和硬件的调试。
打开IDE输入代码并保存,然后单击下载即可。
(4)查看现象并调试
在IDE工具栏中打开串口监视器,在程序中串口波特率设置成了9600,所以在监视器窗口选择相应的速率。
试着按几下上升键和下降键,查看LED的亮度是否有变化,再查看串口打印出来的信息,如图3-27所示。

screenshot

有兴趣的读者可以尝试如下的操作,看看会出现什么情况,再想想为什么,这些问题对硬件的了解和引脚的使用都会有帮助。
1)如果D2和D5的管脚悬空,会出现什么样的状况?
2)如果将pinMode (downKey,INPUT_PULLUP)换成pinMode (downKey,INPUT),又会出现什么样的情况?
3)在程序中,如果去掉delay (300)这样的延迟语句,又会出现什么样的现象?

相关文章
|
2月前
|
IDE 开发工具 流计算
保姆级Arduino开发环境搭建
保姆级Arduino开发环境搭建
29 1
|
7月前
|
传感器 C语言 芯片
「入门指南」轻松学习嵌入式 GPIO:从原理到应用一步到位
「入门指南」轻松学习嵌入式 GPIO:从原理到应用一步到位
|
传感器 网络协议 物联网
应用实战精解系列(二十):RVB2601之YoC系统
应用实战精解系列(二十):RVB2601之YoC系统
451 0
|
编解码 C语言 开发者
应用实战精解系列(十五):基于RVB2601移植U8g2图形库
应用实战精解系列(十五):基于RVB2601移植U8g2图形库
766 0
应用实战精解系列(十五):基于RVB2601移植U8g2图形库