新闻动态   News
联系方式   Contact
你的位置:首页 > 新闻动态 > 公司新闻

433M RF无线模块详解

2015-06-25 15:49:51      点击:

        现在智能家居越来越火了,自己在家拍个无线模块就能动手实现智能家居了。下面在网上找到了个关于433Mhz无线模块的详解和lib - RCSwitch程序

 433射频模块介绍:

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

   图片是科视连研发的433Mhz无线接收发射模块

                    EN    ASK   VCC   GND


            在实际测试中接根天线,传输距离可达到5米以上非常稳定。433Mhz无线发射模块的穿墙效果比2.4G模块更好。


   模块的接线方法很简单:

发射模块:

接收模块:

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

发射端程序:


#include 

RCSwitch mySwitch = RCSwitch();

// 延时 ms
const unsigned long interval = 10000;
uint32_t temp;
unsigned long last_sent;

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

int i = 0;

void setup() {

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

  // 随机数种子
  randomSeed(analogRead(0));
}

void loop() {

  unsigned long now = millis();
  if ( now - last_sent >= interval  )
  {
    last_sent = now;

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

    Serial.print("SID: ");
    Serial.print(seID[i]);
    Serial.print(" | ");
    Serial.print("TMP: ");
    Serial.println(temp);

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

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

    i++;
    if (i == seID_NUM) i = 0;
  }
}
接收端代码:


#include 

RCSwitch mySwitch = RCSwitch();

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

void loop() {
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    i++;
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
      Serial.print("Received ");
      Serial.print(i);
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );

      // 处理接收值
      unsigned sid,tmpval;
      
      // 传感器ID右移12位
      sid = value >> 12;
      
      // 数值
      tmpval = value & 4095;
      Serial.println(value,BIN);
      Serial.println(tmpval,BIN);
      Serial.print("SID: ");
      Serial.print(sid);
      Serial.print(" | ");
      Serial.print("TMP: ");
      Serial.println(tmpval);

    }

    mySwitch.resetAvailable();
  }
}
在lib中有个代码需要修改不然会接收到4个重复的值


void RCSwitch::handleInterrupt() {
 
    if (repeatCount == 6) { // 需要将 2改为 6repeatCount == 2
      if (receiveProtocol1(changeCount) == false){
        if (receiveProtocol2(changeCount) == false){
          if (receiveProtocol3(changeCount) == false){
            //failed
          }
        }
      }
      repeatCount = 0;
    }
 
}


RCSwitch程序下载