『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 21510|回复: 22

[基础教程] 获取并发射杜亚433.92Mhz遥控器的发射码

[复制链接]

15

主题

193

帖子

2042

积分

论坛技术达人

积分
2042
金钱
1829
HASS币
0

卓越贡献

发表于 2017-10-6 10:36:46 | 显示全部楼层 |阅读模式
本帖最后由 syjjx 于 2017-10-6 10:38 编辑

看到@step0766的帖子,利用树莓派发射射频信号,打算采集下家里的杜亚窗帘的射频码,结果发现并不行,后来查了相关资料,发现用arduino默认的rc-switch的库是不行的,所以根据杜亚的射频信号修改了一下。




附件中是修改后的rc-switch库


以下是采集和测试发送的代码
---------采集-----------------
int logfile[40];
        int i = 0;
        float lastTime = 0;
        boolean capturing = false;
        boolean checking = false;
        boolean dataIncoming = false;


        void setup() {
          Serial.begin(9600);
          Serial.println("start...");
          pinMode(2, INPUT);
          attachInterrupt(0, handleInterrupt, CHANGE);
        }


        void loop() {
        }


        void handleInterrupt() {


          if (!capturing) {  //wenn keine Aufnahme läuft
            if (!checking) {  //wenn nicht gerade auf "Start-Signal" geprüft wird
              if (digitalRead(2) == HIGH) {  //wenn Wechsel von LOW nach (jetzt) HIGH
                lastTime = micros();
                checking = true;
              }
            }


            else {    //wenn gerade auf Start-Signal geprüft wird
              if ((micros() - lastTime > 4000) && (digitalRead(2) == LOW)) {    //wenn HIGH-Phase länger als 4ms war und wir jetzt LOW sind
                //das war das Start-Signal
                checking = false;
                capturing = true;
                lastTime = micros();
              }


              else {
                //das war nicht das Start-Signal
                checking = false;
              }
            }
          }


          else {  //es läuft eine Aufnahme
            if (!dataIncoming) {  //bisher noch keine Nutzdaten empfangen
              if ((micros() - lastTime > 1000) && digitalRead(2) == HIGH) {  //das war die lange LOW-Phase vor Beginn der Übertragung
                dataIncoming = true; //ab jetzt kommen Daten  
                lastTime = micros();
              }
            }


            else {  //jetzt wird es interessant, jetzt kommen die Daten
              //wenn steigene Flanke (also jetzt HIGH)
              if (digitalRead(2) == HIGH) {
                //Beginn der HIGH-Phase merken
                lastTime = micros();
              }  


              //wenn fallende Flanke (also jetzt LOW)
              else if (digitalRead(2) == LOW) {
                //=> prüfe wie lange HIGH war
                if (micros() - lastTime > 500) {
                  //long
                  logfile = 1;
                }


                else {
                  //short
                  logfile = 0;
                }


                if (i < 39) {
                  //solange noch nicht alle Bits empfangen wurden
                  i++;
                }


                else {
                  //wir sind fertig
                  noInterrupts();  //Interrupts aus damit Ausgabe nicht gestört wird
                  Serial.println("Empfangene Daten:");
                  //Ausgabe als "quad-bit"
                  for (i = 0; i <= 38; i = i + 2) {
                    if ((logfile == 0) && (logfile[i+1] == 0))
                      Serial.print("0");


                    else if ((logfile == 0) && (logfile[i+1] == 1))
                      Serial.print("F");


                    else if ((logfile == 1) && (logfile[i+1] == 0))
                      Serial.print("Q");


                    else if ((logfile == 1) && (logfile[i+1] == 1))
                      Serial.print("1");
                  }
                  Serial.println();
                  i = 0;
                  dataIncoming = false;
                  capturing = false;
                  interrupts();  //Interrupts wieder an
                  return;  //und alles auf Anfang
                }
              }


            }
          }
        }
---------采集-----------------




---------发送-----------------
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  Serial.println("Starting...");
  mySwitch.enableTransmit(12);
  mySwitch.setProtocol(4);
}

void loop() {
  Serial.println("Up...");

  mySwitch.sendQuadState("0F0F00FQ00FQQ10F0F0F");
  mySwitch.sendQuadState("0F0F00FQ00FQQ10F0F1Q");

  delay(2000);

  Serial.println("Stop...");
  mySwitch.sendQuadState("0F0F00FQ00FQQ10FFFFF");

  delay(2000);

  Serial.println("Down...");

  mySwitch.sendQuadState("0F0F00FQ00FQQ10F0101");
  mySwitch.sendQuadState("0F0F00FQ00FQQ10F0110");

  delay(2000);

  Serial.println("Stop...");
  mySwitch.sendQuadState("0F0F00FQ00FQQ10FFFFF");

  delay(2000);
}

