因为刚好做作业需要用到双机通信,顺便学习一下,我在网上找了很多方法,试过用蓝牙通信,但是只能实现发送字符串(个人能力只能到这步,等后面有时间再深入研究蓝牙通信)最后实现方式是 AsyncWebServer和HTTPClient实现双机通信。

​ 这里我把ESP32-C3接温湿度传感器、空气报警器的当做服务端,ESP32-C3接OLED显示屏的当做客户端,一个发送数据,一个接受数据。

文章目录

  • 一、服务端
    • 1、环境配置
    • 2、代码撰写
    • 3、遇见的问题
    • 4、服务端完整代码
  • 二、客户端
  • 三、效果展示

一、服务端

1、环境配置

需要下载ESPAsyncWebServer库,大家可以去官网下载,也可以用我存放在百度网盘的,一样的资源。下载完以后还是跟之前一样,添加下载库

链接:https://pan.baidu.com/s/1Yr8efIupvVDV9nMvxpvd2Q
提取码:xi0x

2、代码撰写

2.1 调用头文件

#include "WiFi.h"
#include "FS.h"
#include "ESPAsyncWebServer.h"
#include "DHT.h"
#include <Wire.h>

2.2 定义引脚接口、服务器端口

#define DHTPIN 7     //DHT数据口
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);
const int airtwo =6;   //空气警报器模拟口// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

2.3读取数据

这里写的函数是为了先读取数据,方便数据封装,又因为温湿度的数据函数是库封装好的,那要是我们是要其他传感器数据呢?这里我写了一个空气警报器的,可以借鉴一下。

//温度
String readTemp() {return String(dht.readTemperature());
}//湿度
String readHumi() {return String(dht.readHumidity());
}
//空气
String readAir() {return String(Air());
}String Air(){int newStat1 = digitalRead(airtwo);if(newStat1==HIGH){Serial.println("超过气体阈值\n");String a ="1";return a;}else{String a ="0";return a; }
}

2.4 发送数据

关于“/temperature”这个可根据你自己来定义,这里是搞了三个页面,对应不同的数据。

  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){request->send_P(200, "text/plain", readTemp().c_str());});server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){request->send_P(200, "text/plain", readHumi().c_str());});server.on("/Air", HTTP_GET, [](AsyncWebServerRequest *request){request->send_P(200, "text/plain", readAir().c_str());});

2.5获取服务端ip地址,我们可以通过串口助手查看或者是打开电脑的移动认定查看

  Serial.print("IP Address:");Serial.println(WiFi.localIP());
3、遇见的问题

在烧录代码的时候,报出了库的问题,说是IPAddress的问题,用ESP32开发板是没问题的,但是用ESP32-C3开发板就报错。一开始我也是在网上找了很久,可是还是没找到相关解决办法,后面根据报错地址,一个一个找,在找到报错的那个点,我把0U删除了,就可以用了。

4、服务端完整代码
// Import required libraries
#include "WiFi.h"
#include "FS.h"
#include "ESPAsyncWebServer.h"
#include "DHT.h"
#include <Wire.h>#define DHTPIN 7
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);const char* ssid = "3671";
const char* password = "05210835";
const int airtwo =6;// Create AsyncWebServer object on port 80
AsyncWebServer server(80);String readTemp() {return String(dht.readTemperature());
}String readHumi() {return String(dht.readHumidity());
}
String readAir() {return String(Air());
}
String Air(){int newStat1 = digitalRead(airtwo);if(newStat1==HIGH){Serial.println("超过气体阈值\n");String a ="1";return a;}else{String a ="0";return a;}
}
void setup(){pinMode(airtwo,INPUT);  //空气报警器  是输入// Serial port for debugging purposesSerial.begin(115200);dht.begin();WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print("正在连接中----\n");       }Serial.print("WIFI已连接\n");Serial.print("IP Address:");Serial.println(WiFi.localIP());server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){request->send_P(200, "text/plain", readTemp().c_str());});server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){request->send_P(200, "text/plain", readHumi().c_str());});server.on("/Air", HTTP_GET, [](AsyncWebServerRequest *request){request->send_P(200, "text/plain", readAir().c_str());});// Start serverserver.begin();
}void setupWifi(){WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print("正在连接中----\n");}Serial.print("WIFI已连接\n");Serial.print(WiFi.localIP());
}
void loop(){float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
String a =Air();
int newStat1 = digitalRead(airtwo);if(newStat1==HIGH){Serial.println("超过气体阈值\n");}else{  }if (isnan(h) || isnan(t) || isnan(f)) {Serial.println(F("Failed to read from DHT sensor!\n"));return;}//可以让我们通过串口查看数据Serial.print(F("Air: "));   Serial.print(a);Serial.print(F("  Humidity: "));        Serial.print(h);Serial.print(F("%  Temperature: "));Serial.print(t);Serial.print(F("*C  \n "));if (!WiFi.isConnected()) //先看WIFI是否还在连接{setupWifi();}
}

