栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

【esp8266】esp8266两板之间的收发通讯,code for arduino IDE

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【esp8266】esp8266两板之间的收发通讯,code for arduino IDE

HTTP收发通讯
  • 参考代码:
      • esp8266服务器端的代码:
      • esp8266客户端的代码:
      • 参考文章及错误:
  • 我的修改代码:

参考代码: esp8266服务器端的代码:
//服务器



//载入所需的库
#include 
#include "ESPAsyncWebServer.h"


// 设置接入点网络凭据
const char* ssid = "adan";
const char* password = "88888888";


// 在端口80上创建AsyncWebServer(异步服务器)对象
AsyncWebServer server(80);

String readTemp() {
  return String(123);
}

String readHumi() {
  return String(321);
}

String readPres() {
  return String(123);
}

void setup() {
  //用于调试的串口
  Serial.begin(115200);
  Serial.println();

  // 设置ESP为接入点
  Serial.print("Setting AP (Access Point)…");
  // 如果您想要AP(接入点)打开,请删除密码参数
  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);
  //服务器打开 服务器地址 + 根号 + temperature ,并且是获取请求时,异步服务器创建返回指针,返回指针指向一个发送函数,发送信息回去
  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", readTemp().c_str());
    Serial.println("/temperature" + readTemp());
  });

  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", readHumi().c_str());
    Serial.println("/humidity" + readHumi());
  });

  server.on("/pressure", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", readPres().c_str());
    Serial.println("/pressure" + readPres());

  });

  // 启动服务器
  server.begin();
}
void loop() {}
esp8266客户端的代码:
//客户端


#include 
#include 
#include 

#include 
ESP8266WiFiMulti WiFiMulti;

const char* ssid = "adan";
const char* password = "88888888";

//您的IP地址或域名与URL路径
const char* serverNameTemp = "http://192.168.4.1/temperature";
const char* serverNameHumi = "http://192.168.4.1/humidity";
const char* serverNamePres = "http://192.168.4.1/pressure";

String temperature;
String humidity;
String pressure;

unsigned long previousMillis = 0;
const long interval = 5000; 

void setup() {
  Serial.begin(115200);
  Serial.println();
  
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("Connected to WiFi");
  WiFi.mode(WIFI_STA);
}

void loop() {
  unsigned long currentMillis = millis();
  
  if(currentMillis - previousMillis >= interval) {
    //检查WiFi连接状态
    if ((WiFiMulti.run() == WL_CONNECTED)) {
      temperature = httpGETRequest(serverNameTemp);
      humidity = httpGETRequest(serverNameHumi);
      pressure = httpGETRequest(serverNamePres);
      Serial.println("Temperature: " + temperature + " *C - Humidity: " + humidity + " % - Pressure: " + pressure + " hPa");

      // 保存最后一个HTTP GET请求
      previousMillis = currentMillis;
    }
    else {
      Serial.println("WiFi Disconnected");
    }
  }
}

String httpGETRequest(const char* serverName) {
  WiFiClient client;
  HTTPClient http;
    
  //您的IP地址与路径或域名与URL路径
  http.begin(client, serverName);
  
  //发送HTTP POST请求
  int httpResponseCode = http.GET();
  
  String payload = "--"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http.getString();
  }else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  //免费资源
  http.end();
  return payload;
}

实验效果:

偶尔得错误我没找到原因,有空再研究,或者有人找到告诉我一下

参考文章及错误:

原先参考文章
参考了几篇文章,都有错误,后面在评论区找到了解决方法:
参看文章
在接入得设备输入:

WiFi.mode(WIFI_STA);

我的修改代码:

我只是想用wifi进行板间通讯而已,所以越简单越好,后面可能会封装成一个库,但是前提是我c++大成。。。

搞了很久,还是没有解决数据接收延时得问题,可能是异步通讯的通病吧。。。。本来想加多一个数据位来做判断,但是这样子延时更大了,无线通信真是头疼。。
接收端:

//客户端


#include 
#include 
#include 

#include 
ESP8266WiFiMulti WiFiMulti;
WiFiClient client;
HTTPClient http;
const char* ssid = "adan";
const char* password = "88888888";

//您的IP地址或域名与URL路径
const char* data = "http://192.168.4.1/data";

