发送端
//发送
#include <ESP8266WiFi.h>
#include <espnow.h>
const int analogInPin = A0; //ESP8266模拟引脚ADC0,也就是A0
const int digitalInPin = D1; //获取sw数字量信号的引脚
int sensorValue = 0;
int buttonState = 0;
//接收方MAC地址 根据自己的板子修改
uint8_t broadcastAddress[] = {0xE8, 0xDB, 0x84, 0x95, 0x8D, 0xF6};
//发送数据的结构体
typedef struct struct_message {
int x;
int sw;
} struct_message;
//创建一个新的类型变量
struct_message myData;
//这是一个回调函数,将在发送消息时执行。
//在这种情况下,无论是否成功发送该消息,都会简单地打印出来
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
Serial.print("Last Packet Send Status: ");
if (sendStatus == 0){
Serial.println("Delivery Success");
}
else{
Serial.println("Delivery Fail");
}
}
void setup() {
//初始化串行监视器以进行调试
Serial.begin(115200);
//SW (Z轴)是数字输入信号,连接到数字端口,并启用上拉电阻。
pinMode(digitalInPin, INPUT_PULLUP); //注意 Z 轴输入一定要上拉,不然电平不稳。
//将设备设置为Wi-Fi站点
WiFi.mode(WIFI_STA);
//立即初始化ESP
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW!");
return;
}
//设置ESP8266角色 ESP_NOW_ROLE_CONTROLLER, ESP_NOW_ROLE_SLAVE,
//ESP_NOW_ROLE_COMBO, ESP_NOW_ROLE_MAX。
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
//先前创建的功能。
esp_now_register_send_cb(OnDataSent);
//与另一个ESP-NOW设备配对以发送数据
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}
void loop() {
//读取模拟数值
sensorValue = analogRead(analogInPin); // 0-1024
buttonState = digitalRead(digitalInPin); // 0 或者1
// 打印串行监视器中的读数
Serial.print("sensor = ");
Serial.println(sensorValue);
Serial.print("button = ");
Serial.println(buttonState);
myData.x = sensorValue;
myData.sw = buttonState;
//发送消息
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
//延时两秒
delay(100);
}
接收端
//接收
#include <ESP8266WiFi.h>
#include <espnow.h>
//接收数据保存的结构体和发送方一致
typedef struct struct_message {
int x;
int sw;
} struct_message;
//创建结构体变量
struct_message myData;
//创建一个回调函数作为接收数据后的串口显示
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("X: ");
Serial.println(myData.x);
Serial.print("ButtonState: ");
Serial.println(myData.sw);
if(!myData.sw){
if(myData.x > 1023){
myData.x = 1023;
}
analogWrite(LED_BUILTIN,myData.x);
}else{
digitalWrite(LED_BUILTIN, HIGH);
}
}
void setup() {
//初始化窗口
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
//设置ESP8266模式
WiFi.mode(WIFI_STA);
//初始化 ESP-NOW
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}
//设置ESP8266角色:
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
//先前创建的功能 测试ESP-NOW通信
esp_now_register_recv_cb(OnDataRecv);
}
void loop(){
}