极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 37800|回复: 18

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

[复制链接]
发表于 2015-6-2 19:30:18 | 显示全部楼层 |阅读模式
本帖最后由 帕米 于 2015-6-2 20:00 编辑

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


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

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

发送端代码...

[pre lang="arduino" line="1" file="example_RF315Mhz_easy_transmit.ino"]/************************************************
* 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);
}
[/code]


接收端代码...

[pre lang="arduino" line="1" file="example_RF315Mhz_easy_receive.ino"]/************************************************
* 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() {

}

[/code]


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

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2015-6-3 07:54:05 | 显示全部楼层
不错学习了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-5 10:19:30 | 显示全部楼层
都几天了,难道就没人测试过?
回复 支持 反对

使用道具 举报

发表于 2015-6-11 23:51:56 | 显示全部楼层
你的发射和接收天线分别是多长?
回复 支持 反对

使用道具 举报

发表于 2015-6-12 15:08:54 | 显示全部楼层
不接天线行吗?
回复 支持 反对

使用道具 举报

发表于 2015-6-12 15:09:42 | 显示全部楼层
如果发送端用uno板子,程序要修改吗?
回复 支持 反对

使用道具 举报

发表于 2015-6-12 16:53:01 | 显示全部楼层
不用天线行吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-13 20:56:21 | 显示全部楼层
qpanda 发表于 2015-6-11 23:51
你的发射和接收天线分别是多长?

发射大约30cm 。 接收大约20cm 。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-13 20:58:47 | 显示全部楼层
suoma 发表于 2015-6-12 15:09
如果发送端用uno板子,程序要修改吗?

ATmega328P 的MCU都通用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-13 21:02:00 | 显示全部楼层
suoma 发表于 2015-6-12 16:53
不用天线行吗?

接收端没天线我这3~4米还成。发射短没天线。没试过。
回复 支持 反对

使用道具 举报

发表于 2015-6-14 10:54:30 | 显示全部楼层
帕米 发表于 2015-6-13 21:02
接收端没天线我这3~4米还成。发射短没天线。没试过。

好的,我试一下
回复 支持 反对

使用道具 举报

发表于 2015-6-14 10:59:46 | 显示全部楼层
315,433两个模块,可以用两个中断接收,不同频率来的数据吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-14 15:10:10 | 显示全部楼层
Cupid 发表于 2015-6-14 10:59
315,433两个模块,可以用两个中断接收,不同频率来的数据吗?

这个理论上应该可行,我手上没有433模块没办法测试。
回复 支持 反对

使用道具 举报

发表于 2015-6-14 15:31:39 | 显示全部楼层
80米是空旷环境吧,我比较关心低频率模块的穿墙能力
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-14 16:20:07 | 显示全部楼层
wing 发表于 2015-6-14 15:31
80米是空旷环境吧,我比较关心低频率模块的穿墙能力

对,我这隔2层墙。数据丢失的不是很严重啊。还有一种方式中断加Timer 判断电平时间间隔这种方式相对来说更稳定。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 08:51 , Processed in 0.070099 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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