本帖最后由 帕米 于 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上普通的接收模块,谁有试试.
|