本帖最后由 xzmoji 于 2014-7-12 09:28 编辑
一回到家,爸妈总问在大学学了什么东西,都不知道怎么回答。正巧家里的电视遥控器时好时坏,心血来潮,做个好玩的遥控器吧。
硬件:
arduino mini pro
摇杆模块
9V电池
电池扣
红外发射管
使用需求
声音+、声音—、频道+、频道—、切换喜欢的频道、关机
图就不画了,接线很简单 。
摇杆: S-K -------2
S-X ------A3
S-Y --------A4
VCC--------VCC
GND-------GND
红外发射管 正极------3 话说用IRremote库一定要连PIN3 负极-----GND 网上有帖子说,要接个电阻限流,个人测试 不加电阻时,可以遥控的距离远一些,所以没加
- #include <IRremote.h>
- //电视遥控器的编码
- #define NUM0 0x80BFE11E
- #define NUM1 0x80BF49B6
- #define NUM2 0x80BFC936
- #define NUM3 0x80BF33CC
- #define NUM4 0x80BF718E
- #define NUM5 0x80BFF10E
- #define NUM6 0x80BF13EC
- #define NUM7 0x80BF51AE
- #define NUM8 0x80BFD12E
- #define NUM9 0x80BF23DC
- #define BOX_POWER 0x80BF3BC4
- #define TV_POWER 0x04FBE01F
- #define VOICE_UP 0x80BFA15E
- #define VOICE_DOWN 0x80BF619E
- #define CHANNEL_UP 0x80BF53AC
- #define CHANNEL_DOWN 0x80BF4BB4
- #define KEY_OK 0x80BF738C
- //引脚说明
- #define PIN_X A3
- #define PIN_Y A4
- #define JOY_BUTTON 2 //我看到这模块有3个输出引脚的时候才知道原来摇杆可以按下去的。。。- -!
- #define AREF_MIDDLE 500 //摇杆X、Y轴静止时,模拟输出500,范围0-1023
- #define AREF_MAX 1023
- #define AREF_MIN 0
- #define OFFSET 20 //误差范围
- #define CHANNEL_AMOUNT 5 //喜欢的频道的个数
- int channelCount=0; //用于循环切换频道计数
- char* favourateChannel[CHANNELAMOUNT]={"10","5","8","40","41"};//喜欢的频道
- IRsend irsend;
- void setup()
- {
- pinMode(JOY_BUTTON,INPUT);
- Serial.begin(9600);
- }
- void loop(){
-
-
- //摇杆上揺
- if(isUp()){
- pressVoiceUp();//增加音量
- }
- //摇杆下揺
- if(isDown()){
- pressVoiceDown();//减小音量
- }
- //摇杆左揺
- if(isLeft()){
- pressChannelDown();//频道减
- }
- //摇杆右揺
- if(isRight()){
- pressChannelUp();//频道增
- }
-
- //按下摇杆,按一下松开为切换喜欢的频道,长按关闭电视
- if(isButton())
- {
- int i=0;
- while(isButton()&&i<50)// 这里用i记录按住OK键的时间,一直按着直到循环结束的时间是500ms ,因为isButton()函数中有10ms的消抖,循环50次
- {
- i++;
- }
- if(i>=50)//按住超过500ms ,关电视电源
- {
- //close TV
- pressTVPower();
- }
- else if(i<50)//按住小于500ms ,循环切换喜欢的频道
- {
- // change channel
- pressChannelNum(favourateChannel[channelCount]);
-
- //循环计数
- channelCount++;
- if(channelCount==CHANNEL_AMOUNT){channelCount=0;}
- }
- }
-
- delay(150);//调节延时,避免漏按或者多按
- }
- //判断摇杆是否上揺
- int isUp(){
- int valueX = analogRead(PIN_X);
- int valueY= analogRead(PIN_Y);
- //误差在一个范围内,可认为是有效操作
- if(abs(valueY-AREF_MIN)<OFFSET){ Serial.println("Up");return 1;}
- else return 0;
- }
- //判断摇杆是否下揺
- int isDown()
- {
- int valueX = analogRead(PIN_X);
- int valueY= analogRead(PIN_Y);
- if(abs(valueY-AREF_MAX)<OFFSET){ Serial.println("Down");return 1;}
- else return 0;
- }
- //判断摇杆是否左揺
- int isLeft()
- {
- int valueX = analogRead(PIN_X);
- int valueY= analogRead(PIN_Y);
- if(abs(valueX-AREF_MIN)<OFFSET) { Serial.println("Left");return 1;}
- else return 0;
- }
- //判断摇杆是否右揺
- int isRight()
- {
- int valueX = analogRead(PIN_X);
- int valueY= analogRead(PIN_Y);
- if(abs(valueX-AREF_MAX)<OFFSET){ Serial.println("Right");return 1;}
- else return 0;
- }
- //判断摇杆是否被按下
- int isButton(){
- if(digitalRead(JOY_BUTTON)==0){
- delay(10);
- if(digitalRead(JOY_BUTTON)==0){
- return 1;
- }
- }
- return 0;
- }
- void pressOK(){
- irsend.sendNEC(KEY_OK, 32);
- }
- void pressVoiceUp(){
- irsend.sendNEC(VOICE_UP, 32);
- }
- void pressVoiceDown(){
- irsend.sendNEC(VOICE_DOWN, 32);
- }
- void pressChannelUp(){
- irsend.sendNEC(CHANNEL_UP, 32);
- }
- void pressChannelDown(){
- irsend.sendNEC(CHANNEL_DOWN, 32);
- }
- void pressTVPower(){
- irsend.sendNEC(TV_POWER, 32);
- }
- void pressBoxPower(){
- irsend.sendNEC(BOX_POWER, 32);
- }
- //发送每个频道的红外编码
- void pressChannelNum(char* channelNum){
- int i=0;
- while(channelNum[i]!='\0'){
- switch(channelNum[i]){
- case '0':irsend.sendNEC(NUM0, 32);break;
- case '1':irsend.sendNEC(NUM1, 32);break;
- case '2':irsend.sendNEC(NUM2, 32);break;
- case '3':irsend.sendNEC(NUM3, 32);break;
- case '4':irsend.sendNEC(NUM4, 32);break;
- case '5':irsend.sendNEC(NUM5, 32);break;
- case '6':irsend.sendNEC(NUM6, 32);break;
- case '7':irsend.sendNEC(NUM7, 32);break;
- case '8':irsend.sendNEC(NUM8, 32);break;
- case '9':irsend.sendNEC(NUM9, 32);break;
- default:;
- }
- delay(100);//2个按键间的延时
- i++;
- }
- pressOK();//确认
- // press OK
- }
复制代码
先用Uno测试,等做好了马甲,再换小一点的mini
上个视频
悲剧的经验:遇到了问题,一定要首先检测硬件!!之前一直以为一体化红外管可以接收和发送,然后在代码上纠结了半天,逛过很多论坛看过很多帖子,最后在淘宝看到写着———红外一体化接收管......顿时就晕了。,之前误以为下面的那个也能发射,怎么试都不行,后来一用上面的红外发射管就成功了。。 |