nRF24L01 + ArdunioUno + NodeMCU(ESP8266) 实现 无线通讯的Hello World
本文中 ArdunioUno 作为无线信号的发送者,NodeMCU作为无线信号的接受者.
实现效果: NodeMCU接收到指令并控制LED
引脚定义
nRF24L01 模块引脚
ArdunioUno模块引脚
引脚说明
我还准备了官方的详细文档,可以点击 这里 进行查看
NodeMCU模块引脚
引脚定义
动手环节
经过对 nRF24L01 模块引脚的定义与识别,我们获取到如下关键信息
nRF24L01 一共 8个引脚, 但是我们在这个Demo中只需要用到启用7个.
而其中7个引脚只有2个是引脚是可以任意连接的,其余都是固定的
所以对我们来说,只用注意2个引脚的连接即可
nRF24L01 固定连接 ( 5个引脚 )
注意,这里ArdunioUno和NodeMcu都是一样的连接方法, 注意看图即可
- <1号引脚> 接 单片机的 GND [ArdunioUno: PIN05, NodeMcu: PIN10]
- <2号引脚> 接 单片机的 3.3V [ArdunioUno: PIN04, NodeMcu: PIN11]
- <5号引脚> 接 单片机的 SCK [ArdunioUno: PIN14, NodeMcu: PIN09]
- <6号引脚> 接 单片机的 MOSI [ArdunioUno: PIN12, NodeMcu: PIN06]
- <7号引脚> 接 单片机的 MISO [ArdunioUno: PIN13, NodeMcu: PIN08]
nRF24L01 自定义连接 ( 2个引脚 )
注意,这里ArdunioUno和NodeMcu都是随意选择一个IO引脚即可, 我采用的引脚如下
- <3号引脚> CE [ArdunioUno: PIN09, NodeMcu: D2]
- <4号引脚> CSN [ArdunioUno: PIN10, NodeMcu: D4]
连接好后,如图所示
代码
ArdunioUno 发送者代码
每300毫秒 输入一次1 和 0
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
// CE, CSN
RF24 radio(9, 10);
// 地址 (需要和接收端保持一致)
const byte address[6] = "00001";
const boolean open = HIGH;
const boolean close = LOW;
void setup() {
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop(){
radio.write(&open, sizeof(open));
delay(300);
radio.write(&close, sizeof(close));
delay(300);
}
NodeMcu 接受者代码
每5毫秒检测一次是否有输出,并尝试点灯
这里需要注意, 我接了一个LED在D8
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
// CE, CSN
RF24 radio(D2, D4);
// 地址 (需要和接收端保持一致)
const byte address[6] = "00001";
// 需要点亮的LED引脚
const int led_pin = D8;
boolean state = LOW;
void setup() {
pinMode(led_pin, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop(){
// 监听是否有数据传入
if (radio.available()){
radio.read(&state, sizeof(state));
Serial.println(state);
digitalWrite(led_pin, state);
}
delay(5);
}
烧录后 NodeMcu的D8引脚就会每300毫秒接收到一个信号, 用于控制D8引脚的高低点平
效果展示
客户端idea串口控制台输出如下:
###演示视频
nRF24L01 点灯视频
传输字符串的代码
ArdunioUno 发送者代码
分别输出英文和中文的示例
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
// CE, CSN
RF24 radio(9, 10);
// 地址 (需要和接收端保持一致)
const byte address[6] = "00001";
const char open[] = "1asdasdasd123123";
const char close[] = "你好a";
void setup() {
Serial.begin(9600);
radio.begin();
radio.setChannel(115); //设置无线电信道
radio.setPALevel(RF24_PA_MAX); //设置功率级别为最大
radio.setDataRate(RF24_250KBPS); //设置数据速率为250kbps
radio.setAutoAck(1); //设置自动确认
radio.enableDynamicPayloads(); //启用动态负载
radio.setRetries(15, 15); //设置重试次数和间隔
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop(){
radio.write(&open, sizeof(open));
Serial.println(open);
delay(1000);
radio.write(&close, sizeof(close));
Serial.println(close);
delay(300);
}
NodeMcu 接受者代码
每5毫秒检测一次是否有输出,并尝打印在控制台
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
// CE, CSN
RF24 radio(D2, D4);
// 地址 (需要和接收端保持一致)
const byte address[6] = "00001";
char message[32]; // 接收到的消息
void setup() {
Serial.begin(9600);
radio.begin();
radio.setChannel(115); //设置无线电信道
radio.setPALevel(RF24_PA_MAX); //设置功率级别为最大
radio.setDataRate(RF24_250KBPS); //设置数据速率为250kbps
radio.setAutoAck(1); //设置自动确认
radio.enableDynamicPayloads(); //启用动态负载
radio.setRetries(15, 15); //设置重试次数和间隔
radio.openReadingPipe(1, address); //打开管道1,使用地址“1Node”
radio.startListening(); //开始监听
}
void loop(){
// 监听是否有数据传入
if (radio.available()){
radio.read(&message, sizeof(message));
Serial.println(message);
}
delay(5);
}