帕米 发表于 2015-6-2 19:30:18

RF315/433Mhz 使用1个中断 简单通信(未使用第3方库).

本帖最后由 帕米 于 2015-6-2 20:00 编辑

刚在YouTuXX 逛了一圈, 牵了点东东回来. 大家都验证一下.


发射模块: GND -> GND
               VCC-> +5V ~ 12V
               Data -> D2

接收模块 PT4303-S :
               GND -> GND
               VCC-> +5V
               Data -> D3
               我的有CE (给个高电平就行) -> RST

发送端代码...

/************************************************
* Project : RF315Mhz TX
* Author : Pami
* DESC: Arduino 328P 通过 RF315M 向 Pami 问好!
* Tips: 发射模块 Data 插 D2.
***********************************************/

/* 发送信号引脚*/
const uint8_t TX_pin = 2;

/**
* 发送数据
*/
void rf_send(byte input) {
        uint8_t i;

        /* 发送同步电平信号 */
        for (i = 0; i < 20; i++) {
                digitalWrite(TX_pin, HIGH);
                delayMicroseconds(500);
                digitalWrite(TX_pin, LOW);
                delayMicroseconds(500);
        }

        /* 发送起始电平信号 */
        digitalWrite(TX_pin, HIGH);
        delayMicroseconds(3000);
        digitalWrite(TX_pin, LOW);
        delayMicroseconds(500);

        /* 发送一个 Byte */
        for (i = 0; i < 8; i++) {

                if (bitRead(input,i) == 1)        // 该位为 1 时发送高电平
                        digitalWrite(TX_pin, HIGH);
                else
                        // 该位为 0 时发送低电平
                        digitalWrite(TX_pin, LOW);
                delayMicroseconds(500);                // 位电平持续时间 500us

                // 为以上的翻转电平. 用于校验
                if (bitRead(input,i) == 1)
                        digitalWrite(TX_pin, LOW);
                else
                        digitalWrite(TX_pin, HIGH);
                delayMicroseconds(500);
        }

        // 发送完成后低电平
        digitalWrite(TX_pin, LOW);
}

//void rf_send(String myStr) {
//for(int i=0; i< myStr.length(); i++){
//    rf_send(myStr.charAt(i));
//}
//}

void rf_send(const char *str) {
byte a;
while(1) {
    a = *str++;
    if(a == '\0'){ break;}
    rf_send(a);
}
}

void setup() {
        pinMode(TX_pin, OUTPUT);
        //digitalWrite(TX_pin, LOW);
}

void loop() {
        rf_send("Hello Pami!#");
        delay(1000);
}



接收端代码...

/************************************************
* Project : RF315Mhz RX
* Author : Pami
* DESC: 接收传送过来的数据,解码,串口输出.
* Tips: 接收模块 Data 插 D3.
*                注意共用了引脚上的外部中断 INT1 , 和 I/O 读功能.
***********************************************/

int i, good, k;
byte data_in, data_in_val;

