espnow 远程控制 led
时间: 2023-08-29 13:05:44 浏览: 102
这是一个使用ESP8266和ESP-NOW通信协议来远程控制LED灯的示例代码:
发送端代码:
```c
#include <esp_now.h>
#include <WiFi.h>
// 定义发送数据结构体
typedef struct __attribute__((packed)) {
uint8_t state;
} ControlData;
// 定义MAC地址
uint8_t remoteMac[] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC};
// 设置WIFI信息
const char* ssid = "your_ssid";
const char* password = "your_password";
// 初始化控制数据
ControlData controlData = {
.state = 0
};
void setup() {
// 初始化串口
Serial.begin(115200);
// 初始化WIFI
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}
Serial.println("WIFI connected");
// 初始化ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
// 注册远程设备
esp_now_peer_info_t peerInfo;
memcpy(peerInfo.peer_addr, remoteMac, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Error adding remote peer");
return;
}
}
void loop() {
// 切换LED灯状态
controlData.state = !controlData.state;
Serial.println("Sending control data");
// 发送控制数据
esp_now_send(remoteMac, (uint8_t*)&controlData, sizeof(controlData));
delay(1000);
}
```
接收端代码:
```c
#include <esp_now.h>
#include <WiFi.h>
// 定义接收数据结构体
typedef struct __attribute__((packed)) {
uint8_t state;
} ControlData;
// 定义MAC地址
uint8_t localMac[] = {0x98, 0xF4, 0xAB, 0x20, 0x8E, 0x0C};
// 设置WIFI信息
const char* ssid = "your_ssid";
const char* password = "your_password";
// 初始化控制数据
ControlData controlData = {
.state = 0
};
void setup() {
// 初始化串口
Serial.begin(115200);
// 初始化WIFI
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}
Serial.println("WIFI connected");
// 初始化ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
// 注册接收回调函数
esp_now_register_recv_cb([](uint8_t* mac, uint8_t* data, uint8_t len) {
// 处理接收到的数据
memcpy(&controlData, data, sizeof(controlData));
Serial.print("Received control data: ");
Serial.println(controlData.state);
// 控制LED灯
digitalWrite(LED_BUILTIN, controlData.state);
});
// 注册本地设备
esp_now_peer_info_t peerInfo;
memcpy(peerInfo.peer_addr, localMac, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Error adding local peer");
return;
}
}
void loop() {
// do nothing
}
```
在发送端代码中,控制数据结构体包含一个状态变量state,用来控制LED灯的开关状态。在loop函数中,每隔一秒钟就切换一次状态并发送控制数据。
在接收端代码中,控制数据结构体同样包含一个状态变量state。在setup函数中,注册了一个接收回调函数,当接收到数据时会调用该函数。在回调函数中,把接收到的数据拷贝到控制数据结构体中,并根据控制数据的状态控制LED灯。
需要注意的是,发送端和接收端的MAC地址需要正确设置,否则无法建立通信。同时,接收回调函数需要使用lambda表达式来定义,否则会出现编译错误。
阅读全文