物联网智能硬件解析之万能空调遥控器实现 Ardunio_通过红外线发射灯遥控空调

这其实就是空调万能遥控器的原理。


用arduion遥控空调。

首先我做了一下以下几点

(1)首先有一个红外线接收管 IR receiver

(2)红外线发射灯

(3)arduino uno的板子

(4)几条面包线 Jumper cables

(5)空调遥控器


首先自己家中空调是TCL的挂式空调。。。。这个首先说明。  arduino遥控空调和空调牌子有关

(1)硬件的链接如图所示。


(2)图中告诉你如何将红外线接收管和arduino通过面包线相连。

(3)安装好IRremote.h函数库(直接从github中搜irremote进行下载 你要找到如下三个文件 IRremote.ccp IRremote.h IRremoteInt.h ,在 arduino 安装目录下的libraries\arduino_iremote_master)  注意将函数库放在正确的位置我将他们放到了\Arduino\libraries\RobotIRremote\src中了。。。这个只要能编译不报错就行

(4)因为本人的TCL空调的遥控器编码是228位,所以必须要修改IRremoteInt.h中的三行代码

第一行:

#define RAWBUF 100

换成 #define RAWBUF 255

这是因为我的空调遥控器编码是228位,100位太少了。

有人问要是大于255位怎么办?见这个帖子

编码大于255位的解决办法


第二行:

#define _GAP 5000 

换成#define _GAP 50000 

这是因为默认的数据是5000,因为遥控器会连续发两段代码,所以5000这个参数不适用,需要改到50000,否则你只能
接受到前一段代码仍然无法控制你家的空调 详情请见

第三行:

将uint8_t rawlen;  变成 int rawlen;

typedef struct {
  uint8_t recvpin;           // pin for IR data from detector
  uint8_t rcvstate;          // state machine
  uint8_t blinkflag;         // TRUE to enable blinking of pin 13 on IR processing
  unsigned int timer;     // state timer, counts 50uS ticks.
  unsigned int rawbuf[RAWBUF]; // raw data
// uint8_t rawlen;         // counter of entries in rawbuf
int rawlen;
} 
irparams_t;


改完之后按一下步骤

调用dump代码了,
1 连线  按照我贴的连接的教程连接好你的红外接收器 ,一般 最左侧的是数据线然后是gnd 和vcc
2 在arduino 中调出IRecvDump 的例程序,可以通过 FILE->EXAMPLES->Arduino_IRremote_master 下找到
3 编译和下载
4 打开com口监控 Tools->Serial Monitor
5 使用你家的空调遥控器对着接收头按一下开关键
6 这个时候串口会跳出你家空调开关的代码

IRecvDump的代码如下

/*
 * IRremote: IRrecvDump - dump details of IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
 * LG added by Darryl Smith (based on the JVC protocol)
 */

#include <IRremote.h>

/* 
*  Default is Arduino pin D11. 
*  You can change this to another available Arduino Pin.
*  Your IR receiver should be connected to the pin defined here
*/
int RECV_PIN = 11; 

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}


void dump(decode_results *results) {
  // Dumps out the decode_results structure.
  // Call this after IRrecv::decode()
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  }
  else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");

  }
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  }
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  }
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == PANASONIC) {
    Serial.print("Decoded PANASONIC - Address: ");
    Serial.print(results->address, HEX);
    Serial.print(" Value: ");
  }
  else if (results->decode_type == LG) {
    Serial.print("Decoded LG: ");
  }
  else if (results->decode_type == JVC) {
    Serial.print("Decoded JVC: ");
  }
  else if (results->decode_type == AIWA_RC_T501) {
    Serial.print("Decoded AIWA RC T501: ");
  }
  else if (results->decode_type == WHYNTER) {
    Serial.print("Decoded Whynter: ");
  }
  Serial.print(results->value, HEX);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 1; i < count; i++) {
    if (i & 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    }
    else {
      Serial.write('-');
      Serial.print((unsigned long) results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println();
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}

串口中获得的数据如下:


将其中的数字部分中的所有负数取绝对值。有些牌子的空调需要将第一个数移到最后一个数后。这个还是要根据空调的牌子的型号。

本人的TCL空调不用移位。

移位示例

去除示例

本人是没有动第一个数。原封不动。


选择其中的一行,将负数改成了正数。

快速修改方式


将硬件如图安装。

将一下代码烧录到arduion中

/*
* arduino遥控空调
 */
 
//By Yang Shuo
//http://blog.csdn.net/worldmakewayfordream
//Update: Pin 3 IR LED test function
 
 
#include <IRremote.h>                  // 引用 IRRemote 函式库
unsigned int rawCodes_ac_close[228]={3000,1600,450, 1100,450, 1100,450, 400,500, 350,450, 350,450, 1100,450, 400,400, 450,400, 1100,500, 1100,450, 400,400, 1100,500, 350,400, 400,450, 1100,450, 1150,450, 400,400, 1100,500, 1100,450, 400,400, 400,400, 1150,400, 450,450, 350,450, 1100,450, 400,400, 400,450, 400,400, 400,400, 400,450, 400,450, 350,450, 400,400, 400,450, 350,450, 400,450, 350,450, 350,450, 400,450, 350,400, 400,500, 350,450, 350,450, 400,450, 350,450, 1100,450, 400,450, 400,400, 1100,450, 1100,450, 1150,450, 400,450, 350,450, 350,450, 400,450, 350,400, 400,500, 350,450, 350,450, 400,450, 350,450, 400,400, 400,400, 450,400, 1100,450, 400,450, 1100,450, 400,400, 400,450, 400,400, 400,400, 450,400, 400,400, 400,450, 400,400, 400,400, 400,450, 400,400, 400,400, 450,400, 400,450, 350,450, 400,400, 400,450, 350,450, 400,450, 350,450, 350,500, 350,450, 350,400, 450,450, 350,450, 350,450, 400,450, 350,450, 400,400, 400,450, 400,400, 400,400, 400,450, 400,400, 400,400, 400,450, 400,400, 1100,500, 350,450, 400,450, 350,450, 400,400, 400,450, 1100,450, 400,400}; 


IRsend irsend;                          // 定义 IRsend 物件来发射红外线讯号
 
void setup()
{
  pinMode(3, OUTPUT);   
  digitalWrite(3, HIGH);   // 点亮LED测试(需通过手机摄像模式观察) 你可以开始插个led灯来观察led灯是否亮,如果亮就可以换成红外线发射灯了
  delay(3000);             // 等待3秒
  digitalWrite(3, LOW);    // 结束测试
}

void loop()
{
  Serial.print("SendIR: ");
  irsend.sendRaw(rawCodes_ac_close,228, 40);
  delay(3000);             // 等待3秒
}


注意sendRaw函数第一个参数是空调的编码,就是arduion串口接收的一大堆数,你只要全部都取绝对值就可以了。

第二个参数是编码的个数。这个在接收时告诉你了。Raw(228):之后一大堆数.....   这样你就不用自己数了。

第三个参数是红外线频率。  主流的红外线频率是40,38,32.  这个你多试几次吧。   每个牌子的空调红外线频率不一样。TCL的是40.


这样你就可以遥控空调了。

下面附一张我的安装后可以调控空调的硬件图。



这样你就可以操纵空调,让空调感受到红外线的操控而出音了。。。

reference:

文章一 

文章二

文章三 

文章四

文章五 

文章六

文章七







已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页