Arduino基础入门之十 红外遥控1位数码管的显示

一 硬件

    

 如图数码管是由8个LED(b,a,f,g,e,d,c,DP)构成,外接有10个端口,我自己连接的引脚标号如图,另外数码管分共阳和共阴,区别也很简单,如下【1】

共阳数码管,它们公共端接5V,那在代码中,控制另一端的数字引脚为LOW,这样才能让数码管点亮。

如果是共阴数码管,公共端接GND,在代码中中,控制另一端数字引脚为HIGH,才让数码管点亮。

     连线的话,本来按照网站【1】的接法如下图,是在8个LED都接入220欧电阻,两个共阳极都接了5V,觉得这样比较麻烦,所以实际连线图还是按照最开始的上图,每个端口对应数字引脚直接连接即可,并没有串联电阻,在一个共阳极串联一个220欧再接5V,另一个共阳极空置(共阳极两个端口内部本来就是相连的)

 

二 代码

1. 目的:通过红外遥控器控制1位数码管的显示,希望实现以下3个具体功能
1)通电后数码管随机显示一位数(目前随机出来总是7)
2)遥控器按0~9,就显示对应数字
3)遥控器按+或-,数字相应加/减一位,直到9/0不能增减为止

2. 代码如下

//红外遥控控制1位数码管

#include <IRremote.h>//调用红外遥控的库
int RECV_PIN = 11;//定义红外接口数字引脚
IRrecv irrecv(RECV_PIN);//创建一个红外线接收对象irrecv
decode_results results;//声明一个IRremote库函数独有的变量类型(decode_results),results存放红外解码结果,


int ledpin = 13;//定义LED接口引脚,为了观察遥控器是否发送成功,用LED灯的亮灭来直观展示
boolean ledstate = LOW;

int currentnumber = random(0,10);//定义当前显示的数字为一随机数

//数码管部分相关
/*一位共阳数码管,10个接口,8个对应8个LED(7个条形+1个点形),两个对应正(共阳)
引脚接法,共阳极接5V或数字引脚(该引脚给高电平),其他八个端口对应数字引脚2~9
b --> 2
a --> 3
f --> 4
g --> 5
e --> 9
d --> 8
c --> 7
DP--> 6
*/
unsigned long IRcode[12] = {//红外编码0~9,+ -
  0xFF6897,0xFF30CF,0xFF18E7,0xFF7A85,0xFF10EF,//0~4
  0xFF38C7,0xFF5AA5,0xFF42BD,0xFF4AB5,0xFF52AD,//5~9
  0xFFA857,0xFFE01F//+,-
  };

int number[10][8]={//二维数组,实际存放的是2~9引脚对应的高/低电平即1/0组合,从而点亮对应数码管,显示对应数字
   {0,0,0,1,1,0,0,0},//对应0
   {0,1,1,1,1,0,1,1},//对应1
   {0,0,1,0,1,1,0,0},
   {0,0,1,0,1,0,0,1},
   {0,1,0,0,1,0,1,1},
   {1,0,0,0,1,0,0,1},//对应n,,,
   {1,0,0,0,1,0,0,0},
   {0,0,1,1,1,0,1,1},
   {0,0,0,0,1,0,0,0},
   {0,0,0,0,1,0,0,1}//对应9
  };

void numbershow(int i){//显示数字i
   for(int pin=2;pin<=9;pin++){
    digitalWrite(pin,number[i][pin-2]);
    }
  }

void setup()
{
  //数码管部分初始设置
  for(int i=2;i<=9;i++){//设置数字引脚2~9为输出模式
    pinMode(i,OUTPUT);//数码管各连接引脚为输出模式,低电平时对应LED段亮
    digitalWrite(i,HIGH);//各LED灯初始是灭
     }
  //红外遥控部分初始设置
  irrecv.enableIRIn(); //启动红外解码
  
  //led灯初始设置
  pinMode(ledpin, OUTPUT);
}

void loop() {
  if (irrecv.decode(&results)) {//首先判断是否按遥控器并接收到红外码,若是,这个函数会返回true,把红外解码的结果放在results里面,并开始进行下列操作

    //1.每按一次,UNO上13引脚对应的LED灯亮或灭,从而直观判断有没有按-送-接收这一套流程成功
      ledstate = !ledstate;
      digitalWrite(ledpin,ledstate);
    //2.判断按的是什么按钮
      //2.1如果按的是0~9,显示对应数字
        for(int i=0;i<=9;i++){
           if(results.value==IRcode[i]){//将接收到的value与IRcode里面0~9的代码一一对照,如果有一个相等
            currentnumber=i;//将对应的i赋给currentnumber
            numbershow(currentnumber);
          }
        }
      //2.2如果按的是+号(0xFFA857),且当前数字不是9,就让显示的数字加一位
        if(results.value==IRcode[10]&&currentnumber!=9){
             currentnumber=currentnumber+1;
             numbershow(currentnumber);
        }
      //2.3如果按的是-号(0xFFE01F),且当前数字不是0,就让显示的数字减一位
        if(results.value==IRcode[11]&&currentnumber!=0){
             currentnumber=currentnumber-1;
             numbershow(currentnumber);
        }
    irrecv.resume(); // 在解码一个红外线信号之后,要运行resume()函数,这样才会持续接收下一组信号
   }
  else{//若没有按遥控器,数码管初始显示随机数,不过随机数始终是7,原因不明
    numbershow(currentnumber);
    } 
 }

