本帖最后由 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,应该够用了。
其他的控制编码器的例子还没有试,下次测试好了再来。
发射端程序- #include <RCSwitch.h>
- 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.h>
- 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个重复的值。由于本人对中断不是很熟悉,不知道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;
- }
- }
复制代码
|