String shuju;
String payload;
unsigned long previousMillis = 0; //延时,因为程序可以都在中断运行,所以需要延时,这样子时间会更好
const long interval = 50;   //五秒钟响应一次


void setup() {
  Serial.begin(115200);
  Serial.println();
  pinMode(2,OUTPUT);
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("Connected to WiFi");
  WiFi.mode(WIFI_STA);
}

void loop() {

  //计时{}
  unsigned long currentMillis = millis();
  // while (currentMillis - previousMillis >= interval);
  //检查WiFi连接状态
  if ((WiFiMulti.run() == WL_CONNECTED))
  {
    shuju = httpGETRequest(data);
    
    Serial.println("data:" + shuju);
    // 保存最后一个HTTP GET请求
    previousMillis = currentMillis;         //保存时间
    unsigned long currentMillis = millis();   //用delay不行,因为是在中断中运行的
    while(millis() - currentMillis <= 150)    digitalWrite(2,0);
    currentMillis = millis();
    while(millis() - currentMillis <= 150)    digitalWrite(2,1);



    
  }
  else {       //没连接让他重新连接
    Serial.println("WiFi Disconnected");
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
    unsigned long currentMillis = millis();   //用delay不行,因为是在中断中运行的
    while(millis() - currentMillis <= 500)    digitalWrite(2,0);
    currentMillis = millis();
    while(millis() - currentMillis <= 500)    digitalWrite(2,1);
      Serial.print(".");
    }
    Serial.println("");
    Serial.println("Connected to WiFi");
  }

}


String httpGETRequest(const char* serverName) {

  //您的IP地址与路径或域名与URL路径
  http.begin(client, serverName);
  //发送HTTP POST请求
int httpResponseCode = http.GET();
int b=10;
while(httpResponseCode !=1000 && b!=0)
{
  http.begin(client, serverName);
  //发送HTTP POST请求
  httpResponseCode = http.GET();
    unsigned long currentMillis = millis();   //用delay不行,因为是在中断中运行的
    while(millis() - currentMillis <= 15)    digitalWrite(2,0);
    currentMillis = millis();
    while(millis() - currentMillis <= 15)    digitalWrite(2,1);
    b--;   
    Serial.println(b);

  }

  
      unsigned long currentMillis = millis();   //用delay不行,因为是在中断中运行的
    while(millis() - currentMillis <= 15)    digitalWrite(2,0);
    currentMillis = millis();
    while(millis() - currentMillis <= 15)    digitalWrite(2,1);
  // payload= "--";

  if (httpResponseCode > 0) {
    //      Serial.print("HTTP Response code:");
    //      Serial.println(httpResponseCode);         //响应速度或者错误代码之类的 ,修改send_P(1000,“”, data().c_str());1000可以调整
    payload = http.getString();
  } else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  Serial.println(http.connected());

  }
  //释放资源
  //http.end();
  return payload;
}

发送端:

//服务器



//载入所需的库
#include 
#include "ESPAsyncWebServer.h"


// 设置接入点网络凭据
const char* ssid = "adan";
const char* password = "88888888";


// 在端口80上创建AsyncWebServer(异步服务器)对象
AsyncWebServer server(80);

long shuju;  //做一个变量,名字为数据
String data() {
  return String(shuju);
}

void setup() {
  //用于调试的串口
  Serial.begin(115200);
  Serial.println();
  pinMode(2,OUTPUT);
  // 设置ESP为接入点
  Serial.print("Setting AP (Access Point)…");
  // 如果您想要AP(接入点)打开,请删除密码参数
  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);
  
  //服务器打开 服务器地址 + 根号 + temperature ,并且是获取请求时,异步服务器创建返回指针,返回指针指向一个发送函数,发送信息回去
  server.on("/data", HTTP_GET, [](AsyncWebServerRequest * request) {
      shuju++;
    request->send_P(1000, "text/plain", data().c_str());
    Serial.println("/data:" + data());
    unsigned long currentMillis = millis();   //用delay不行,因为是在中断中运行的
    while(millis() - currentMillis <= 15)    digitalWrite(2,0);
    currentMillis = millis();
    while(millis() - currentMillis <= 15)    digitalWrite(2,1);
  });

  // 启动服务器
  server.begin();
}

void loop() {

}

这个代码能用是能用,但是多少带点问题,懒得改了…

做物联网参考我这个

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/361092.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号