3. 主要知识点

1)首先是明白数码管显示数字的道理,即为什么代码中有一套二维数组int number[10][8]对应数字0~9(二维数组,10对应的是0~9这10个数,8是对应8段led对应的电平)

      其实道理也很简单,以显示0为例,数码管中8段LED,只要b、a、f、e、d、c这6段LED亮,其他2段灭即可,对照连线,即2~9数字引脚高低电平组合就应该为{0 0 0 1 1 0 0 0}(共阳极数码管,低电平对应段亮),其他数字道理类似。当然,这个电平组合码和连线是有关的,如果连线对应的引脚变了,那就得重新分析。这样,0~9这10个数就分别有10组这样的高低电平组合码,所以构建了一个二维数组,方便调用。而要把这种组合码写入对应的引脚,是用了循环的方式,即:

for(int pin=2;pin<=9;pin++){//引脚pin2~9循环,,显示上面二维数组第i个元素(第i行)
    digitalWrite(pin,number[i][pin-2]);//第i行元素就是显示数字i的数码管高低组合码

还是以0为例,整个循环过程如下:
pin=2 --> n[0][0] =0 --> digitalWrite(2,0) --> b段点亮
pin=3 --> n[0][1] =0 --> digitalWrite(3,0) --> a段点亮
pin=4 --> n[0][2] =0 --> digitalWrite(4,0) --> f 段点亮
pin=5 --> n[0][3] =1 --> digitalWrite(5,1) --> g段不点亮
pin=6 --> n[0][4] =1 --> digitalWrite(6,1) -->DP段不点亮
pin=7 --> n[0][5] =0 --> digitalWrite(7,0) --> c段点亮
pin=8 --> n[0][6] =0 --> digitalWrite(8,0) -->d段点亮
pin=9 --> n[0][7] =0 --> digitalWrite(9,0) -->e段点亮

当然这个循环效果(即2~9引脚对应的数码管相应地亮或灭)是看不出来的,因为时间太快了,直接呈现这个数字了

2)红外遥控器部分参考上一个笔记【2】,就可以知晓每个按钮对应的红外解码结果(十六进制),把这个项目要用到的几个按钮的红外解码构成一个数组IRcode[12](注意results.value是unsigned long 型)

3)注意逻辑关系

 第一层是判断是否接收到遥控器发送的信号,分为是和否两种情况;

第二层是在第一层为是的情况下,判断收到的是什么码,对应哪个按钮,又分为三种情况。

详细的解释见代码注释。

4)为了对遥控器按-发送-接收这一套流程是否成功有个直观判断,程序中加入了一个13号引脚高低电平变换操作(板载有个对应LED灯),这样这个LED的亮灭就代表这个按钮到接收的操作完成了,如果出现其他数码管没有预期效果的情况,至少可以通过这个现象排除掉一个可能。

5)一个问题,就是希望随机显示一个数,用了random(0,10)这个函数,但是始终显示数字7,不知什么原因,估计还是函数使用有问题。

       另外还犯过一个错误,就是把这个随机生成函数放到了loop()的里面,导致数码管一直显示8,用串口查了一下,发现确实是生成的随机数,我猜想应该是因为loop()里面循环速度太快了,所以随机数不断循环显示,导致各个数码管都亮,看起来就是8了。

【1】DFR0100 Arduino教程 15-红外接收 - DF创客社区 - 分享创造的喜悦 项目十五红外遥控数码管数码管,常见的用来显示数字的,比如像计算器。在本实验之前我们先来了解一下数码管是如何工作的。数码管,其实也算是LED中的一种。数码管的每一段,都是一个独立的LED,通过数字引脚来控制相应段的亮灭就能达到显示数字的效果。下面让我们通过实验的方式来感受一下数码管的神奇之处吧!所需元件硬件连接按下图连线图连接,注意数码管各段所对应的引脚。右边引脚说明图上为什么画这么几个箭头呢?个人... icon-default.png?t=L892https://mc.dfrobot.com.cn/thread-2537-1-1.html【2】Arduino基础入门之九 红外遥控_u013978070的专栏-CSDN博客_arduino红外遥控器一 硬件 这套元件是红外接收头(左)和红外遥控器(右),遥控器按一下,红外接收头接收到并让UNO执行相应的操作。卖家给的资料里面依然是不给力地没有标清楚接收头三个引脚具体接法,我只能反复试,和以前不同,将红外接收头接入UNO,如果接错了,上传代码后UNO会灭灯,完全不能工作,试错了几次得到如上图的结果,VCC对应5V ,OUT则对应一个数字引脚,只是不知换一种接头是不是还要试错? 二 代码1.初试红外遥控,功能:通过串口查看红外遥控器按钮对应的红外码,代码如下/* 红外...https://blog.csdn.net/u013978070/article/details/119897442

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值