二、客户端

​ 上一篇博客已经讲了OLED的使用,所以这里就一笔带过。讲客户端怎么获取服务端的数据。

1、调用头文件

#include <WiFi.h>
#include <HTTPClient.h>
/* 使用0.96寸的OLED屏幕需要使用包含这个头文件 */
#include "SSD1306Wire.h"

2、服务器的ip地址

对应服务端三个页面存放的数据

//服务端的ip地址
const char* serverNameTemp = "http://192.168.137.82/temperature";
const char* serverNameHumi = "http://192.168.137.82/humidity";
const char* serverNameAir = "http://192.168.137.82/Air";

3、获取http网页函数

String httpGETRequest(const char* serverName) {HTTPClient http;// Your IP address with path or Domain name with URL path http.begin(serverName);// Send HTTP POST requestint 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);}// Free resourceshttp.end();return payload;
}

4、获取的数据显示到显示屏上

   String temperature = httpGETRequest(serverNameTemp);String Humidity = httpGETRequest(serverNameHumi);String Airpost  =httpGETRequest(serverNameAir);unsigned long currentMillis = millis();if(Airpost =="0"){oled.drawString(0,40, "Air:warning"); // 数值为0是 显示warning}else{oled.drawString(0,40, "Air:normal"); // 数值为1是 显示normal}/* 1. 显示字母 */oled.setFont(ArialMT_Plain_16);       // 设置字体oled.drawString(0,0, "Temp:" +temperature+"C"); // 将要显示的字母写入缓存oled.drawString(0,20, "Humidity:"+Humidity+"%"); // 将要显示的字母写入缓存oled.display();                       // 将缓存里的文字在屏幕上显示delay(10000);oled.clear(); oled.display();         // 清除屏幕

5、客户端完整代码

#include <WiFi.h>
#include <HTTPClient.h>
/* 使用0.96寸的OLED屏幕需要使用包含这个头文件 */
#include "SSD1306Wire.h"
const char* ssid = "3671";
const char* password = "05210835";
//Your IP address or domain name with URL path
//服务端的ip地址
const char* serverNameTemp = "http://192.168.137.82/temperature";
const char* serverNameHumi = "http://192.168.137.82/humidity";
const char* serverNameAir = "http://192.168.137.82/Air";/* 设置oled屏幕的相关信息 */
const int I2C_ADDR = 0x3c;              // oled屏幕的I2c地址
#define SDA_PIN 5                       // SDA引脚,默认gpio4(D2)
#define SCL_PIN 4                       // SCL引脚,默认gpio5(D1)/* 新建一个oled屏幕对象,需要输入IIC地址,SDA和SCL引脚号 */
SSD1306Wire oled(I2C_ADDR, SDA_PIN, SCL_PIN);unsigned long previousMillis = 0;
const long interval = 5000; void setup() {Serial.begin(115200);WiFi.begin(ssid, password);Serial.println("Connecting");while(WiFi.status() != WL_CONNECTED) { delay(500);Serial.print(".");}Serial.println("");Serial.print("Connected to WiFi network with IP Address: ");Serial.println(WiFi.localIP());/* 2. oled屏幕初始化 */oled.init();oled.flipScreenVertically();          // 设置屏幕翻转oled.setContrast(255);                // 设置屏幕亮度drawRect();                           // 测试屏幕显示oled.clear(); oled.display();         // 清除屏幕
}void drawRect(void) {for (int16_t i=0; i<oled.getHeight()/2; i+=2) {oled.drawRect(i, i, oled.getWidth()-2*i, oled.getHeight()-2*i);oled.display();delay(50);}
}void loop() {String temperature = httpGETRequest(serverNameTemp);String Humidity = httpGETRequest(serverNameHumi);String Airpost  =httpGETRequest(serverNameAir);unsigned long currentMillis = millis();if(Airpost =="0"){oled.drawString(0,40, "Air:warning"); // 将要显示的字母写入缓存}else{oled.drawString(0,40, "Air:normal"); // 将要显示的字母写入缓存}/* 1. 显示字母 */oled.setFont(ArialMT_Plain_16);       // 设置字体oled.drawString(0,0, "Temp:" +temperature+"C"); // 将要显示的字母写入缓存oled.drawString(0,20, "Humidity:"+Humidity+"%"); // 将要显示的字母写入缓存oled.display();                       // 将缓存里的文字在屏幕上显示delay(10000);oled.clear(); oled.display();         // 清除屏幕if(currentMillis - previousMillis >= interval) {// Check WiFi connection statusif(WiFi.status()== WL_CONNECTED ){ Serial.println("Temperature: " + temperature + " *C - Humidity: " + Humidity+ "%" );// save the last HTTP GET RequestpreviousMillis = currentMillis;}else {Serial.println("WiFi Disconnected");}}
}String httpGETRequest(const char* serverName) {HTTPClient http;// Your IP address with path or Domain name with URL path http.begin(serverName);// Send HTTP POST requestint 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);}// Free resourceshttp.end();return payload;
}

三、效果展示



写到这里,终于放假回家了,新的一年再继续加油努力吧!!!
凛冬散尽 星河长明 新的一年 万事顺遂

ESP32-C3利用AsyncWebServer和HTTPClient实现双机通信相关推荐

  1. [STM32]利用串口实现F1 F4双机通信问题

    前言 最近假期时间比较充裕,便想着写几篇博客,把之前在项目或学习过程中遇到的问题.学习经验,踩过的坑总结一下.方便自己日后学习,也希望我的经验可以帮助大家解决一些遇到的问题. 一.串口通信电平介绍 T ...

  2. 利用veiw建立Centos5.5 双机智能DNS手册

    利用veiw建立Centos5.5 双机智能DNS手册 一.     环境 1.2台centos5.5服务器 2.ip规划:NS1:192.168.253.251 NS2:192.168.253.25 ...

  3. 乐鑫Esp32学习之旅⑦ esp32上利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  4. Esp32 C3 Arduino 串口开发(1)

    网上合宙的esp32 C3 的测试版 9.9元,简洁小巧,用于学习测试非常方便.原来是装的Luatos,可以直接用Arduino开发.Arduino安装的为最新版 V2.00RC8,有点类似 vSco ...

  5. 计算机网络实验设计-利用Socket实现双机通信

    文章目录 实验目的: 具体要求: 我的实现程度 思路 关键代码和解释 实验目的: 利用 Socket 来实现双机通信,理解 TCP 状态机图 实验内容:使用 Socket 编程,采用其中的 TCP 面 ...

  6. Arduino IDE ESP32 C3 “Some indexes could not be updated.”错误

    过程 最近用XIAO ESP32 C3的板子做个小项目,使用Arduino IDE进行开发,在按照文档步骤,在File\Perference\Additional Board Manager URLs ...

  7. 【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏

    实验使用的硬件,软件平台使用Arduino IDE(见<[花雕体验]15 尝试搭建Beetle ESP32 C3之Arduino开发环境>) WS2812B 是一个集控制电路与发光电路于一 ...

  8. 1.1 利用Socket实现双机通信

    利用Socket实现双机通信 目的 环境 所需知识 实验分析 实验结果 代码 目的 利用WinSock来实现双机通信,理解TCP状态图 要求使用WinSock编程,采用其中的TCP面向连接方式,实现文 ...

  9. Java+利用UDP实现简单双机通信

    计算机网络实验报告,给了很多课题,然后自己就对实现双机通信比较感兴趣,然后就希望做一个能够实现双机双机通信的小聊天程序,本来还想用MFC做一个的,然后就在那扣了将近一天的MFC结果就自己做了一个最简单 ...

最新文章

  1. 直方图均衡化opencv(彩色、灰度图)
  2. linux下find(文件查找)命令的用法总结
  3. rancher使用fluentd-pilot收集日志分享
  4. 简单实现支付密码输入框 By HL
  5. python迭代数据类型_在大型数据集上自动迭代推断数据类型和最小项大小
  6. php实现下单成功提示语,推荐10款提示语源码(收藏)汇总
  7. Pytorch基础(八)——正则化
  8. c语言程序2048_C语言2048小游戏演示和说明
  9. Java™ 教程(不可变对象)
  10. matlab在伪随机码,MATLAB在伪随机码的生成及仿真中的应用
  11. 有序序列的二分查找、冒泡排序、归并排序算法实战解析
  12. android游戏存档在哪里,网易安卓模拟器游戏存档在哪个文件夹的详细解析
  13. 远程控制软件和木马的区别——病毒木马 001
  14. 计算机显卡怎样安装方法,台式机显卡怎么安装?教您安装方法
  15. c标签 if else c标签 总结
  16. 【Matlab印刷数字识别】OCR识别系统【含源码 438期】
  17. 脑电数据处理分析教程汇总(eeglab, mne-python)
  18. 《游戏制作人手册》读书笔记
  19. Linux 下常见的四款chm查看器比较
  20. word文档中表格顶头怎么调整_word使用技巧之-Word文字处理技巧,学会不求人!...

热门文章

  1. 司铭宇讲师为重庆某汽车经销商培训《4S店销售与沟通技巧》内训项目完成
  2. 小时候我们一起推过的箱子
  3. Java内存模型及三大特性
  4. .Net Core-做一个微信公众号的排队系统
  5. 记一次Pr字幕模糊问题及解决方法
  6. pg SQL查询优化经历
  7. 保障4-0509任务打卡
  8. 网站因服务器原因被K站,如果网站被K怎么快速恢复
  9. 大众集团「下注」本地化
  10. 看了个电影《天那边》