当前位置: 首页 > news >正文

Arduino项目式编程教学第三章——红外遥控灯

文章目录
一、按键模块的使用
二、使用按键控制LED灯开关
三、红外遥控及红外接收头的使用
四、完成红外遥控灯
五、总结

硬件清单

在这里插入图片描述

一、按键模块的使用

在这里插入图片描述

如图所示为常见的按键模块,包含一个按键开关、一枚电阻及三根针脚,其电路原理图如下:
在这里插入图片描述

其原理也比较简单,1.在按键未按下时,信号端OUT与负极GND相接,此时获取信号为低电平;2.当按键按下,此时OUT与正极VCC导通,此时获取信号为高电平;另外与负极GND相连的电阻称之为下拉电阻,即在按键未按下时,保证电平信号为低电平。
按照上述原理,我们得知:将按键模块接入数字端口后,未按下时,得到低电平信号,即为0;当按键按下,得到高电平信号,即为1。
接下来按照下图进行连线,并检验是否符合上述结论:
在这里插入图片描述
将按键模块接入4号数字端口后,通过如下程序并使用串口监视器进行观察:

void setup()
{pinMode(4,INPUT);  //设置4号数字端口为输入模式Serial.begin(9600);  //初始化串口监视器,波特率默认9600
}
void loop()
{Serial.println(digitalRead(4));  //通过串口打印在4号端口获取的信号
}

在这里插入图片描述
如图即为按键按下时串口监视器的输出内容(注:本章的串口监视器页面与前面有些区别,本章开始Arduino编译器使用了2.2的全新版本)

二、使用按键控制LED灯开关

按照如下图所示进行连线:
在这里插入图片描述
将两个按键模块分别连接到数字端4号7号端口,并且将LED灯连接到数字端9号端口(可连接到任意端口,但要与下文的程序端口一一对应)
首先思考使用两个按键模块分别控制LED灯开关的逻辑是怎样的?即“如果4号按键按下,则开灯;如果7号按键按下,则关灯。”这里用到了“如果”这个词汇,因此先来学习符合这个逻辑的语句——if判断。

1. if判断语句

在这里插入图片描述
如图,if判断语句大致分为两类——“if-if句型”中的各个条件之间可以不相互影响,而“if-else句型”的两个条件是互补的。且可扩充至以下用法:

下面我们用实际的代码块来演示“if判断语句”的用法:

int i = 0;  //定义一个整型变量i
if(i <= 1)  //第一个判断,如果i小于或等于1
{i++;  //满足则i自身加1
}
if(i > 1)  //第二个判断,如果i大于1
{i--;  //满足则i自身减1
}
int i = 0;  //定义一个整型变量i
if(i <= 1)  //第一个判断,如果i小于或等于1
{i++;  //满足则i自身加1
}
else  //第二个判断,如果不满足第一个条件
{i--;  //自身减1
}

if判断语句自上而下执行,并且仅执行一次(如果在loop函数内,则受loop影响,所有程序循环执行)。

2.应用if判断实现两个按键控制灯开关

在这里插入图片描述
再次确保各模块连接正确,然后完成以下程序:

//此程序功能为使用两个按键模块控制灯亮灭
//两个按键分别接到数字端口D4与D7,LED灯接到D9void setup() 
{pinMode(4,INPUT);  pinMode(7,INPUT);  //设置4号及7号连接按键的端口为输入pinMode(9,OUTPUT);  //设置9号连接LED灯的端口为输出digitalWrite(9,LOW);  //初始9端口输出低电平,LED灯灭
}void loop() 
{if(digitalRead(4) == 1)  //如果检测到4号端口为高电平(即此按键按下){digitalWrite(9,HIGH);  //设置9号端口为高电平,点亮LED灯}if(digitalRead(7) == 1)  //如果检测到7号端口为高电平(即此按键按下){digitalWrite(9,LOW);  //设置9号端口为低电平,熄灭LED灯}
}

上传以上程序,并观察是否可以通过分别按下两个开关来控制LED灯的亮灭。
这里对上述程序中if判断内的“==”符号进行说明:形如“int i = 1”,其中的“=”的作用为赋值,即将“i”中的数值变为“1”;但“if”判断中的“digitalRead(4) == 1”,其中“==”表示判断,其作用为判断“4号”端口的数值是否为“1”。

3.进阶——使用单个按键控制LED灯开关

接下来我们拔掉一个按键模块,尝试使用单个按键来控制LED灯的亮灭:
在这里插入图片描述
仅保留4号数字端口的按键以及9号数字端口的LED灯,然后完成以下程序:

