Arduino红外遥控格力空调的问题



Arduino红外遥控格力空调的问题

Arduino红外遥控空调失败。

我主要参考了这里:

http://blog.sina.com.cn/s/blog_942d7fa20100uyfm.html

的红外编码格式,空调遥控的型号正是YBOF2。

主要代码如下,利用了IRremote库

  1. void GreeAC::sendpresumable()
  2. {
  3.   irsend.mark(9000);
  4.   irsend.space(4500);
  5. }
  6. void GreeAC::send0()
  7. {
  8.   irsend.mark(560);
  9.   irsend.space(565);
  10. }
  11. void GreeAC::send1()
  12. {
  13.   irsend.mark(560);
  14.   irsend.space(1690);
  15. }
  16. //
  17. void GreeAC::sendGree(byte ircode, byte len)
  18. {
  19.   byte mask = 0×01;
  20.   for(int i = 0;i < len;i++)
  21.   {
  22.     if (ircode & mask)
  23.     {
  24.       send1();
  25.     }
  26.     else
  27.     {
  28.       send0();
  29.     }
  30.     mask <<= 1;
  31.   }
  32. }
  33. void GreeAC::test()
  34. {
  35.   irsend.enableIROut(38);
  36.   sendpresumable();
  37.   sendGree(0×49, 8);
  38.   sendGree(0x0A, 8);
  39.   sendGree(0×60, 8);
  40.   sendGree(0×50, 8);
  41.   sendGree(0×02, 3);
  42.   irsend.mark(560);
  43.   irsend.space(20000);
  44.   sendGree(0×01, 8);
  45.   sendGree(0×20, 8);
  46.   sendGree(0×00, 8);
  47.   sendGree(0xF4, 8);
  48.   irsend.mark(560);
  49.   irsend.space(0);
  50. }

复制代码

分享到:  QQ好友和群QQ好友和群

收藏收藏3 支持支持1 反对反对

回复举报

mep
沙发

  楼主| 发表于 2013-5-14 00:15:18 | 只看该作者
放了一晚上了。。。。没人搞过这个吗?
回复 支持 反对举报

pgf017979
板凳

 发表于 2013-5-14 08:55:08 | 只看该作者
我今年的毕业设计是做一个语音遥控器,主要是控制空调的。要想用红外控制不同品牌的控制,这个工作量是非常大的。因为要知道不同厂家的遥控器代码。最容易实现也是最笨的方法就是破解官方遥控器的代码。见笑了,我也是这样做的。下面我说一下格力品牌空调的红外代码结构:引导码+35位信息码(旧);引导码+35位信息码+延时20ms+32位信息码(新);这个我也是费了很大劲才搞懂新的格力遥控器的编码。注意:新的遥控器为了兼容旧款的遥控器,前面的编码是一样的。只是后面的32位新增加的。格力的编码符合NEC格式的码元时间。
红外一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。
回复 支持 反对举报

pgf017979
地板

 发表于 2013-5-14 08:58:13 | 只看该作者
楼主的编码果然跟我破解的是一样的,新的格力编码方式
void GreeAC::test()
{
irsend.enableIROut(38);
sendpresumable();
sendGree(0×49, 8);
sendGree(0x0A, 8);
sendGree(0×60, 8);
sendGree(0×50, 8);
sendGree(0×02, 3);
irsend.mark(560);
irsend.space(20000);
sendGree(0×01, 8);
sendGree(0×20, 8);
sendGree(0×00, 8);
sendGree(0xF4, 8);
irsend.mark(560);
irsend.space(0);
}
回复 支持 反对举报

mep
5#

  楼主| 发表于 2013-5-14 13:13:16 | 只看该作者

