使用两块ESP8266实现ESP-NOW通信

ESP-NOW简介

ESP-NOW是Espressif开发的一种基于Wi-Fi的低功耗通信协议。与传统Wi-Fi通信不同,ESP-NOW不需要配对过程,设备间可以直接通信,非常适合需要快速传输小数据包的应用,如传感器网络、遥控器和智能家居设备。它的优势在于低延迟、低功耗和无需网络路由器的直连通信。

使用两块ESP8266实现ESP-NOW通信

要使用两块ESP8266实现ESP-NOW通信,我们需要配置一块作为发送设备,另一块作为接收设备。首先,确保你已经安装了Arduino IDE,并添加了ESP8266的开发板支持。

准备工作

  1. 安装Arduino IDE和ESP8266支持包

    • 打开Arduino IDE,导航到File > Preferences,在“Additional Boards Manager URLs”字段中添加以下链接:
      http://arduino.esp8266.com/stable/package_esp8266com_index.json
      
    • 然后,打开Tools > Board > Boards Manager,搜索esp8266并安装。
  2. 库文件

    • 安装ESP-NOW库:打开Sketch > Include Library > Manage Libraries,搜索ESP8266WiFi并安装。

发送端代码

以下是ESP8266作为发送端的Arduino代码:

#include <ESP8266WiFi.h>
#include <espnow.h>

// 广播地址,所有设备均可接收
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

// 发送数据结构
typedef struct struct_message {
  char message[32];
} struct_message;

struct_message myData;

void setup() {
  // 初始化串口监视器
  Serial.begin(115200);

  // 初始化Wi-Fi
  WiFi.mode(WIFI_STA);

  // 初始化ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // 注册发送回调
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_COMBO, 1, NULL, 0);
}

void loop() {
  // 填充发送数据
  strcpy(myData.message, "Hello, ESP-NOW!");

  // 发送数据
  esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

  // 打印发送信息
  Serial.println("Message sent: " + String(myData.message));

  // 每隔2秒发送一次
  delay(2000);
}

接收端代码

以下是ESP8266作为接收端的Arduino代码:

#include <ESP8266WiFi.h>
#include <espnow.h>

// 接收数据结构
typedef struct struct_message {
  char message[32];
} struct_message;

struct_message myData;

// 接收回调函数
void onDataRecv(uint8_t *mac, uint8_t *incomingData, uint8_t len) {
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("Received message: ");
  Serial.println(myData.message);
}

void setup() {
  // 初始化串口监视器
  Serial.begin(115200);

  // 初始化Wi-Fi
  WiFi.mode(WIFI_STA);

  // 初始化ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // 注册接收回调
  esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
  esp_now_register_recv_cb(onDataRecv);
}

void loop() {
  // 空闲
}

总结

ESP-NOW是一个强大的协议,可以在没有Wi-Fi网络的情况下实现设备间的快速通信。通过以上步骤,你可以使用两块ESP8266开发板建立一个简单的ESP-NOW通信系统。这种方式特别适用于低功耗、低延迟和无需网络基础设施的应用场景。希望这篇博客能帮你快速入门ESP-NOW,开启你的无线通信开发之旅。

ESP32模块支持通过Espressif的ESP-NOW技术进行点对点无线通信,使得多个ESP32设备可以在没有中央路由器的情况下直接相互通信。要在多台Arduino ESP32实现一发多收的功能,你需要编写主节点发送数据以及从节点接收数据的代码。 下面是一个简单的示例,展示了如何在两台ESP32设备上进行ESP-NOW通信。注意这只是一个基础框架,实际应用可能需要根据项目需求进行修改: **主节点(发送者)代码:** ```cpp #include <WiFi.h> #include <ESP32_Network.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); if (!ESP32_NW_Initialize()) { Serial.println("ESP-NOW initialization failed"); } // 发送的数据,这里可以换成你要传输的实际内容 String dataToSend = "Hello from Sender!"; sendData(dataToSend); } void sendData(String message) { if (ESP32_NW_Send(message.c_str(), message.length())) { Serial.println("Sent data to all receivers"); } else { Serial.println("Failed to send data"); } } void loop() { // 如果需要定期发送数据,可以放在这里 } ``` **从节点(接收者)代码:** ```cpp #include <WiFi.h> #include <ESP32_Network.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); if (!ESP32_NW_Initialize()) { Serial.println("ESP-NW initialization failed"); } ESP32_NW_DisableReceiver(); // 开始监听模式 ESP32_NW_StartReceiver(); } void loop() { if (ESP32_NW_ReceiveAvailable()) { // 检查是否有接收到数据 char receivedData[64]; int len = ESP32_NW_Read(receivedData, sizeof(receivedData)); if (len > 0) { receivedData[len] = '\0'; // 添加终止符 Serial.println("Received: " + String(receivedData)); } } } ``` 在每个设备上编好上述代码,并将它们连接到相同的SSID和密码的WiFi网络。主节点会周期性地发送数据,从节点会在接收到数据时打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值