|
|
作为新手,今天练习了弘毅大哥和强哥教程里的红外遥控器一节,并做了一点小改进,使用红外遥控器控制数码管显示。实现用0~1在数码管上显示0~1,用“+”“-”显示下一个数和上一个数,用播放键循环播放0到9的功能。由于初学,代码略显冗长,而且一些功能也不完善,比如暂停。在这里把实现贴出来,求喷以求进步。
首先,数码管的1-10号针脚(详情请见http://www.geek-workshop.com/thread-2038-1-1.html)除3、8号外,分别对应ARDUINO上6、5、3、2、4、7、8、9端口。3号接口接3v3供电。红外接收器out脚接11端口实现通信。具体连线如图。
代码如下,总共定义了遥控器上的13个按键,具体请看注释。- #include <IRremote.h>
- /*************************
- IRreceiver
- *************************/
- const int irRecPin = 11;//定义红外信号接收引脚
- IRrecv irrecv(irRecPin);
- decode_results results;
- //定义红外遥控器每个按键发射的红外码,可以按照弘毅大哥的教程里的方式在串口监视器中查看确定
- long codes[13] =
- {
- 0xFF6897,
- 0xFF30CF, 0xFF18E7, 0xFF7A85,
- 0xFF10EF, 0xFF38C7, 0xFF5AA5,
- 0xFF42BD, 0xFF4AB5, 0xFF52AD,
- 0xFFE01F, 0xFFA857, 0xFFC23D
- };
- /************************
- Digital cube
- ************************/
- //定义数码管的开关状态实现数字显示
- int digits[10][8] =
- {
- {1,0,0,0,0,0,0,1},//0
- {1,0,0,1,1,1,1,1},//1
- {1,1,0,0,0,0,1,0},//2
- {1,0,0,0,1,0,1,0},//3
- {1,0,0,1,1,1,0,0},//4
- {1,0,1,0,1,0,0,0},//5
- {1,0,1,0,0,0,0,0},//6
- {1,0,0,1,1,0,1,1},//7
- {1,0,0,0,0,0,0,0},//8
- {1,0,0,0,1,0,0,0} //9
- };
- int currentDigit = 0;//用来保存当前数字
- void digitWrite(int digit)//用来显示数字
- {
- for(int pin = 2; pin <= 9 ; pin++)
- digitalWrite(pin, digits[digit][pin - 2]);
- }
- /**************************
- Launch up
- **************************/
- void setup()
- {
- Serial.begin(9600);
- irrecv.enableIRIn();
-
- for(int i = 2 ; i <= 9 ; i++)
- {
- pinMode(i, OUTPUT);
- digitalWrite(i, HIGH);
- }
- }
- void loop()
- {
- if(irrecv.decode(&results))
- {
- for(int i = 0 ; i <=13 ; i++)
- {
- //0~9按键对应显示0~9
- if(results.value == codes[i] && i <= 9)
- {
- digitWrite(i);
- currentDigit = i;
- break;
- }
- //“-”按键对应显示上一个数字
- else if(results.value == codes[10] && currentDigit != 0)
- {
- currentDigit--;
- digitWrite(currentDigit);
- break;
- }
- //“+“对应显示下一个数字
- else if(results.value == codes[11] && currentDigit != 9)
- {
- currentDigit++;
- digitWrite(currentDigit);
- break;
- }
- //“播放”对应循环播放0~9
- else if(results.value == codes[12] && stat == 0)
- {
- for(int j = 0 ; j <= 9 ; j++)
- {
- digitWrite(j);
- currentDigit = j;
- delay(500);
- }
- }
- }
- //可在串口监视器查看红外码
- Serial.print(results.value, HEX);
- Serial.println();
- //等待接收下一个信号
- irrecv.resume();
- }
- delay(600);
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|