11浏览
查看: 11|回复: 3

[项目] 【Arduino 动手做】通过 ESP-NOW 实现 ESP32 到 ESP32 双工通信

[复制链接]
通过 ESP-NOW 实现 ESP32 到 ESP32 的双工通信 是一种高效且低延迟的无线通信方式,适用于需要快速数据交换的场景。以下是实现双工通信的简要步骤和关键点:

1. 核心概念
ESP-NOW 是乐鑫开发的协议,基于 Wi-Fi 物理层,但无需建立传统连接,直接通过 MAC 地址通信。
双工通信:两个 ESP32 设备既能发送也能接收数据,实现双向实时交互。

2. 实现步骤
硬件准备
两个 ESP32 开发板(如 ESP32-WROOM-32)。
确保两者处于同一 Wi-Fi 信道(默认 2.4GHz)。
软件配置
初始化 Wi-Fi 和 ESP-NOW
设置 Wi-Fi 为 STA 模式(不连接路由器,仅启用射频)。
初始化 ESP-NOW 协议栈。
注册对端设备(Peer)
双方需预先知道对方的 MAC 地址(可通过 WiFi.macAddress() 获取)。
使用 esp_now_add_peer() 注册对端设备,启用加密(可选)。
设置回调函数
发送回调:确认数据是否成功发送。
接收回调:处理接收到的数据。
双向通信逻辑
发送端:通过 esp_now_send() 发送数据到对端 MAC。
接收端:在回调函数中解析数据并响应。

【Arduino 动手做】通过 ESP-NOW 实现 ESP32 到 ESP32 双工通信图1

【Arduino 动手做】通过 ESP-NOW 实现 ESP32 到 ESP32 双工通信图2

【Arduino 动手做】通过 ESP-NOW 实现 ESP32 到 ESP32 双工通信图3

【Arduino 动手做】通过 ESP-NOW 实现 ESP32 到 ESP32 双工通信图4

驴友花雕  中级技神
 楼主|

发表于 4 小时前

【Arduino 动手做】通过 ESP-NOW 实现 ESP32 到 ESP32 双工通信

