2018-10-30 20:19:16 [显示全部楼层]
5290浏览
查看: 5290|回复: 0

[进阶] 使用nRF24L01模块做个无线报警器

[复制链接]
本帖最后由 gada888 于 2018-10-30 20:44 编辑

使用nRF24L01模块做个无线报警器图1使用nRF24L01模块做个无线报警器图2使用nRF24L01模块做个无线报警器图7
我们要用到上面三个模块,都是常用模块,就不浪费时间细说模块了。单片机Arduino和24L01必须成对使用
人体传感的工作原理是先发射信号到一定距离,例如两米,然后返回。
使用nRF24L01模块做个无线报警器图3
如果在这个范围内有人体,那么信号探知后会返回。
使用nRF24L01模块做个无线报警器图4
接下来写出代码
[mw_shl_code=applescript,true]//导入运行库
#include <SPI.h>
#include <RF24.h>
//--------定义无线信号脚---------
#define CE_PIN 9
#define CSN_PIN 10
RF24 radio(CE_PIN,CSN_PIN);
//定义PIPE
const uint64_t pipe = 0xE8E8F0F0E1LL;
const int maximumTries = 10;
int dataArray[3]; // 存数据变量
int success; // 测成功与否的变量
int tries; // 数据传输次数
int motionSensorPin = 4;
int motionSensor;
int previousMotionSensor = LOW;
const int myID = 1;
void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
pinMode(motionSensorPin, INPUT);
dataArray[0] = myID;
}// End setup
void loop() {
motionSensor=digitalRead(motionSensorPin);
if (motionSensor != previousMotionSensor) {
dataArray[1] = motionSensor;
previousMotionSensor = motionSensor;
transmitData();
}
} // End main loop
void transmitData(){
success = 0;
int previousSuccesses = success;
tries=0;
while (tries<maximumTries && success<3){
success = success + radio.write(dataArray, sizeof(dataArray));
if (success > previousSuccesses) {
delay(100);
previousSuccesses = success;
} tries =
tries +
1;
}
}[/mw_shl_code]
使用nRF24L01模块做个无线报警器图5使用nRF24L01模块做个无线报警器图6
接下来分项来了解一下24L01复杂程序的含义
导入运行库无须多言
#include <SPI.h>
#include <RF24.h>

接下来的命令
#define CE_PIN 9
#define CSN_PIN 10
pin9和pin10是和单片机连线的传递无线信号用的
RF24 radio(CE_PIN,CSN_PIN);

下面这个PIPE
const uint64_t pipe = 0xE8E8F0F0E1LL;
可以理解为传递数据的管道
------------
接下来
int dataArray[3]; // 存数据变量,dataArray是一个数组,3只传递3个值
int success; // 测成功与否变量
int tries; // 传递次数
const int maximumTries = 10;最多传10次,为什么传10次,是不想让它无限运行,如果出错。不好排查。

再接下来
void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
}

-----
radio.begin(); 等于告诉单片机该干活了。
radio.openWritingPipe(pipe); 等于激活pipe,该传递数据了。
------
void transmitData(){
success = 0;
tries=0;
while (tries<maximumTries && success==0){
success = radio.write(dataArray, sizeof(dataArray));
tries = tries + 1;
}
}

----------
success = 0;成功传递的初始化是0
tries=0;传递次数的初始化也是0

如果传递成功呢
tries = tries + 1;

也就是成功后返回的值是1.否则0.
----
radio.write(dataArray, sizeof(dataArray));两个函数
dataArray=实际传输的数据的数组,
sizeof(dataArray)=数组的大小
不知道是不是讲的清楚,本文只着力讲解难理解的nRF24L01程序。----------
刚刚讲了发射端
那接收呢
前面部分是一样的
#include <SPI.h>
#include <RF24.h>
#define CE_PIN 9
#define CSN_PIN 10
RF24 radio(CE_PIN, CSN_PIN);
const uint64_t pipe = 0xE8E8F0F0E1LL;

----------
#define numData 3//定义bumData常量值用来存来自数组的变量的。可以一次3个值。
int dataArray[numData];//会收到很多不同的数组,这个numData变量值是可改的
int x;//x是对变量的计数


-----
void setup() {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
}

这个和发射那段很像,只是openReadingPipe(1,pipe);发射那个是radio.openWritingPipe(pipe)。
radio.startListening();这个参数顾名思义,是告诉arduino它要一直监听信号。

-----------
void loop() {
if ( radio.available() ) {
bool finished = false;
while (!finished)
{
//抓数据包
finished = radio.read(dataArray, sizeof(dataArray));
}
useData();
}
}

如果监听到数据了。radio.available()
然后就抓包finished = radio.read(dataArray, sizeof(dataArray));
bool finished = false;这个是做真假判断
while (!finished)参数配合布尔参数做二选一。
===========
void useData(){
for (x=0;x<numData-1;x++) {
Serial.print(dataArray[x]);
Serial.print(",");
} // End for x
Serial.println(dataArray[numData-1]);
}

收到的数据存在dataArray里的整数数组变量里
useData子程序负责把收到的整数数据发送到串口监视器,例如dataArray[0] = 1 and dataArray[1] = 2 and dataArray[2] = 3,
那串口会看到1,2,3
----------
全段接收程序如下
[mw_shl_code=applescript,true]#include <SPI.h>
#include <RF24.h>
#define CE_PIN 9
#define CSN_PIN 10
RF24 radio(CE_PIN, CSN_PIN);
const uint64_t pipe = 0xE8E8F0F0E1LL;
#define numData 3
int dataArray[numData];
int x;
void setup() {
Serial.begin(9600);

Serial.println("Contact");
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
}
void loop() {
if ( radio.available() ) {
bool finished = false;
while (!finished)
{

finished = radio.read(dataArray, sizeof(dataArray));
} // End of while
useData();
}
}
void useData(){
for (x=0;x<numData-1;x++) {
Serial.print(dataArray[x]);
Serial.print(",");
} // End for x
Serial.println(dataArray[numData-1]);
}[/mw_shl_code]

2018-10-30_191840.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail