本文共 2540 字,大约阅读时间需要 8 分钟。
本节书摘来自华章出版社《Microduino实战》一 书中的第3章,第3.5节,作者:姚琪 杨立斌,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
上一节重点介绍了Microduino-Core的I/O引脚的物理功能以及在程序中对应的函数操作。接下来趁热打铁,将刚学的知识用起来。这也是本书的一大宗旨:强调动手实践,而非深入学习编程的语法或电子器件的原理,即在实践中学习,在学习中实践。
本节所用的示例是用I/O控制LED的亮度,以进一步熟悉I/O的控制。如图3-25所示,下降键采用内部的上拉,所以外部不需要添加电阻。当按下时,D5引脚直接连到GND低电平;而断开时,因为内部上拉的缘故,所以D5引脚接到了高电平。这就将按键的两种状态转化成了高低电平的变化了。
上升键则采用了外部下拉,通过一个电阻将D2引脚直接引到了GND上,所以断开时,D2引脚为低电平,而当按下时,直接接到了5V高电平。据此得出了如表3-2所示的映射关系。
小知识 简单介绍一下轻触开关的4个引脚的关系。如图3-25所示,1和2引脚是导通的,3和4引脚是导通的,如果按下,4个引脚导通。
明白了如何处理按键的状态之后,再看看PWM是如何调节LED的亮度的。PWM全称为脉冲宽度调制,如图3-26所示。脉冲是指每个周期高电平的部分。所谓占空比就是方波的宽度占整个周期的百分比。比如占空比25%,就是说在一个周期内,有1/4的时间是高电平,而剩下的3/4是低电平。占空比0%就相当于输出低电平,而占空比100%则相当于输出高电平。本例是D11口通过PWM直接驱动LED,当输出高电平时LED点亮,输出低电平时LED熄灭。可以很直观地想象,随着占空比的增加,高电平宽度越宽,LED会越亮。这就是用PWM控制LED的亮度的原理。
3.具体步骤(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~255Serial.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所示。有兴趣的读者可以尝试如下的操作,看看会出现什么情况,再想想为什么,这些问题对硬件的了解和引脚的使用都会有帮助。
1)如果D2和D5的管脚悬空,会出现什么样的状况?2)如果将pinMode (downKey,INPUT_PULLUP)换成pinMode (downKey,INPUT),又会出现什么样的情况?3)在程序中,如果去掉delay (300)这样的延迟语句,又会出现什么样的现象?转载地址:http://lirel.baihongyu.com/