收发器1 代码

  1. //--------------------------------------------
  2. //ESP32 Tranceiver 1 via ESP-NOW Protocol
  3. //Transmit Pot Value - Receive Temp & Humidity
  4. //--------------------------------------------
  5. #include <esp_now.h>
  6. #include <WiFi.h>
  7. #include <Wire.h>
  8. #include <Adafruit_GFX.h>
  9. #include <Adafruit_SSD1306.h>
  10. //------------------------------------------------------------
  11. Adafruit_SSD1306 display(128, 64, &Wire, -1);
  12. //------------------------------------------------------------
  13. uint8_t RxMACaddress[] = {0x7C, 0x9E, 0xBD, 0xF5, 0xBE, 0x30};
  14. //------------------------------------------------------------
  15. typedef struct TxStruct
  16. {
  17.   int potVal;
  18. }TxStruct;
  19. TxStruct sentData;
  20. //------------------------------------------------------------
  21. typedef struct RxStruct
  22. {
  23.   float temp; int humidity;
  24. }RxStruct;
  25. RxStruct receivedData;
  26. //------------------------------------------------------------
  27. void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status)
  28. {
  29.   Serial.print("\r\nLast Packet Send Status:\t");
  30.   Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
  31. }
  32. //------------------------------------------------------------
  33. void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len)
  34. {
  35.   memcpy(&receivedData, incomingData, sizeof(receivedData));
  36. }
  37. //======================================================================================
  38. void setup()
  39. {
  40.   Serial.begin(115200);
  41.   if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
  42.   {
  43.     Serial.println(F("SSD1306 allocation failed"));
  44.     for (;;); // Don't proceed, loop forever
  45.   }
  46.   display.clearDisplay();
  47.   //----------------------------------------------------------
  48.   WiFi.mode(WIFI_STA);
  49.   if (esp_now_init() != ESP_OK)
  50.   {
  51.     Serial.println("Error initializing ESP-NOW");
  52.     return;
  53.   }
  54.   //----------------------------------------------------------
  55.   esp_now_register_send_cb(OnDataSent);
  56.   //----------------------------------------------------------
  57.   esp_now_peer_info_t peerInfo;
  58.   memcpy(peerInfo.peer_addr, RxMACaddress, 6);
  59.   peerInfo.channel = 0;  
  60.   peerInfo.encrypt = false;
  61.   //----------------------------------------------------------
  62.   if(esp_now_add_peer(&peerInfo) != ESP_OK)
  63.   {
  64.     Serial.println("Failed to add peer");
  65.     return;
  66.   }
  67.   //----------------------------------------------------------
  68.   esp_now_register_recv_cb(OnDataRecv);
  69. }
  70. //======================================================================================
  71. void loop()
  72. {
  73.   sentData.potVal = analogRead(A0);
  74.   //----------------------------------------------------------
  75.   esp_err_t result = esp_now_send(RxMACaddress, (uint8_t *) &sentData, sizeof(sentData));
  76.   //----------------------------------------------------------
  77.   if (result == ESP_OK) Serial.println("Sent with success");
  78.   else Serial.println("Error sending the data");
  79.   //----------------------------------------------------------
  80.   display.setTextColor(WHITE); display.clearDisplay();
  81.   display.setTextSize(2); display.setCursor(0,0); display.print("--DHT 11--");
  82.   display.setCursor(0,25); display.print("T: ");
  83.   display.print(receivedData.temp); display.print("C");
  84.   display.setCursor(0,50); display.print("H: ");
  85.   display.print(receivedData.humidity); display.print("%");
  86.   display.display();
  87. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 小时前

【Arduino 动手做】通过 ESP-NOW 实现 ESP32 到 ESP32 双工通信

收发器 2 代码

  1. //--------------------------------------------
  2. //ESP32 Tranceiver 2 via ESP-NOW Protocol
  3. //Transmit Temp & Humidity - Receive Pot Value
  4. //--------------------------------------------
  5. #include <esp_now.h>
  6. #include <WiFi.h>
  7. #include<Wire.h>
  8. #include<Adafruit_SSD1306.h>
  9. #include <DHT.h>
  10. //------------------------------------------------------------
  11. Adafruit_SSD1306 display(128, 64, &Wire, -1);
  12. DHT dht(32, DHT11);
  13. //------------------------------------------------------------
  14. uint8_t RxMACaddress[] = {0x7C, 0x9E, 0xBD, 0xF1, 0x85, 0xCC};
  15. //------------------------------------------------------------
  16. typedef struct TxStruct
  17. {
  18.   float temp; int humidity;
  19. }TxStruct;
  20. TxStruct sentData;
  21. //------------------------------------------------------------
  22. typedef struct RxStruct
  23. {
  24.   int potVal;
  25. }RxStruct;
  26. RxStruct receivedData;
  27. //------------------------------------------------------------
  28. void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len)
  29. {
  30.   memcpy(&receivedData, incomingData, sizeof(receivedData));
  31. }
  32. //------------------------------------------------------------
  33. void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status)
  34. {
  35.   Serial.print("\r\nLast Packet Send Status:\t");
  36.   Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
  37. }
  38. //======================================================================================
  39. void setup()
  40. {
  41.   Serial.begin(115200);
  42.   dht.begin();
  43.   if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
  44.   {
  45.     Serial.println(F("SSD1306 allocation failed"));
  46.     for (;;); // Don't proceed, loop forever
  47.   }
  48.   display.clearDisplay();
  49.   //----------------------------------------------------------
  50.   WiFi.mode(WIFI_STA);
  51.   //----------------------------------------------------------
  52.   if(esp_now_init() != ESP_OK)
  53.   {
  54.     Serial.println("Error initializing ESP-NOW");
  55.     return;
  56.   }
  57.   //----------------------------------------------------------
  58.   esp_now_register_send_cb(OnDataSent);
  59.   //----------------------------------------------------------
  60.   esp_now_peer_info_t peerInfo;
  61.   memcpy(peerInfo.peer_addr, RxMACaddress, 6);
  62.   peerInfo.channel = 0;  
  63.   peerInfo.encrypt = false;
  64.   //----------------------------------------------------------
  65.   if(esp_now_add_peer(&peerInfo) != ESP_OK)
  66.   {
  67.     Serial.println("Failed to add peer");
  68.     return;
  69.   }
  70.   //----------------------------------------------------------
  71.   esp_now_register_recv_cb(OnDataRecv);
  72. }
  73. //======================================================================================
  74. void loop()
  75. {
  76.   sentData.temp = dht.readTemperature(false);
  77.   sentData.humidity = dht.readHumidity();
  78.   //----------------------------------------------------------
  79.   display.setTextColor(WHITE); display.clearDisplay();
  80.   display.setTextSize(2); display.setCursor(10,0); display.print("POT Value");
  81.   display.setCursor(5,18); display.print(" 0-->4095 ");
  82.   display.setTextSize(3); display.setCursor(25,42); display.print(receivedData.potVal);
  83.   display.display();
  84.   //----------------------------------------------------------
  85.   esp_err_t result = esp_now_send(RxMACaddress, (uint8_t *) &sentData, sizeof(sentData));
  86.   //----------------------------------------------------------
  87.   if (result == ESP_OK) Serial.println("Sent with success");
  88.   else Serial.println("Error sending the data");
  89.   //----------------------------------------------------------
  90.   delay(1000);
  91. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 小时前

【Arduino 动手做】通过 ESP-NOW 实现 ESP32 到 ESP32 双工通信

【Arduino 动手做】通过 ESP-NOW 实现 ESP32 到 ESP32 双工通信
项目链接:https://akuzechie.blogspot.com/2 ... munication-via.html
项目作者:阿纳斯·库泽奇

项目视频 :https://www.youtube.com/watch?v=PxGWEg4i6q4
项目代码:https://akuzechie.blogspot.com/2 ... munication-via.html

【Arduino 动手做】通过 ESP-NOW 实现 ESP32 到 ESP32 双工通信图2

【Arduino 动手做】通过 ESP-NOW 实现 ESP32 到 ESP32 双工通信图1

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

硬件清单

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

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

mail