//此程序为使用单个按键模块控制灯亮灭
//按键接到数字端口D4,LED灯接到D9void setup() 
{pinMode(4,INPUT);  //设置4号连接按键的端口为输入pinMode(9,OUTPUT);  //设置9号连接LED灯的端口为输出digitalWrite(9,LOW);  //初始9端口输出低电平,LED灯灭
}int i = 0;  //创建一个整型变量并赋值为1void loop() 
{if(digitalRead(4) == 1)  //如果检测到4号端口为高电平(即此按键按下){i++;  //变量i自身加1delay(300);  //延时300毫秒,防止按下一次多次执行}if(i % 2 == 0)  //如果i能够被2整除{digitalWrite(9,LOW);  //设置9号端口为低电平,熄灭LED灯}else  //不满足上述条件{digitalWrite(9,HIGH);  //设置9号端口为高电平,点亮LED灯}
}

我们首先通过下图来说明一下其原理:
在这里插入图片描述
这里需要补充说明符号“%”,使用此符号可以得到整除后的余数,即“余除”;另外使用“/”可以得到整除后的数值。

三、红外遥控及红外接收头的使用

1.Arduino开源库的使用

由于Arduino是一个完全开源的平台,不仅其硬件开源,使用Arduino的开发者也贡献了很多不同元器件的开源库,学习者可以登陆Arduino官网查看“www.arduino.cc”;借助开源库可以帮助我们轻松的使用一些较为复杂的元器件,下面我们说明一下开源库的导入及其所带示例程序。
在这里插入图片描述
如果使用的Arduino编译器版本为当前最新的2.2版本,可方便的在上图左侧的库管理菜单栏直接搜索并安装相应库文件;如果并非最新版,也可从“项目-导入库”直接进行导入,建议先将从官网下载的库文件压缩成zip文件,然后直接导入.zip文件。
在这里插入图片描述

2.红外遥控及红外接收头测试

在这里插入图片描述
如上图为本章使用的红外遥控及红外接收头,红外遥控为成品,可直接使用;另外红外接收头的针脚线序如上,自左向右分别为“OUT”、“GND”、“VCC”;接下来按照下图进行接线,其中红外接收头的“OUT”针脚接数字端“11”。
在这里插入图片描述

接下来我们需要导入“IRremote”库,可以直接在库管理搜索“IRremote”或者去arduino.cc官网下载,但要注意本章使用的为IRremote1.0的版本,注意下载好对应的版本;或者在我的网盘下载:“链接: https://pan.baidu.com/s/1m5xKz7RB36OF6H2LEMlmFQ?pwd=tff9 提取码: tff9”按照上述导入.zip库的方法进行导入。
在这里插入图片描述
接下来完成以下程序来使用红外接收功能:

//这是使用IRremote库接收红外信号
//并且把接收到的信号使用十六进制串口打印出来#include <IRremote.h>  //导入IRremote库
IRrecv ir(11);//声明一个对象,形参为接线针脚
decode_results results;//构造一个名为results的对象,存放解码的值void setup()
{Serial.begin(9600);  //串口监视器初始化ir.enableIRIn();   // 启动红外接收
}void loop() 
{if (ir.decode(&results)) //如果ir解码成功了{Serial.println(results.value, HEX);  //串口输出十六进制的解码值delay(300);  //延时300毫秒 ir.resume();  //继续接收下一个信号}
}

现对上述程序作简要说明:但凡要用到库文件时,都需要使用“#include”来导入相应库文件;
IRrecv ir(11)”的功能为:使用自定义的“ir”来调用IRrecv的所有功能,这里的“ir”是可自定义命名的,并且其括号内的数字为红外接收头OUT端所接的数字端口号;
decode_results results”的作用为构造一个用于存放解码后数值的对象,并且第二个“results”也是可自定义命名的;
ir.enableIRIN()”为启动红外接收功能,其中“ir”要与上述代码声明对象时的命名一致;
ir.decode(&results)”作用为检测是否解码成功,如果解码成功则返回数值“1”,此时if判断可以执行;
Serial.println(results.value, HEX)”作用为使用串口监视器输出“results”内的“value”,即数值,并且HEX为输出16进制数;(二进制、八进制、十进制、十六进制的转换)
ir.resume()”作用为继续接收下一个信号。
将以上程序上传至Arduino板,并打开串口监视器,尝试按下红外遥控不同的按键,并观察输出的数值。
在这里插入图片描述
观察串口监视器的输出,红外遥控的每个按键都对应一个十六进制数,当然我们能发现其中有一个特殊的数值“FFFFFFFF”,这个数值是长按按键造成的,由于延时为300毫秒,所以按下时间过长会输出这个字符,所以可以尝试修改延时的时间。

