在本项目中,您将学习如何使用 ESP8266 NodeMCU 板托管 Web 服务器并同时使用 ESP-NOW 通信协议。您可以让多个 ESP8266 板通过 ESP-NOW 将传感器读数发送到一个 ESP8266 接收器,该接收器在网络服务器上显示所有读数。软件代码使用 Arduino IDE 进行编程。
同时使用 ESP-NOW 和 Wi-Fi
如果您想使用 Wi-Fi 托管 Web 服务器并同时使用 ESP-NOW 从其他开发板接收传感器读数,则需要考虑一些事项:
- ESP8266 发送板必须使用与接收板相同的 Wi-Fi 通道。
- 接收板的 Wi-Fi 信道由您的 Wi-Fi 路由器自动分配。
- 接收板的Wi-Fi模式必须是接入点和站点(WIFI_AP_STA).
- 您可以手动设置相同的 Wi-Fi 通道,也可以在发送器上添加简单的代码,将其 Wi-Fi 通道设置为与接收板相同的 Wi-Fi 通道。
项目概况
下图显示了我们将构建的项目的概览。
- 有两块 ESP8266 发送板,通过 ESP-NOW将BME280温度和湿度读数发送到一块 ESP8266 接收板( ESP-NOW 多对一配置);
- ESP8266 接收板接收数据包并在网络服务器上显示读数;
- 每次使用服务器发送事件 (SSE) 接收到新读数时,网页都会自动更新。
- 该网页还显示了上次使用 JavaScript 更新读数的时间。
前提条件
在继续此项目之前,请确保检查以下先决条件。
开发环境
我们将使用 Arduino IDE 对 ESP8266 板进行编程,因此在继续本教程之前,请确保您的 Arduino IDE 中安装了 ESP8266 板。
- 在 Arduino IDE(Windows、Mac OS X 和 Linux)中安装 ESP8266 开发板
BME280 图书馆
ESP8266 发送板将从 BME280 传感器发送温度和湿度读数。
要从 BME280 传感器读取数据,我们将使用Adafruit_BME280 库。要使用此库,您还需要安装 Adafruit Unified Sensor 库。按照后续步骤安装这些库。
在搜索框中搜索“ adafruit bme280 ”并安装库。
要使用 BME280 库,您还需要安装 Adafruit_Sensor 库。按照以下步骤在您的 Arduino IDE 中安装该库:
转到 Sketch > Include Library > Manage Libraries ,然后在搜索框中 键入“ Adafruit Unified Sensor ”。一直向下滚动以找到库并安装它。
要了解有关 BME280 温度、湿度和压力传感器的更多信息,请阅读我们的指南:ESP8266 和 BME280 使用 Arduino IDE(压力、温度、湿度)。
异步 Web 服务器库
要构建 Web 服务器,您需要安装以下库:
这些库无法通过 Arduino 库管理器安装,因此您需要将库文件复制到 Arduino Installation Libraries 文件夹中。或者,在您的 Arduino IDE 中,您可以转到 Sketch > Include Library > Add .zip Library 并选择您刚刚下载的库。
Arduino_JSON 库
您需要安装 Arduino_JSON 库。您可以在 Arduino IDE 库管理器中安装此库。只需转到 Sketch > Include Library > Manage Libraries 并搜索库名称,如下所示:
所需硬件
要学习本教程,您需要多个 ESP8266 开发板。我们将使用三个 ESP8266 板。您还需要:
- 3x ESP8266 (阅读 最佳 ESP8266 开发板)
- 2x BME280 传感器– ESP8266 的 BME280 指南
- 面包板
- 跳线
获取接收板MAC地址
要通过 ESP-NOW 发送消息,您需要知道接收板的。每块板都有一个唯一的 MAC 地址。
将以下代码上传到您的 ESP8266 接收板以获取其 MAC 地址。
// 获取和更改ESP MAC地址的完整代码:
#ifdef ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
void setup(){
Serial.begin(115200);
Serial.println();
Serial.print("ESP Board MAC Address: ");
Serial.println(WiFi.macAddress());
}
void loop(){
}
上传代码后,按下 RST/EN 按钮,MAC 地址应该显示在串口监视器上。
ESP8266 接收器(ESP-NOW + Web 服务器)
ESP8266 NodeMCU 接收板接收来自发送板的数据包,并托管一个网络服务器以显示最新接收的读数。
将以下代码上传到您的接收板 - 该代码已准备好接收来自两个不同板的读数。
#include <espnow.h>
#include <ESP8266WiFi.h>
#include "ESPAsyncWebServer.h"
#include "ESPAsyncTCP.h"
#include <Arduino_JSON.h>
// Replace with your network credentials (STATION)
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
int id;
float temp;
float hum;
unsigned int readingId;
} struct_message;
struct_message incomingReadings;
JSONVar board;
AsyncWebServer server(80);
AsyncEventSource events("/events");
// callback function that will be executed when data is received
void OnDataRecv(uint8_t * mac_addr, uint8_