本帖最后由 maidoo 于 2016-7-11 10:53 编辑
软件上屏蔽自收发冲突是很容易的。Arduino的IrRemote库其实本身就不支持同时自发自收。下面是我写的一键开启电视,功放加机顶盒的代码,有收有发,调试OK。可参考- /*
- * On my Arduino pro mini board, I use some IO pin to supply power for IR receiver.
- * This will be benfit to mount IR recv module to board.
- D9--- Data
- D8--- GND
- D7--- VCC
- */
- #include <IRremote.h>
- #define RECV_PIN 9
- // LED_PIN: Arduino mini pro =13; DigiSpark =0
- #define LED_PIN 13
- IRrecv irrecv(RECV_PIN);
- IRsend irsend;
- decode_results results;
- // ====== 可触发系统动作的红外指令 ======
- #define CMD_TRIG 0xC1AA11EE
- // ====== 被触发的指令 ======
- // IPTV机顶盒 开
- #define CMD11 0xC1AAA15E
- // 电视机 开
- #define CMD12 0x1eff33CC
- // 功放 开
- #define CMD13 0x00ff55AA
- // ------ 延时几秒钟后
- // 电视机 静音
- #define CMD21 0xC1AA21DE
- // IPTV 切换到 42 频道
- #define CMD22 0x1e2354AB
- #define CMD23 0xf30101FE
- int mode;
- void setup()
- {
- Serial.begin(9600);
- // provide VCC and GND for IR receiver module
- pinMode(8, OUTPUT); digitalWrite(8, LOW);
- pinMode(7, OUTPUT); digitalWrite(7, HIGH);
- irrecv.enableIRIn();
- // LED off
- pinMode(LED_PIN, OUTPUT);
- digitalWrite(LED_PIN, LOW);
- Serial.println("maidoo-Receiver started!");
- }
- void loop()
- {
- volatile unsigned long time;
- unsigned char i;
- if (irrecv.decode(&results)) {
- Serial.println(results.value,HEX);
- digitalWrite(LED_PIN, HIGH);
- //dump(&results);
- // 检测到这是总开关的指令,开始做事
- if (CMD_TRIG == results.value) {
- digitalWrite(LED_PIN, HIGH);
- Serial.print("I wakeup to do somthing.");
- irsend.sendNEC(CMD11, 32); delay(50);
- irsend.sendNEC(CMD12, 32); delay(50);
- irsend.sendNEC(CMD13, 32);
- // 延时 5秒 等机顶盒启动完毕
- //time = millis();
- //while (millis() - time < 3000);
- for (i=0; i <= 5; i++) {
- digitalWrite(LED_PIN, HIGH);
- delay(200);
- digitalWrite(LED_PIN, LOW);
- delay(800);
- }
- irsend.sendNEC(CMD21, 32); delay(50);
- irsend.sendNEC(CMD22, 32); delay(50);
- irsend.sendNEC(CMD23, 32);
- Serial.println(" ---> Done!");
- // Both sender & receiver used the same Timer2, it should be re-init recv to enable interrupt
- irrecv.enableIRIn();
- }
- else{
- //time = millis();
- //while (millis() - time < 200);
- delay(50);
- }
- digitalWrite(LED_PIN, LOW);
- // 事情做完,重新开启红外接收
- irrecv.resume(); // Receive the next value
- }
- }
复制代码 |