news 2026/4/3 6:25:37

ESP32 控制 NRF24L01 2.4G通信例子

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ESP32 控制 NRF24L01 2.4G通信例子

NRF24L01 是一款低成本、低功耗的 2.4G 无线通信模块,搭配 ESP32 使用时基于 SPI 通信,通过RF24库可快速实现无线数据收发。本文从实际项目中提取 NRF24L01 核心通信代码,编写纯接收端纯发送端最小示例,去掉冗余的 WiFi、网页、持久化存储等功能,聚焦通信本身,适合快速上手和测试模块硬件连通性。

一、硬件接线(ESP32 + NRF24L01)

核心接线(必须接对,模块仅支持 3.3V 供电!),中断引脚 IRQ 暂不使用,悬空即可:

NRF24L01 引脚ESP32 引脚功能说明
GNDGND共地,硬连接保证稳定性
VCC3.3V仅 3.3V 供电,禁止接 5V,建议独立供电避免干扰
CE22模式控制引脚,控制模块收发模式切换
CSN21SPI 片选引脚,选中当前通信模块
SCK18ESP32 HSPI 时钟引脚
MOSI23ESP32 HSPI 发送引脚(主发从收)
MISO19ESP32 HSPI 接收引脚(主收从发)
IRQ悬空中断引脚,本示例暂不使用

注意:NRF24L01 对电源纹波敏感,若通信不稳定,可在模块 VCC 和 GND 之间并联 100nF 电容,或使用独立 3.3V 电源模块供电。

二、通用配置说明

  1. 收发双方必须安装 RF24 库:Arduino IDE → 项目 → 加载库 → 管理库 → 搜索RF24→ 安装(作者 TMRh20 版本);
  2. 收发双方必须一致的参数:通信地址、信道、有效载荷大小、传输速率、发射功率、CRC 校验长度,否则无法通信;
  3. 通信地址为 5 字节数组,可自定义(示例用0x11,0x22,0x33,0x44,0x55);
  4. 有效载荷大小(PAYLOAD_SIZE)最大为 32 字节,是 NRF24L01 的硬件限制。

三、纯接收端代码(ESP32)

功能:初始化 NRF24L01 为接收模式,持续监听指定信道,接收到数据后立即解析并打印到串口,核心逻辑仅保留接收 + 数据处理,无任何冗余功能。

cpp

运行

#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_2MBPS radio.setPALevel(RF24_PA_HIGH); // 发射功率:RF24_PA_LOW/MID/HIGH/MAX radio.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); } }

四、纯发送端代码(ESP32)

功能:初始化 NRF24L01 为发送模式,每隔 1 秒向指定地址发送一组测试数据(包含 id、重量、数量,与原项目数据格式一致),发送成功 / 失败均打印串口日志,核心逻辑仅保留数据封装 + 发送

cpp

运行

#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秒发送一次 }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 13:44:52

Freertos前置:裸机系统和多任务系统

1. 裸机系统常见的裸机系统有轮询系统和前后台系统&#xff0c;如下。1.1 轮询系统有嵌入式基础的小伙伴们都知道&#xff0c;我们在用keil编程的时候会写一个死循环&#xff0c;一方面可以让系统停住&#xff0c;另一方面可以往里面写代码让单片机不断地多次轮番执行其中代码。…

作者头像 李华
网站建设 2026/3/30 23:47:02

直播行业技术升级观察:智能美妆为何成为美颜sdk新趋势

如果你最近刷直播&#xff0c;会明显感觉到一件事&#xff1a;主播的妆容&#xff0c;越来越“自然”了。不是早几年那种一眼就能看出来的磨皮糊脸&#xff0c;也不是统一模板式的“网红脸”&#xff0c;而是更贴近真人妆感——皮肤有质感、妆面有层次、五官有保留。 而这一变化…

作者头像 李华
网站建设 2026/3/26 17:15:51

地铁上也能写代码?这个开源项目让AI编程助手装进浏览器

你是否遇到过这些场景&#xff1f; 周五晚上 10 点&#xff0c;你正躺在沙发上刷手机&#xff0c;突然收到紧急消息&#xff1a;"线上有个 bug&#xff0c;能帮忙看看吗&#xff1f;" 你打开电脑&#xff0c;启动 IDE&#xff0c;等待项目加载……5 分钟过去了。 …

作者头像 李华
网站建设 2026/3/20 1:46:05

2026必藏:免费AI搜索优化监测工具,GEO优化少走弯路

2026年GEO优化工具评测&#xff1a;国内外主流产品深度对比做GEO优化&#xff0c;工具是关键。现在市面上的GEO工具分两类&#xff0c;一类是国内工具&#xff0c;一类是海外工具&#xff0c;它们的差别很大。本文从功能完整性、AI模型支持、易用性、性价比四个方面&#xff0c…

作者头像 李华
网站建设 2026/3/13 3:10:56

当快手发出15个月年终奖时,近屿智能看到了什么?

大家好&#xff0c;这里是近屿智能。年关将至&#xff0c;街头巷尾的年味越来越浓。职场人的心情也随着年终奖的消息起伏不定&#xff1a;有人焦虑“今年会不会只有几百块过节费”&#xff0c;有人却已经收到“年终暴击”。就在上周&#xff0c;快手打响了大厂年终奖“神仙打架…

作者头像 李华
网站建设 2026/4/3 4:43:49

屹晶微 EG27517 高速低侧单通道驱动芯片技术解析

在追求极致功率密度与开关效率的现代电力电子系统中&#xff0c;驱动芯片不仅需要提供强大的电流能力以降低开关损耗&#xff0c;更需要在信号逻辑的灵活性上给予设计者充分的选择。EG27517 正是这一设计哲学的杰出代表。它采用超紧凑的 SOT23-5 封装&#xff0c;却集成了高达4…

作者头像 李华