/**
* 解码数据
*/
void data_incoming(){

        // 等待 起始信号 标记 good 为 1
        for(i=0; i<100; i++){
          delayMicroseconds(20);
          good = 1;
          if(digitalRead(3) == LOW){
                good = 0;
                i = 100;
          }
        }
        // 起始信号 标记成功, 开始获取数据
        if(good == 1){
          detachInterrupt(1); // mask 中断1
          
          digitalWrite(13,HIGH); // 给个 LED 指示, 我 Happy ,我就闪.
          
          while(1){
                 
                  // 匹配起始信号的低电平
                if(digitalRead(3) == LOW){
                    delayMicroseconds(750);                // 500 + 250 us 延时接近数据电平的中间时间点

                    // 开启装配 Byte
                    for(i=0; i<8; i++) {
                            if(digitalRead(3)== HIGH)        // 为高时数据位置1
                              bitWrite(data_in, i, 1);
                                else                                                // 为低时数据位置0
                                        bitWrite(data_in, i, 0);
                                delayMicroseconds(500);
                                                                                        // 翻转回的数据
                                if(digitalRead(3)== HIGH)
                              bitWrite(data_in_val, i, 0);
                                else
                                        bitWrite(data_in_val, i, 1);
                                delayMicroseconds(500);
                    }
                   
                    // Data Byte 为井井时 补个 换行
                    if(data_in == '#' && data_in_val == '#') {
                      Serial.println("");
                    }else {
                            // 简单校验一下数据是否相同,输出显示
                            if(data_in == data_in_val){               
                                    Serial.print(char(data_in));        // PASS
                            }else{
                                    // oops! FAIL 大声点, 老子听不清楚....
                                    Serial.println("----------------leSe----------------");
                                    // Serial.println(data_in, BIN);
                                    // Serial.println(data_in_val, BIN);
                                    // Serial.println("------------------------------------");
                            }
                    }
                    break;
                }
          }
          digitalWrite(13,LOW);
          attachInterrupt(1, data_incoming, RISING);        // 重启用 中断1
        }
}

void setup() {
        Serial.begin(9600);

        pinMode(3, INPUT);
        pinMode(13, OUTPUT);
       
        // 开 中断1, 上升沿事件, 触发 data_incoming() 函数
        attachInterrupt(1, data_incoming, RISING);       
       
}

void loop() {

}




我这表现还不错. 80米的样子, 很少出错,数据完整.没有更远的地方测啦.
我这没有TB上普通的接收模块,谁有试试.

Cupid 发表于 2015-6-3 07:54:05

不错学习了

帕米 发表于 2015-6-5 10:19:30

:o 都几天了,难道就没人测试过?:dizzy:

qpanda 发表于 2015-6-11 23:51:56

你的发射和接收天线分别是多长?

suoma 发表于 2015-6-12 15:08:54

不接天线行吗?

suoma 发表于 2015-6-12 15:09:42

如果发送端用uno板子,程序要修改吗?

suoma 发表于 2015-6-12 16:53:01

不用天线行吗?

帕米 发表于 2015-6-13 20:56:21

qpanda 发表于 2015-6-11 23:51 static/image/common/back.gif
你的发射和接收天线分别是多长?

发射大约30cm 。 接收大约20cm 。

帕米 发表于 2015-6-13 20:58:47

suoma 发表于 2015-6-12 15:09 static/image/common/back.gif
如果发送端用uno板子,程序要修改吗?

ATmega328P 的MCU都通用。

帕米 发表于 2015-6-13 21:02:00

suoma 发表于 2015-6-12 16:53 static/image/common/back.gif
不用天线行吗?

接收端没天线我这3~4米还成。发射短没天线。没试过。

suoma 发表于 2015-6-14 10:54:30

帕米 发表于 2015-6-13 21:02 static/image/common/back.gif
接收端没天线我这3~4米还成。发射短没天线。没试过。

好的,我试一下

Cupid 发表于 2015-6-14 10:59:46

315,433两个模块,可以用两个中断接收,不同频率来的数据吗?

帕米 发表于 2015-6-14 15:10:10

Cupid 发表于 2015-6-14 10:59 static/image/common/back.gif
315,433两个模块,可以用两个中断接收,不同频率来的数据吗?

这个理论上应该可行,我手上没有433模块没办法测试。

wing 发表于 2015-6-14 15:31:39

80米是空旷环境吧,我比较关心低频率模块的穿墙能力

帕米 发表于 2015-6-14 16:20:07

wing 发表于 2015-6-14 15:31 static/image/common/back.gif
80米是空旷环境吧,我比较关心低频率模块的穿墙能力

对,我这隔2层墙。数据丢失的不是很严重啊。还有一种方式中断加Timer 判断电平时间间隔这种方式相对来说更稳定。
页: [1] 2
查看完整版本: RF315/433Mhz 使用1个中断 简单通信(未使用第3方库).