四、完成红外遥控灯

在这里插入图片描述
按照上图进行接线,红外接收与11号数字端口连接,LED灯与9号数字端口连接,并且记录两个红外遥控按键的信号数值,用作控制LED灯的亮灭,并完成以下程序:

//这是使用IRremote库接收红外信号
//并且通过红外遥控的两个按键来控制LED灯的亮灭
#include <IRremote.h>
IRrecv ir(11);  //声明一个对象,形参为接线针脚
decode_results results;  //构造一个名为results的对象,存放解码的值void setup()
{Serial.begin(9600);  //串口监视器初始化ir.enableIRIn();  // 启动红外接收pinMode(9,OUTPUT);  //设置9号端口为输出digitalWrite(9,0);  //开始输出低电平,使得LED灯为灭
}void loop() 
{if (ir.decode(&results)) //如果ir解码成功了{Serial.println(results.value, HEX);  //串口输出十六进制的解码值delay(200);  //反应时间 ir.resume();  //继续接收下一个信号}if(results.value == 0xFF6897)  //如果接收到某个按键的信号{digitalWrite(9,0);}if(results.value == 0xFFB04F)  //如果接收到另一个按键的信号{digitalWrite(9,1);}
}

将以上程序上传到Arduino板,并尝试使用刚刚记录的两个红外遥控的按键来操控一下LED的亮灭。

五、总结

本章同样涉及了多个硬件模块及若干语法的使用,其中对于原理较为简单的按键模块,可以直接读取其连接端口的高低电平来实现对LED灯的控制;但对于较为复杂的红外接收传感器,需要借助其他开发者贡献的来进行操作,库的使用大大的减少了我们使用的代码量,比如完成某个功能,仅需要像“ir.resume()”类似的形式即可调用库文件中相应的功能,包括后续章节涉及到的复杂的元器件,都会借助其相应的库来进行使用;另外本章讲解的“if判断”语句也是判断语法相关语句中较为基础且重点的内容,需要读者认真研读,理清代码执行逻辑。

相关文章:

  • CSS单位vmin、vmax
  • 【JMeter】BeanShell了解基础知识
  • C/C++---------------LeetCode第118. 杨辉三角
  • RT-Thread Studio文件消失不见或被排除构建
  • 【唐山海德教育】职称评审需要什么条件呢?
  • 2-- 简要介绍 Kubernetes
  • 【Python】zip
  • 【Openstack Train安装】五、Memcached/Etcd安装
  • 【工作生活】汽车电子嵌入式开发简介
  • python socket编程7 - 使用PyQt6 开发UI界面新增实现UDP server和client单机通讯的例子
  • 并发集合框架
  • jupyter notebook搭建
  • 封装ThreadLocal
  • Redux,react-redux,dva,RTK
  • 【WPF.NET开发】构造动态布局
  • 网络传输文件的问题
  • SegmentFault for Android 3.0 发布
  • 分享的文章《人生如棋》
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【译】理解JavaScript:new 关键字
  • Intervention/image 图片处理扩展包的安装和使用
  • Iterator 和 for...of 循环
  • Java多线程(4):使用线程池执行定时任务
  • JDK 6和JDK 7中的substring()方法
  • Laravel 中的一个后期静态绑定
  • MaxCompute访问TableStore(OTS) 数据
  • VUE es6技巧写法(持续更新中~~~)
  • Vue 重置组件到初始状态
  • vue-loader 源码解析系列之 selector
  • 如何设计一个比特币钱包服务
  • 试着探索高并发下的系统架构面貌
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 我是如何设计 Upload 上传组件的
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 智能合约Solidity教程-事件和日志(一)
  • Semaphore
  • ​业务双活的数据切换思路设计(下)
  • (26)4.7 字符函数和字符串函数
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (二)pulsar安装在独立的docker中,python测试
  • (四)JPA - JQPL 实现增删改查
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NetCore 如何动态路由
  • .net网站发布-允许更新此预编译站点
  • .net中我喜欢的两种验证码
  • @Async注解的坑,小心
  • @SpringBootApplication 包含的三个注解及其含义
  • @Transactional类内部访问失效原因详解
  • [20170705]diff比较执行结果的内容.txt
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [CTF]php is_numeric绕过