本节书摘来自华章出版社《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引脚接到了高电平。这就将按键的两种状态转化成了高低电平的变化了。

上升键则采用了外部下拉,通过一个电阻将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<=255n=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>=0n=0;}analogWrite(led,n);    //使用PWM控制led端口输出,变量n的取值是0~255Serial.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)这样的延迟语句,又会出现什么样的现象?

《Microduino实战》——3.5 I/O操作——现学现用相关推荐

  1. 零基础10小时学会3D基础建模,可能性有多大?现学现用现演示

    本期话题:10小时搞定零基础3D建模能实现么? 学习目标:分享3D建模思路,了解3D建模原理,10小时足够了. 工具软件: CimatronE13 UG NX12 Creo 6.0 SolidEdge ...

  2. 现学现用大数据分布式集群环境部署

    导读:        随着大数据时代的到来,传统的GIS分析工具越来越难以满足对超大体量空间数据的分析需求.SuperMap iServer 9D(本文简称iServer)实现了地理信息服务的分布式集 ...

  3. 现学现卖微信小程序开发(二)

    现学现卖微信小程序开发(一) 现学现卖微信小程序开发(三):引入Rx,为小程序插上翅膀 一个Todo应用的小程序版 好的,那么下一步我们就先照猫画虎,新建一个todos文件夹,然后一套四样同名文件准备 ...

  4. 现学现卖做一个炫酷的动态背景页面

    很喜欢酷炫的页面,自从看了抖音的主页之后(如下)(链接),就决定要也做一个牛逼的动态背景页面 对...背景是视频,而且还有音效,太牛逼了 然后决定自己做一个,废话不说,先弄代码: 这里为了设计简便,用 ...

  5. CTF训练之现学现卖--SSH私钥泄露

    [原创]CTF训练之现学现卖–SSH私钥泄露 Step1 环境搭建: KALI官网下载vmware虚拟机 Virtual PC加载SSH-私钥泄露.ova (链接:https://pan.baidu. ...

  6. 现学现用-我的第三个小小小私活

    之前写的博客 现学现用-我的第二个小小小私活 之前两个小小小私活,这次遇到的是第三个. 经历的大致历程: 一.背景 经朋友搭线介绍,一家公司需要做个微信小游戏,问我有没有时间和兴趣,我说可以做.做过小 ...

  7. 现学现用Android Jetpack - Navigation

    前言 即学即用Android Jetpack系列Blog的目的是通过学习Android Jetpack完成一个简单的Demo,本文是即学即用Android Jetpack系列Blog的第一篇. 记得去 ...

  8. python中content的用法_学python吗,教你5个python现学现用的有趣用法

    在我们使用python的过程中也会遇到一些有意思的用法,这里找到了一些总结有趣的 话不多说,接着看下去吧!!!!python高薪就业(视频.学习路线.免费获取)​shimo.im for-else用法 ...

  9. python爬取音乐_Python现学现用xpath爬取豆瓣音乐

    昨天说了Requests库,今天来上手爬虫了. 爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与BeautifulSoup,我在网上查了一下资料,了解到三者之间的使用难度与性能 三种爬虫方 ...

最新文章

  1. org.springframework.data.mapping.PropertyReferenceException: No property xxxx found for type Xxxx
  2. Android Studio导入第三方类库的方法
  3. python搜题软件-智慧职教mooc的APPPython程序设计基础章节测验答案
  4. MyBatis是持久化层框架(SQL映射框架)-操作数据库
  5. java 轮询请求接口_Android RxJava 实际应用讲解:(无条件)网络请求轮询
  6. 「数据分析」Sqlserver中的窗口函数的精彩应用之数据差距与数据岛(含答案)...
  7. 访问对象的属性,你知道有哪些方法?
  8. Spring IOC容器-注解的方式
  9. Ubuntu更换apt镜像源
  10. torch报告_Stack Overflow 2020调查报告发布,Rust 5连冠
  11. 【eclipse】Multiple annotations found at this line:——解决方法
  12. android AudioManager类 详解(1)
  13. 贝叶斯网络python实现_在Python中使用贝叶斯网络的实例
  14. 银河麒麟桌面V10SP1安装nosqlbooster 可视化工具
  15. kafka错误代码解释
  16. 空字符串和len()函数
  17. 前端生产环境调试工具sourcemap的使用
  18. 安工大Linux程序设计实验
  19. 开源的IoT物联网平台大比拼
  20. centos7下安装forever_CentOS7 安装和部分设置参考

热门文章

  1. Parse error: syntax error, unexpected ''解决办法
  2. android:foreground
  3. python字典元素由什么组成_【】Python中,字典、列表、元组分别用 、 、 作定界符,字典的每个元素由两部分组成,分别是 和 ,其中 不允许重复。...
  4. 看网页视频如何自定义倍速(b站举例)
  5. Java大端字节和小端字节
  6. 解决办法: Vue cross-env NODE_ENV=production webpack --progress --hide-module
  7. 寻找解决样本不均衡方法之Focal Loss与GHM
  8. 网课教育大火,平板逆袭,华为、联想等接连出手,小米还要苦等几时?
  9. MySQL 基础 -- MySQL 数据类型说明(数值类型、字符串类型、日期时间类型)、SQL通用语法和SQL分类
  10. TCP FIN扫描探测原理