极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12843|回复: 3

基于Arduino 的NRF2401数据传输方案

[复制链接]
发表于 2015-9-14 01:06:24 | 显示全部楼层 |阅读模式
器材清单:
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[5];
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[lens];
  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[Mirf.payload];
  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

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2015-9-14 01:07:29 | 显示全部楼层

接线画的表格没法出去

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2015-9-17 19:18:24 | 显示全部楼层
也想学这个模块了
回复 支持 反对

使用道具 举报

发表于 2017-3-16 10:10:23 | 显示全部楼层
双向通信会吗,想请教一下
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 11:07 , Processed in 0.048038 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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