当前位置: 首页 > news >正文

ESP32 控制 NRF24L01 2.4G通信例子

image
image

NRF24L01 是一款低成本、低功耗的 2.4G 无线通信模块,搭配 ESP32 使用时基于 SPI 通信,通过RF24库可快速实现无线数据收发。本文从实际项目中提取 NRF24L01 核心通信代码,编写纯接收端和纯发送端最小示例,去掉冗余的 WiFi、网页、持久化存储等功能,聚焦通信本身,适合快速上手和测试模块硬件连通性。
一、硬件接线(ESP32 + NRF24L01)
核心接线(必须接对,模块仅支持 3.3V 供电!),中断引脚 IRQ 暂不使用,悬空即可:
NRF24L01 引脚 ESP32 引脚 功能说明
GND GND 共地,硬连接保证稳定性
VCC 3.3V 仅 3.3V 供电,禁止接 5V,建议独立供电避免干扰
CE 22 模式控制引脚,控制模块收发模式切换
CSN 21 SPI 片选引脚,选中当前通信模块
SCK 18 ESP32 HSPI 时钟引脚
MOSI 23 ESP32 HSPI 发送引脚(主发从收)
MISO 19 ESP32 HSPI 接收引脚(主收从发)
IRQ 悬空 中断引脚,本示例暂不使用
注意:NRF24L01 对电源纹波敏感,若通信不稳定,可在模块 VCC 和 GND 之间并联 100nF 电容,或使用独立 3.3V 电源模块供电。

接收端:

#include <SPI.h>
#include <RF24.h>// NRF24L01引脚定义(与硬件接线一致)
#define CE_PIN  22
#define CSN_PIN 21
RF24 radio(CE_PIN, CSN_PIN); // 创建RF24对象// 收发双方必须一致的配置
const byte rxAddress[5] = {0x11, 0x22, 0x33, 0x44, 0x55}; // 5字节通信地址
const uint8_t PAYLOAD_SIZE = 32; // 有效载荷大小,最大32字节
char receiveBuffer[PAYLOAD_SIZE + 1] = {0}; // 接收缓冲区,+1用于存储字符串结束符void setup() {Serial.begin(115200); // 初始化串口,用于打印接收数据delay(1000);// 初始化NRF24L01硬件if (!radio.begin()) {Serial.println("❌ NRF24L01 硬件未响应!请检查接线和模块");while (1); // 硬件异常,死循环等待}Serial.println("✅ NRF24L01 初始化成功,进入接收模式");// 配置NRF24L01接收参数(收发双方必须一致)radio.openReadingPipe(1, rxAddress); // 打开接收管道1,绑定通信地址radio.setChannel(40); // 通信信道,0-125,避开WiFi常用信道(1-13)radio.setPayloadSize(PAYLOAD_SIZE); // 设置有效载荷大小radio.setDataRate(RF24_1MBPS); // 传输速率:RF24_1MBPS/RF24_2MBPSradio.setPALevel(RF24_PA_HIGH); // 发射功率:RF24_PA_LOW/MID/HIGH/MAXradio.setCRCLength(RF24_CRC_8); // CRC校验:RF24_CRC_8/RF24_CRC_16,提升通信可靠性radio.startListening(); // 进入接收模式,持续监听
}void loop() {uint8_t pipeNum; // 存储接收到数据的管道号// 检查是否有数据可用,&pipeNum获取数据所在管道if (radio.available(&pipeNum)) {memset(receiveBuffer, 0, sizeof(receiveBuffer)); // 清空接收缓冲区,避免脏数据radio.read(&receiveBuffer, PAYLOAD_SIZE); // 读取接收到的数据到缓冲区// 打印接收信息Serial.printf("📥 接收到数据(管道%d):%s\n", pipeNum, receiveBuffer);}
}

发送端:

