gada888 发表于 2018-10-30 20:19:16

使用nRF24L01模块做个无线报警器

本帖最后由 gada888 于 2018-10-30 20:44 编辑


我们要用到上面三个模块,都是常用模块,就不浪费时间细说模块了。单片机arduino和24L01必须成对使用
人体传感的工作原理是先发射信号到一定距离,例如两米,然后返回。

如果在这个范围内有人体,那么信号探知后会返回。

接下来写出代码
//导入运行库
#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; // 存数据变量
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 = myID;
}// End setup
void loop() {
motionSensor=digitalRead(motionSensorPin);
if (motionSensor != previousMotionSensor) {
dataArray = 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;
}
}

接下来分项来了解一下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; // 存数据变量,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变量值是可改的
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);
Serial.print(",");
} // End for x
Serial.println(dataArray);
}

收到的数据存在dataArray里的整数数组变量里
useData子程序负责把收到的整数数据发送到串口监视器,例如dataArray = 1 and dataArray = 2 and dataArray = 3,
那串口会看到1,2,3
----------
全段接收程序如下
#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;
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);
Serial.print(",");
} // End for x
Serial.println(dataArray);
}

iheaing 发表于 2024-7-14 10:09:23

DF创客商城里,竟然没有 nRF24L01 出售?!失望
页: [1]
查看完整版本: 使用nRF24L01模块做个无线报警器