433 接收

解码

http://www.arduino.cn/thread-4465-1-1.html

软件
在Arduino上写的代码一般都很简单,我们要做的就是发射一个信号(或者说编码)去控制遥控开关。
我们要用到一个叫RCSwitch的库(http://code.google.com/p/rc-switch/)。有兴趣的可以去这个网站看看它支持的芯片:SC5262 / SC5272, HX2262 / HX2272, PT2262 / PT2272, EV1527, RT1527, FP1527 or HS1527.  把这个库按照说明下载到本地并加入到库里面以后,我们就可以用了。
解码
我们第一步要做的是解码,电脑连上Arduino和接收模块,运行Examples>RCSwitch>ReceiveDemo_Advanced并打开串口监视器,然后按遥控器上的按钮,串口监视器里会显示读取到的原始数据和解码以后得到的编码。
示例:

Decimal: 1004883 (24Bit) Binary: 000011110101010101010011 Tri-State: 0011FFFFFF01u PulseLength: 163 microseconds Protocol: 1
Raw data: 5068,136,444,136,516,136,516,136,516,464,192,464,192,464,188,472,….

其中1004883是信号的编码,PulseLength是脉冲长度,Protocol是协议编号。记下来后面发射的时候有用。
发射
现在要试试用Arduino发射相同的编码去控制遥控开关。打开Examples>RCSwitch>SendDemo.修改脉冲长度,编码,删除没用的代码就可以运行一下了。运气好的话,这就成功了。

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {
  Serial.begin(9600);
  mySwitch.enableTransmit(10);
  mySwitch.setPulseLength(163);
}
void loop() {
  mySwitch.send(1004883, 24);
  delay(2000);
}

 

2库解析

attachInterrupt(this->nReceiverInterrupt, handleInterrupt, CHANGE);

开启0中断  2号引脚 每次电平改变触发handleInterrupt

void RECEIVE_ATTR RCSwitch::handleInterrupt() {

  static unsigned int changeCount = 0;  // 电平改变次数
  static unsigned long lastTime = 0;     // 上次记录时间
  static unsigned int repeatCount = 0;  // 重复次数

  const long time = micros();   // 当前时间 
  const unsigned int duration = time - lastTime;//  当前减去上次时间  的时间差

  if (duration > RCSwitch::nSeparationLimit) {   //  如果两次电平改变间隔大于规定误差  //长时间没有发生信号电平变化这可以是两次传输之间的差距。

if (diff(duration, RCSwitch::timings[0]) < 200) { // This long signal is close in length to the long signal which // started the previously recorded timings; this suggests that // it may indeed by a a gap between two transmissions (we assume // here that a sender will send the signal multiple times, // with roughly the same gap between them). //这个长信号与开始先前记录的时序的长信号相接近。这表明它可能确实是由两个传输之间的差距(我们在这里假设发送者将多次发送信号,两者之间的差距大致相同)。 repeatCount++; if (repeatCount == 2) { for(unsigned int i = 1; i <= numProto; i++) { if (receiveProtocol(i, changeCount)) { // receive succeeded for protocol i break; } } repeatCount = 0; } } changeCount = 0; } // detect overflow if (changeCount >= RCSWITCH_MAX_CHANGES) { changeCount = 0; repeatCount = 0; } RCSwitch::timings[changeCount++] = duration; lastTime = time; }

  

转载于:https://www.cnblogs.com/kekeoutlook/p/8421282.html

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
)EV1527中断法解码 ① 设定定时器中断时间,设定为 80us,80us 进入中断进行解码。具体中断时间多少由自己 软件设定,但是中断时间不能太大。 ② 设定同步码解码范围,同步码定为 5.6ms - 16ms。进入中断判断到低电平,低电平判断 一直累加 Count_Lead++,累积低电平的采集时间,判断到高电平,就判断此时 Count_Lead 的值是否在 70 跟 200之间。(备注:5.6ms/80us=70 16ms/80us=200)。 ③ 引导头通过进入数据判断,刚开始是数据高电平,累积高电平的时间 Count_Data_Hi++, 当判断到低电平时候,判断 Count_Data_Hi 是否在 80us -2.4ms 之间。这里还没进行数据 0 跟 1 的区分,先把 Count_Data_Hi 的值保存在 Hi_Cnt 里面。 (备注:80us/80us=1 2.4ms/80us=30)。 ④ 高电平判断通过,开始判断低电平,累积低电平的时间 Count_Data_lo++,当判断到高电 平时候,判断 Count_Data_Lo 是否在 80us -2.4ms 之间。这里还没进行数据 0 跟 1 的区分, 先把 Count_Data_Lo 的值保存在 Lo_Cnt 里面。 (备注:80us/80us=1 2.4ms/80us=30)。 ⑤ 对 0 跟 1 进行区分,把 24bit 数据整理成三个 byte,存在数组 RfData[0],RfData[1], RfData[2]数组里面。 ⑥ 进行相应功能码的操作。 具体解码方法参考例子程序,因为不同的震荡电阻,1527 出来的编码长度不同,例子 程序是参考 1 lck=100us 波形来做的。具体时间参数可以根据自己的 1527 发射实际长度来 编写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值