----------发送-------------



rc-switch.zip (36.88 KB, 下载次数: 217)




回复

使用道具 举报

5

主题

252

帖子

1934

积分

金牌会员

Rank: 6Rank: 6

积分
1934
金钱
1682
HASS币
0
发表于 2017-10-6 11:03:44 来自手机 | 显示全部楼层
good good good
回复

使用道具 举报

123

主题

4626

帖子

1万

积分

管理员

囧死

Rank: 9Rank: 9Rank: 9

积分
16009
金钱
11298
HASS币
45
发表于 2017-10-6 15:41:05 | 显示全部楼层
厉害了,不过这代码没格式,有点乱哦
回复

使用道具 举报

0

主题

74

帖子

224

积分

中级会员

Rank: 3Rank: 3

积分
224
金钱
150
HASS币
0
发表于 2017-10-6 18:42:08 | 显示全部楼层
好好好!有机会测试一下
回复

使用道具 举报

6

主题

271

帖子

2916

积分

金牌会员

Rank: 6Rank: 6

积分
2916
金钱
2640
HASS币
20

卓越贡献

发表于 2017-10-6 20:07:09 | 显示全部楼层
本帖最后由 step0766 于 2017-10-6 20:21 编辑

杜亚的遥控器是滚动编码的吗?滚动编码的话我的方法就行不通了如果是固定码:
1.可以刷rc-switch库里的ReceiveDemo_Advanced试一下;
2.或者拆开遥控器,用逻辑分析仪监视遥控器的信号发射管脚(就是连接天线那个管脚),最后得出的二进制发射码转换为十进制输入树莓派即可;
3.如果不想拆遥控器,也可以用逻辑分析仪监视接收模块的DATA管脚,看看接收到的信号就是二进制发射码,同样转为十进制输入树莓派即可。


回复

使用道具 举报

15

主题

193

帖子

2042

积分

论坛技术达人

积分
2042
金钱
1829
HASS币
0

卓越贡献

 楼主| 发表于 2017-10-7 06:43:08 | 显示全部楼层
step0766 发表于 2017-10-6 20:07
杜亚的遥控器是滚动编码的吗?滚动编码的话我的方法就行不通了如果是固定码:
1.可以刷rc-switch库里的Rece ...

杜亚不是滚动码,只是40位的长码而已。
我分析了它的射频码之后,发现杜亚的信号比较常见的射频码多出一种状态,我处理射频信号比较习惯于二位一组的来判断,就好像你比较习惯于转化为10进制,所以一般的射频有 0 1 F三种状态,他们的组成是 两位低电平组成了0、两位高电平组成了1、低电平高电平组成了F,所以对于000111这种二进制,我都是处理成0F1这种的,杜亚的射频中多了一种高电平+低电平的组合,这里把他做为Q, 所以按我的处理方式就变成了  00101101----0Q1F 这种形式,和你转化为十进制本质上是没有任何区别的
回复

使用道具 举报

6

主题

168

帖子

605

积分

高级会员

Rank: 4

积分
605
金钱
437
HASS币
0
发表于 2017-10-7 16:54:50 | 显示全部楼层
有点深奥
回复

使用道具 举报

6

主题

271

帖子

2916

积分

金牌会员

Rank: 6Rank: 6

积分
2916
金钱
2640
HASS币
20

卓越贡献

发表于 2017-10-7 20:34:29 | 显示全部楼层
syjjx 发表于 2017-10-7 06:43
杜亚不是滚动码,只是40位的长码而已。
我分析了它的射频码之后,发现杜亚的信号比较常见的射频码多出一 ...

本质上是没有区别,但直接接入树莓派需要10进制的发射码,如果把发射码以二位为一组,我的方法就不适用了。
回复

使用道具 举报

6

主题

168

帖子

605

积分

高级会员

Rank: 4

积分
605
金钱
437
HASS币
0
发表于 2017-10-28 19:22:55 | 显示全部楼层
没看懂怎么操作,替换了“文档”下的2个库文件,把发送代码复制粘贴替换了默认的,验证不通过,楼主能详细点吗?
回复

使用道具 举报

1

主题

231

帖子

2468

积分

金牌会员

Rank: 6Rank: 6

积分
2468
金钱
2237
HASS币
0
发表于 2017-12-24 17:51:53 | 显示全部楼层
arduino IDE中,把发送代码复制粘贴,替换库文件,发送和接收分别验证都不能通过,楼主能详细点吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-20 20:21 , Processed in 0.122945 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表