- 积分
- 20
- 在线时间
- 53 小时
- 最后登录
- 2023-4-7
- 阅读权限
- 40
- 精华
- 0

- UID
- 81202
- 帖子
- 19
- 精华
- 0
- 经验
- 20 点
- 金钱
- 18 ¥
- 注册时间
- 2009-2-17
|
本帖最后由 cjnt007 于 2014-2-24 15:29 编辑
前阵子受到坛子车友的诱惑,也跟着入了台智跑车机,为了使用方便,也想利用车机方控功能实现红外遥控。正好手上有几块Arduino Nano的板子,就不需要购买那个20多的遥控模块了,下面我把原理图和Arduino的代码分享出来。
- #include <IRremote.h>
- const int RECV_PIN = 19;//定义红外接收器的引脚为A5=D19
- const int Power_PIN = 8;
- const int Src_PIN = 4;
- const int Mute_PIN = 5;
- const int Up_PIN = 2;
- const int Down_PIN = 3;
- const int VolumUp_PIN = 6;
- const int VolumDown_PIN = 7;
- int KeyNum = 0; //记录按键号,0表示为无效键
- int PowerState=LOW;
- unsigned long Counter = 0; //延时计数器
- IRrecv irrecv(RECV_PIN);
- decode_results results;
- void KeyDown(int IO_Num){
- //切换为输出脚模式,设置为低电平输出,相当于将对应的电阻接地,
- pinMode(IO_Num,OUTPUT);
- digitalWrite(IO_Num,LOW);
- }
- void KeyUp(int IO_Num){
- pinMode(IO_Num,INPUT);
- }
- void setup(){
- //Serial.begin(9600);
- irrecv.enableIRIn(); // 初始化红外接收器
- irrecv.blink13(1); //开启13脚作指示,在接收时闪烁
- //设置为输入模式,各脚呈高阻抗状态,相当于开路
- pinMode(Power_PIN,OUTPUT);
- digitalWrite(Power_PIN,PowerState);
-
- pinMode(Mute_PIN,INPUT);
- pinMode(Up_PIN,INPUT);
- pinMode(Down_PIN,INPUT);
- pinMode(VolumUp_PIN,INPUT);
- pinMode(VolumDown_PIN,INPUT);
- }
-
- void loop() {
- if (irrecv.decode(&results)) {
- /*
- Serial.print("ircode:");
- Serial.print(results.value, HEX);//以16进制换行输出接收代码
- Serial.print(", bits: ");
- Serial.println(results.bits);
- Serial.println();//为了便于观看输出结果增加一个空行
- */
- switch (results.value){
- case 0x80BF3BC4: // Power键对应的红外接收代码,下同
- //KeyNum=Power_PIN; break;
- PowerState=~PowerState;
- digitalWrite(Power_PIN,PowerState);
- KeyNum=0;
- break;
- case 0x80BF738C: // Src
- KeyNum=Src_PIN; break;
- case 0x80BF39C6: // Mute
- KeyNum=Mute_PIN; break;
- case 0x80BF53AC: // Up
- KeyNum=Up_PIN; break;
- case 0x80BF4BB4: // Down
- KeyNum=Down_PIN; break;
- case 0x80BF9966: // V+
- KeyNum=VolumUp_PIN; break;
- case 0x80BF837C: // V-
- KeyNum=VolumDown_PIN; break;
- case 0xFFFFFFFF: //repeat
- break;
- default:
- KeyNum=0;
- }
- if(KeyNum){
- KeyDown(KeyNum);
- delay(200);
- Counter = 0;
- }
- irrecv.resume(); // 接收下一个值
- }else{
- if(KeyNum){
- //delay(200);
- Counter++;
- if (Counter>17000){ //如果开启串口输出功能,需将条件判断改为Counter>50
- KeyUp(KeyNum);
- //Serial.println("Key UP");
- KeyNum = 0;
- Counter = 0;
- }
- //Serial.println(Counter);
- }
- }
- }
复制代码
说明下:
1、代码中的红外编码对应的是广电有线机顶盒遥控器的几个按键,如果换用其他遥控器,那几个16进制代码是需要更改的。
2、这个代码可以实现长按键效果,比如长按音量键连续调整音量,长按SRC(遥控器上的确认键)实现软关机。
3、遥控器上的红色待机键对应Power功能,控制5V继电器切换Power-on信号。(我使用的电源将Power-ON信号线接5V,主电源12V开始供电。)
4、Q3如果使用NPN的管子,应该将int PowerState=LOW;这行改为int PowerState=HIGH; |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|