ESP8266之间的esp-now通信

该代码示例展示了如何使用ESP8266的espnow库在两个设备间无线传输模拟和数字传感器数据。发送端读取A0引脚的模拟值和D1引脚的数字状态,然后将数据封装在结构体中并通过espnow发送。接收端接收到数据后,更新LED状态。
摘要由CSDN通过智能技术生成

发送端

//发送
#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(){
  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值