pgf017979 发表于 2013-5-14 08:58 
楼主的编码果然跟我破解的是一样的,新的格力编码方式
void GreeAC::test()
{

谢谢你的回复,不过我的代码在测试中并不能起作用,请问你能看出问题来吗?

回复 支持 反对举报

pgf017979
6#

 发表于 2013-5-14 15:45:30 | 只看该作者
把你的整个工程文件上存,有空帮你看看,你只是上存部分程序呀,好像没有问题
回复 支持 反对举报

mep
7#

  楼主| 发表于 2013-5-14 20:30:09 | 只看该作者

pgf017979 发表于 2013-5-14 15:45 
把你的整个工程文件上存,有空帮你看看,你只是上存部分程序呀,好像没有问题

好的,不过程序的其他部分看起来无关紧要。

我的代码共有三个文件,TestIR.ino,Gree.cpp,Gree.h。
板子是Arduino Uno,上面连接了DFRobot IR发射管,数字口3,一个按钮,数字口2

TestIR.ino

  1. #include “IRremote.h”
  2. #include “Gree.h”
  3. IRsend irsend;
  4. GreeAC gree;
  5. volatile boolean flag;
  6. void trig()
  7. {
  8.   flag = true;
  9. }
  10. void setup()
  11. {
  12.   Serial.begin(9600);
  13.   flag = false;
  14.   attachInterrupt(0, trig, FALLING);
  15. }
  16. void loop()
  17. {
  18.   if (flag == true)
  19.   {
  20.     gree.test();
  21.     flag = false;
  22.   }
  23. }

复制代码

Gree.h文件:

  1. #ifndef __Gree_h__
  2. #define __Gree_h__
  3. #include <arduino.h>
  4. #include “IRremote.h”
  5. //#define DEBUG 1
  6. class GreeAC
  7. {
  8.   private:
  9.     void sendpresumable();
  10.     void send0();
  11.     void send1();
  12.     void sendGree(byte ircode, byte len);
  13.   public:
  14.     void setstate(byte mode, byte fan, byte temp, byte power);
  15.     void test();
  16. };
  17. extern IRsend irsend;
  18. #endif

复制代码

还有一个文件Gree.cpp,就是我在第一个帖子里的代码。


红外管发射的时候我用手机摄像模式观察过,有红外光发射。

回复 支持 反对举报

pgf017979
8#

 发表于 2013-5-15 09:45:07 | 只看该作者
我用Arduino IDE 1.0.3 编译不了你的工程文件
回复 支持 反对举报

pgf017979
9#

 发表于 2013-5-15 11:15:43 | 只看该作者
用示波器观察才发现是定时器溢出了。延时20毫秒要分开延时2次10毫秒就解决问题。
{
irsend.enableIROut(38);
sendpresumable();
sendGree(0×49, 8);
sendGree(0x0A, 8);
sendGree(0×60, 8);
sendGree(0×50, 8);
sendGree(0×02, 3);
irsend.mark(560);
irsend.space(10000);//定时器溢出,要分开两次延时20ms
irsend.space(10000);//
sendGree(0×01, 8);
sendGree(0×20, 8);
sendGree(0×00, 8);
sendGree(0xF4, 8);
irsend.mark(560);
irsend.space(0);
}
<ignore_js_op>
P0254_150513_副本.jpg (151.77 KB, 下载次数: 15)

 

引导码

引导码

<ignore_js_op>

P0255_150513_副本.jpg (137.38 KB, 下载次数: 4)

 

楼主的错误代码效果

楼主的错误代码效果

<ignore_js_op>

P0256_150513_副本.jpg (143.49 KB, 下载次数: 5)

 

改正后的效果

改正后的效果
回复 支持 反对举报

10#

 发表于 2013-5-15 11:19:21 | 只看该作者
楼主的程序我编译不了,于是自己把它改到[pre lang="arduino" line="1" ]#include “Arduino.h”
#include <IRremote.h>
#include <IRremoteInt.h>
//#include <Gree.h>

IRsend irsend;
volatile boolean flag;

extern IRsend irsend;
//#define DEBUG 1

//    void setstate(byte mode, byte fan, byte temp, byte power);
void test();
void sendpresumable();
void send0();
void send1();
void sendGree(byte ircode, byte len);
void sendpresumable()
{
irsend.mark(9000);
irsend.space(4500);
}
void send0()
{
irsend.mark(560);
irsend.space(565);
}

void send1()
{
irsend.mark(560);
irsend.space(1690);
}

//
void sendGree(byte ircode, byte len)
{
byte mask = 0×01;
for(int i = 0;i < len;i++)
{
if (ircode & mask)
{
send1();
}
else
{
send0();
}
mask <<= 1;
}
}

void test()
{
irsend.enableIROut(38);
sendpresumable();
sendGree(0×49, 8);
sendGree(0x0A, 8);
sendGree(0×60, 8);
sendGree(0×50, 8);
sendGree(0×02, 3);
irsend.mark(560);
irsend.space(10000);
irsend.space(10000);
sendGree(0×01, 8);
sendGree(0×20, 8);
sendGree(0×00, 8);
sendGree(0xF4, 8);
irsend.mark(560);
irsend.space(0);
}
void trig()
{
flag = true;
}

void setup()
{
Serial.begin(9600);
flag = false;
pinMode(2,INPUT_PULLUP);
//  attachInterrupt(0, trig, FALLING);
}

void loop()
{
int val = digitalRead(2);
if (val == 0)
{
test();
delay(2000);
//    flag = false;
}
}
[/code]一个工程里面