极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 77443|回复: 19

315/433 RF无线模块详解

[复制链接]
发表于 2014-7-29 10:19:24 | 显示全部楼层 |阅读模式
本帖最后由 qpanda 于 2014-7-29 10:29 编辑

本人非专业人士,只是一个小小程序员,arduino纯属爱好,所发文章仅限于本人智商,如有问题,请大家指正。

近期对智能家居比较敢兴趣,其中存在几个无线传输的模块,起初选用的2.4G的nRL24L01模块,那个东西真是折腾死人,弄了一个星期都没找到问题点。最后在收拾元件箱子的时候,发现一套以前买的433Mhz模块,就想干脆用这个吧。在各种方式的search,找到了一个lib - RCSwitch,看了例子还比较好用,可以传输24bit的值。立刻装上测试。

315\433射频模块介绍:
当发射电压为3V时,空旷地传输距离约20~50米,发射功率较小,当电压5V时约100~200米,当电压9V时约300~500米,当发射电压为12V时,为最佳工作电压,具有较好的发射效果,发射电流约60毫安,空旷地传输距离700~800米,发射功率约500毫瓦。外接天线:10cm(发射模块天线:10cm,接收模块天线:30cm)多芯或单芯普通导线。

借用一下别人的图片


在实际测试中,随便接了跟电线,传输能达到5米,无丢包现象。这个射频模块的穿墙效果,应该会比2.4G的好很多。我家里以前一套315Mhz的报警器,全屋传输无压力。

接线很简单,只有三个脚,两个是电源,一个是数据
发射端
VCC GND   DATA- arduino 10脚(可以变更,在代码中调整)
接收端
VCC GND   DATA- arduino 2脚(使用终端2则使用3脚,在代码中调整)

程序使用RCSwitch附带示例修改,传感器值使用随机数替代。
传输思路是将24bit的值分开,前12位为传感器ID,后12位为传感器值,12bit,可以到4096,应该够用了。
其他的控制编码器的例子还没有试,下次测试好了再来。

发射端程序
  1. #include <RCSwitch.h>

  2. RCSwitch mySwitch = RCSwitch();

  3. // 延时 ms
  4. const unsigned long interval = 10000;
  5. uint32_t temp;
  6. unsigned long last_sent;

  7. // 传感器数量和ID
  8. int seID_NUM = 5;
  9. int8_t seID[] = {1,2,3,4,5};

  10. int i = 0;

  11. void setup() {

  12.   Serial.begin(57600);
  13.   
  14.   //输出脚为 Arduino Pin #10  
  15.   mySwitch.enableTransmit(10);

  16.   // 随机数种子
  17.   randomSeed(analogRead(0));
  18. }

  19. void loop() {

  20.   unsigned long now = millis();
  21.   if ( now - last_sent >= interval  )
  22.   {
  23.     last_sent = now;

  24.     // 产生随机数用于模拟
  25.     temp = random(0,50);

  26.     Serial.print("SID: ");
  27.     Serial.print(seID[i]);
  28.     Serial.print(" | ");
  29.     Serial.print("TMP: ");
  30.     Serial.println(temp);

  31.     // seID[i]为传感器ID,b为传感器ID左移值,a为传感器id和值的组合值
  32.     unsigned a,b;
  33.     // 传感器ID值左移12位
  34.     b = seID[i] << 12;
  35.     a = b | temp;
  36.     Serial.println(a,BIN);
  37.     Serial.println(a);

  38.     // 发送
  39.     mySwitch.send(a, 24);

  40.     i++;
  41.     if (i == seID_NUM) i = 0;
  42.   }
  43. }
