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上普通的接收模块,谁有试试.
不错学习了 :o 都几天了,难道就没人测试过?:dizzy: 你的发射和接收天线分别是多长? 不接天线行吗? 如果发送端用uno板子,程序要修改吗? 不用天线行吗? qpanda 发表于 2015-6-11 23:51 static/image/common/back.gif
你的发射和接收天线分别是多长?
发射大约30cm 。 接收大约20cm 。 suoma 发表于 2015-6-12 15:09 static/image/common/back.gif
如果发送端用uno板子,程序要修改吗?
ATmega328P 的MCU都通用。 suoma 发表于 2015-6-12 16:53 static/image/common/back.gif
不用天线行吗?
接收端没天线我这3~4米还成。发射短没天线。没试过。 帕米 发表于 2015-6-13 21:02 static/image/common/back.gif
接收端没天线我这3~4米还成。发射短没天线。没试过。
好的,我试一下 315,433两个模块,可以用两个中断接收,不同频率来的数据吗?
Cupid 发表于 2015-6-14 10:59 static/image/common/back.gif
315,433两个模块,可以用两个中断接收,不同频率来的数据吗?
这个理论上应该可行,我手上没有433模块没办法测试。 80米是空旷环境吧,我比较关心低频率模块的穿墙能力 wing 发表于 2015-6-14 15:31 static/image/common/back.gif
80米是空旷环境吧,我比较关心低频率模块的穿墙能力
对,我这隔2层墙。数据丢失的不是很严重啊。还有一种方式中断加Timer 判断电平时间间隔这种方式相对来说更稳定。
页:
[1]
2