Freddy. 发表于 2015-9-14 01:06:24

基于Arduino 的NRF2401数据传输方案

器材清单:
Arduino Mango*1
Arduino Nano*1   ( 这2个随便不一定用这两个 )
NRF2401*2
带字库的12864一块
LM35温度传感器*1
杜邦线若干

NRF2401
1:参数
NRF24L01是一款工作在2.4-2.5GHz世界通用ISM频段的单片收发芯片,无线收发器包括:频率发生器 增强型 SchockBurstTM 模式控制器 功率放大器 晶体放大器 调制器 解调器 输出功率频道选择和协议的设置可以通过SPI接口进行设置极低的电流消耗。
全球开放ISM频段,最大0dBm发射功率,免许可证使用。
支持六路通道的数据接收
1.低工作电压:1.9~3.6V低电压工作

2.高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者2Mbps的空中传输速率)

3.多频点:125频点,满足多点通信和跳频通信需要

4.超小型:内置2.4GHz天线,体积小巧,15x29mm(包括天线)

5.低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。

2 引脚
这种类型的默认不标明引脚,需要看图










温度传感器 LM35
1.参数
LM35是由National Semiconductor所生产的温度感测器,其输出电压与摄氏温标呈线性关係,转换公式如式(1),0°C时输出为0V,每升高 1°C,输出电压增加10mV。
工作电压:直流4~30V;
•工作电流:小于133μA
•输出电压:+6V~-1.0V
•输出阻抗:1mA负载时0.1Ω;
•精度:0.5℃精度(在+25℃时);
•漏泄电流:小于60μA;
•比例因数:线性+10.0mV/℃;
•非线性值:±1/4℃;
•校准方式:直接用摄氏温度校准;
•封装:密封TO-46晶体管封装或塑料TO-92晶体管封装;
•使用温度范围:-55~+150℃额定范围。


2 引脚
引脚介绍:①正电源Vcc;②输出;③输出地/电源地。                               










接线:




程序部分:

发射端:

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
//long temp;
float temp;
char st;
int potPin = 4;                     //设置模拟口4为LM35的信号输入端口
float temperature = 0;                //设置temperature为浮点变量
long val=0;

void setup(){
Serial.begin(9600);
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"clie1"); // 标记本地名,用于接收
Mirf.payload = 5; //对话的长度,用于约定双方对话的缓冲窗口大小,这个代表5个字节
Mirf.channel = 11; // 信道,测试了一下,不同的信道也能接收但即时性很差,不知是不是存在自动寻道匹配机制
Mirf.config();
}

void loop(){
// unsigned long time = millis();
//Mirf.send((byte *)&time);
val = analogRead(potPin);             //val变量为从LM35信号口读取到的数值
temperature = (val*0.0048828125*1000);         //把读取到的val转换为温度数值的10倍
temp=temperature / 10;
dtostrf(temp,4,2,st);//
unsigned long time = millis();
Mirf.setTADDR((byte *)"serv1"); // 标记对方的地址
//sprintf(st ,"%f",temp);
Sends(st); //发送了一个5字节的hello
delay(1000);
}

void Sends(const char *str)
{
int lens;
lens=strlen(str);
char msg;
int i;
for (i=0;i<lens;i++)
{
    msg= int(str);
}
Mirf.send((byte *)&msg);

while(Mirf.isSending())
{}
}




接收端:

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include "U8glib.h"
U8GLIB_ST7920_128X64_1X u8g(2,3,4);
//U8GLIB_SSD1306_128X64 u8g(5, 6, 9, 10);//D0 , D1 , CS , DC
int i, flag;
String Temp;
void draw(void)
{
u8g.setFont(u8g_font_timB10);
u8g.drawStr( 0, 10, "NRF240l Receive");
//u8g.setFont(u8g_font_tpss);
if (flag == 1)
{
    u8g.setPrintPos(1, 26);
    u8g.print(Mirf.payload);
    u8g.setPrintPos(1, 40);
    u8g.print(Temp);

}
else
{
    u8g.setFont(u8g_font_tpss);
    u8g.drawStr( 1, 26, "NO Receive");
}
// u8g.setPrintPos(1, 36);
//u8g.print(Temp);


}
void setup(void)
{
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"serv1"); // 本地名
Mirf.payload = 4; // 长度
Mirf.channel = 11; // 信道
Mirf.config();
}

void loop(void) {

byte data;
if (!Mirf.isSending() && Mirf.dataReady())
{ //存在数据
    Mirf.getData(data);
   Temp="";
    flag = 1;
    for (i = 0; i < Mirf.payload; i++) //把收到的信息拼起来,到一个串里面
    {
      Temp += char(data);

    }

}
else
{
    flag = 0;
}
u8g.firstPage();
do {
    draw();
}
while ( u8g.nextPage() );
delay(50);
}



mirf 库下载地址:
http://playground.arduino.cc/uploads/InterfacingWithHardware/Mirf.zip
这个是官网的,新的1.5.5-r2 的IDE版本也可以拿来直接用
Sketch
U8glib库下载地址:
http://code.google.com/p/u8glib/wiki/u8glib

Freddy. 发表于 2015-9-14 01:07:29


接线画的表格没法出去

sunchanghui007 发表于 2015-9-17 19:18:24

也想学这个模块了

靳靳 发表于 2017-3-16 10:10:23

双向通信会吗,想请教一下
页: [1]
查看完整版本: 基于Arduino 的NRF2401数据传输方案