#include <SPI.h>
#include <RF24.h>// NRF24L01引脚定义(与硬件接线一致,和接收端相同)
#define CE_PIN  22
#define CSN_PIN 21
RF24 radio(CE_PIN, CSN_PIN); // 创建RF24对象// 收发双方必须一致的配置(与接收端完全相同!)
const byte txAddress[5] = {0x11, 0x22, 0x33, 0x44, 0x55}; // 目标接收地址
const uint8_t PAYLOAD_SIZE = 32; // 有效载荷大小,与接收端一致
char sendBuffer[PAYLOAD_SIZE + 1] = {0}; // 发送缓冲区// 测试数据(模拟传感器采集的仓位数据)
uint8_t testId = 1;       // 仓位ID
float testWeight = 56.23; // 仓位重量
uint32_t testItem = 108;  // 物品数量void setup() {Serial.begin(115200);delay(1000);// 初始化NRF24L01硬件if (!radio.begin()) {Serial.println("❌ NRF24L01 硬件未响应!请检查接线和模块");while (1);}Serial.println("✅ NRF24L01 初始化成功,进入发送模式");// 配置NRF24L01发送参数(与接收端完全一致!)radio.openWritingPipe(txAddress); // 打开发送管道,绑定目标接收地址radio.setChannel(40);radio.setPayloadSize(PAYLOAD_SIZE);radio.setDataRate(RF24_1MBPS);radio.setPALevel(RF24_PA_HIGH);radio.setCRCLength(RF24_CRC_8);radio.stopListening(); // 退出接收模式,进入发送模式radio.setRetries(15, 15); // 设置重传:延迟15*250us,重传15次,提升发送成功率
}void loop() {// 封装发送数据(与原项目格式一致:id:1,weight:56.23,item:108)snprintf(sendBuffer, sizeof(sendBuffer), "id:%d,weight:%.2f,item:%lu", testId, testWeight, testItem);// 发送数据并判断结果bool sendOk = radio.write(&sendBuffer, PAYLOAD_SIZE);if (sendOk) {Serial.printf("📤 发送成功:%s\n", sendBuffer);// 模拟数据变化,方便观察接收效果testWeight += 0.11;testItem += 1;} else {Serial.println("❌ 发送失败:未收到接收端应答");}delay(1000); // 每隔1秒发送一次
}
http://www.jsqmd.com/news/342978/

相关文章:

  • OpenClaw装机
  • 2026大模型新突破:无需外部Teacher,上下文实现自我进化
  • SSM校园学生管理系统wq871(程序+源码+数据库+调试部署+开发环境)
  • 永辉超市卡回收怕被骗?京顺回收带你避开3大陷阱 - 京顺回收
  • SSM校园失物招领平台dd099--程序+源码+数据库+调试部署+开发环境
  • 大数据毕设选题推荐:基于Hadoop的某篮球队各个球员数据分析系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 大数据毕设项目:基于Hadoop的某篮球队各个球员数据分析系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • SSM行李寄存系统o5853--(程序+源码+数据库+调试部署+开发环境)
  • 洛谷 P1165:日志分析 ← 双栈
  • 例说FPGA:可直接用于工程项目的第一手经验【3.0】
  • SSM新冠疫苗接种在线预约管理系统6djac--程序+源码+数据库+调试部署+开发环境
  • 使用 Zensical 快速搭建静态博客网站(类似Hugo、Hexo)
  • 2026年中国境外券商投行机构推荐:顺安资本实力领航全球化资本布局 - Top品牌推荐
  • 三步转型AI产品经理:不懂技术也能年薪百万,2026年最大职业风口
  • 全国钛合金优质厂家有哪些?优先选哪些维度筛选? - 非研科技
  • Java企业智能化转型:破局困境,找准高效落地路径
  • 普通本科转人工智能方向,有什么建议?10年AI行业老兵的3条建议(非常详细)从零基础到精通,收藏这篇就够了!
  • 详细介绍:【每日算法】 LeetCode 394. 字符串解码
  • Data Management Processing
  • Docker搭建Web安全渗透测试靶场
  • 打造高性能Markdown编辑器全指南
  • 第7章:Steering规则配置 - 详细说明
  • Redis跳表
  • 基于opencv与深度学习Deeplab舌苔分割检测代码及教程 深度学习图像分割 舌苔分割图像数据集
  • 基于大数据爬虫+Hadoop的游戏购买网站设计与实现开题报告
  • HashTable
  • 怎么让自己的网址被百度收录(网站如何被百度收录进去) - 详解
  • 手把手教你用 ArrayList 实现杨辉三角:从逻辑推导到每行代码详解
  • 基于SpringBoot+Vue的减脂瘦身训练服务系统设计与实现
  • 线性回归学习记录