复制代码
接收端
  1. #include <RCSwitch.h>

  2. RCSwitch mySwitch = RCSwitch();

  3. int i;
  4. void setup() {
  5.   Serial.begin(57600);
  6.   
  7.   // 中断0使用2脚,终端1使用3脚
  8.   mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
  9. }

  10. void loop() {
  11.   if (mySwitch.available()) {
  12.    
  13.     int value = mySwitch.getReceivedValue();
  14.     i++;
  15.     if (value == 0) {
  16.       Serial.print("Unknown encoding");
  17.     } else {
  18.       Serial.print("Received ");
  19.       Serial.print(i);
  20.       Serial.print(" / ");
  21.       Serial.print( mySwitch.getReceivedValue() );
  22.       Serial.print(" / ");
  23.       Serial.print( mySwitch.getReceivedBitlength() );
  24.       Serial.print("bit ");
  25.       Serial.print("Protocol: ");
  26.       Serial.println( mySwitch.getReceivedProtocol() );

  27.       // 处理接收值
  28.       unsigned sid,tmpval;
  29.       
  30.       // 传感器ID右移12位
  31.       sid = value >> 12;
  32.       
  33.       // 数值
  34.       tmpval = value & 4095;
  35.       Serial.println(value,BIN);
  36.       Serial.println(tmpval,BIN);
  37.       Serial.print("SID: ");
  38.       Serial.print(sid);
  39.       Serial.print(" | ");
  40.       Serial.print("TMP: ");
  41.       Serial.println(tmpval);

  42.     }

  43.     mySwitch.resetAvailable();
  44.   }
  45. }
复制代码
还忘了一个重要的东西,在lib中有个代码需要修改,不然会接受到4个重复的值。由于本人对中断不是很熟悉,不知道4个重复值造成的原因,只是测试出改了一个值,请各位大师给予解答。
  1. void RCSwitch::handleInterrupt() {

  2.     if (repeatCount == 6) { // 需要将 2改为 6repeatCount == 2
  3.       if (receiveProtocol1(changeCount) == false){
  4.         if (receiveProtocol2(changeCount) == false){
  5.           if (receiveProtocol3(changeCount) == false){
  6.             //failed
  7.           }
  8.         }
  9.       }
  10.       repeatCount = 0;
  11.     }

  12. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-7-29 12:23:41 | 显示全部楼层
这个发射功率也太大了吧,
看到500毫瓦我就觉得头痛,
除了航模没什么会用这个吧
回复 支持 反对

使用道具 举报

发表于 2014-7-29 12:27:30 | 显示全部楼层
我只有接收没得发射模块的说
回复 支持 反对

使用道具 举报

发表于 2014-7-29 21:42:07 | 显示全部楼层
我有很多这个模块,还不知道怎么用,谢谢楼主,改天好啊好好研究一下
回复 支持 反对

使用道具 举报

发表于 2014-7-30 07:55:00 | 显示全部楼层
关于天线的描述,供参考

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-8-3 00:24:12 | 显示全部楼层
Mark 一下
谢谢楼主分享
回复 支持 反对

使用道具 举报

发表于 2014-10-20 21:34:35 | 显示全部楼层
非常感谢。。。。。。终于找到个能用的无线数传方案
回复 支持 反对

使用道具 举报

发表于 2015-1-8 19:51:33 | 显示全部楼层
谢谢分享!!!
回复 支持 反对

使用道具 举报

发表于 2015-4-27 23:22:23 | 显示全部楼层
我发现接收模块在4.6v的时候就工作不正常了唉,不知道你们是否和我一样?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-2 17:07:45 | 显示全部楼层
我都是在5v下操作的,没试过低电压
回复 支持 反对

使用道具 举报

发表于 2015-8-18 15:01:40 | 显示全部楼层
楼主,为什么2改成6就不会出现4个重复的值了,我一直在困扰这个啊,
回复 支持 反对

使用道具 举报

发表于 2015-8-18 15:09:57 | 显示全部楼层
楼主,我改成6了,还是会收到4次重复的数据,怎么回事
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-18 16:35:40 | 显示全部楼层
不会呀,我改了就不会了,注意是不是改的要编译的那个文件
回复 支持 反对

使用道具 举报

发表于 2016-3-20 15:36:12 | 显示全部楼层
有没有更简单用法
回复 支持 反对

使用道具 举报

发表于 2016-3-23 09:59:58 | 显示全部楼层
在吗?求解释个问题
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-16 22:36 , Processed in 0.057984 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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