本篇是最近在学校做一个物联网温室控制的课题,在此基础上做了一些对物联网的探索

物联网

物联网(Internet of Things,简称IoT)是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、 连接、互动的物体或过程,采集其声、光、热、电、力学、化学、生物、位置等各种需要的信息,通过各类可能的网络接入,实现物与物、物与人的泛在连接,实现对物品和过程的智能化感知、识别和管理。物联网是一个基于互联网、传统电信网等的信息承载体,它让所有能够被独立寻址的普通物理对象形成互联互通的网络。

在最近几年随着5G技术的兴起,芯片算力的提高,物联网渐渐的开进入了普罗大众的眼中。其实经过我的初步探索,物联网技术就是将各种传感器,和被控制物体连接起来达到利用互联网或者局域网来控制下端设备。

基于esp32的温室光照物联网控制系统

我们的目的是在于搭建一个web网页的服务器,客户端通过连接到esp32之后通过按下网页上不同的按钮来对系统上的外设进行操纵的目的,
比如开关灯,或者监控传感器信息等。废话不多说,直接开始。
** 1 主控的选择**

至于我为什么选择esp32呢,我之前接触过的单片机有stm32,51,tc264,w806等。总的对比下来,不是价格太贵就是资料不齐全或者就是性能太差。而作为比较esp32是乐鑫推出的专门为物联网量身打造的嵌入式soc。
高度集成的ESP32 将天线开关、RF balun、功率放大器、接收低噪声放大器、滤波器、电源管理模块等功能集于一体。ESP32 只需极少的外围器件,即可实现强大的处理性能、可靠的安全性能,和 Wi-Fi & 蓝牙功能。
同时乐鑫esp32支持arduino开发环境这为我之后搭建这套系统带来了极大的便利。
2 外设的选择
这里就不过多赘述,大家需要什么功能就加什么器件。我这里用我之前学习LVGL的板子来作为演示。

                                        DHT11温湿度传感器
这块板子板载光敏电阻和一个DHT11温湿度传感器。可以用来展示一些基础的功能。
3 系统搭建
其实基于arduino成熟的开发环境和完善的开源社区,我们搭建这套系统可以说是十分的简单。
首先介绍一下我们的目标要搭建web服务器首先得连上WiFi或者自己开启WiFi。这里我选择连上WiFi作为一个sta端连接到ap服务端,为什么呢?因为这样我们就可以通过ap端连接互联网了。有了互联网之后这个系统的可拓展性会得到极大的提升。
那么开启WiFi
第一步
设置你要连接的WiFi账号密码

const char* ssid = "DESKTOP";        //wifi密码和名称
const char* password = "11111111";

第二步
开始连接,在arduino上非常简单

WiFi.mode(WIFI_STA);     //wifi 的打开和连接WiFi.begin(ssid, password);if (WiFi.waitForConnectResult() != WL_CONNECTED) {Serial.printf("WiFi Failed!\n");return;}Serial.print("IP Address: ");Serial.println(WiFi.localIP());   //获取到的ip地址,这个地址之后要显示在屏幕上

不过经过我的测试,如果连接不到WiFi的话会在if哪里卡很久,具体我没仔细测试,可能在不断尝试重新连接吧。
然后呢我们连上WiFi之后就可以进行
web服务端和websocket的初始化,为什么要弄websocket我们后面再说。
首先我们需要安装一个库ESPAsyncWebServer。

其实Arduino for ESP8266 和 Arduino for ESP32 中默认就有WebServer,不过这些WebServer都是同步的,不支持同时处理多个连接,这在很多时候其实是不太好用的。
如果用户请求一个页面,该页面中链接了很多文件的情况下,因为不支持同时处理多个连接,其中部分文件可能就获取失败了,最终导致呈现在用户眼前的页面功能缺失。再或者有多个用户频繁的发起请求,其中部分请求也有可能会无法响应。

使用ESPAsyncWebServer就可以极大的规避上述问题,使在Arduino for ESP8266&ESP32中搭建WebServer真正可用、好用
ESPAsyncWebServer项目地址如下:
https://github.com/me-no-dev/ESPAsyncWebServer
这里我简要的介绍一下websocket

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

WebSocket 是独立的、创建在 TCP 上的协议。
Websocket 通过HTTP/1.1 协议的101状态码进行握手。
为了创建Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(handshaking)。
众所周知HTTP是基于请求/响应范式的。也就是说客户端不请求,服务端就不能发送消息给客户端。但是我们需要服务器不停的推送数据来达到监控传感器数据的目的。在早期通过轮询等方式来不断请求数据,但这样很耗费cpu性能,所以在websocket出现之后这种方式就渐渐被取代了
在我们这个系统里网络模型大致如图
在第六步时,这时候客户端就发送了升级成websocket的请求。之后服务器收到请求就建立了连接。
接下来是初始化部分
第一步
初始化端口号,一般情况是80

AsyncWebServer server(80);    //web端口号 80
const char* PARAM_MESSAGE = "usernum";

第二步
初始化事件回调和注册URL等

ws.onEvent(onEventHandle); // WebSocket事件回调函数server.addHandler(&ws);    // 将WebSocket添加到服务器中server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){   //url 主页面请求request->send(200, "text/html",web_main);});server.on("/post", HTTP_POST, [](AsyncWebServerRequest *request){ //账户密码提交页面请求String message;char resive_name[10]={0},   //存放客户端发来的账号resive_pswd[10]={0};   //存放客户端发来的密码if (request->hasParam("usernum", true)) {  //找usernum这个键strcpy(resive_name,request->getParam("usernum", true)->value().c_str());Serial.printf("usernum: %s\n",resive_name);}if (request->hasParam("pswd", true)){//找pswd这个键// message = request->getParam("pswd", true)->value();strcpy(resive_pswd,request->getParam("pswd", true)->value().c_str());Serial.printf("pswd: %s\n",resive_pswd);}if(strcmp(resive_name,hujingxuan.u_nume)==0){ //得到提交数据之后开始密码校验Serial.printf("已找到用户:%s,开始密码校验...\n",resive_name);if(strcmp(resive_pswd,hujingxuan.u_pawd)==0){Serial.printf("用户密码正确!\n");connet_flag=1;request->send(200, "text/html",web_app);}else{Serial.printf("对不起,您输入的密码有误!\n");}}else{request->send(200, "text/html",web_main);Serial.printf("找不到指定用户,请重新输入!\n");}});server.onNotFound(notFound);server.begin();

需要注意的是
WebSocket事件回调函数为

// WebSocket事件回调函数
uint32_t clientID=0;   //用于存储连接对象的id
void onEventHandle(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len)
{if (type == WS_EVT_CONNECT) // 有客户端建立连接{Serial.printf("ws[%s][%u] connect\n", server->url(), client->id());clientID= client->id();client->printf("Hello Client %u !", client->id()); // 向客户端发送数据client->ping();                                    // 向客户端发送ping}else if (type == WS_EVT_DISCONNECT) // 有客户端断开连接{//Serial.printf("ws[%s][%u] disconnect: %u\n", server->url(), client->id());connet_flag=0;Serial.printf("服务端断开连接\n");}else if (type == WS_EVT_ERROR) // 发生错误{Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t *)arg), (char *)data);}else if (type == WS_EVT_PONG) // 收到客户端对服务器发出的ping进行应答(pong消息){Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len) ? (char *)data : "");}else if (type == WS_EVT_DATA) // 收到来自客户端的数据{AwsFrameInfo *info = (AwsFrameInfo *)arg;Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT) ? "text" : "binary", info->index, info->index + len);data[len] = 0;data_deal((char *)data);Serial.printf("%s\n", (char *)data);}
}

404的回调

void notFound(AsyncWebServerRequest *request) {       //客户端错误请求时调用request->send(404, "text/plain", "Not found");
}

然后是网页的代码
登录HTML页面

const char* web_main="<HTML>"   //登录页面"<HEAD>""    <META charset=\"utf-8\">""    <META NAME=\"GENERATOR\" Content=\"Microsoft Visual Studio\">""    <TITLE>测试网页</TITLE>""</HEAD>""<BODY>""    <p style=\"color:red \"> <font size=\"5\">大棚温室光照登录系统</font>  </p>""    <form action=\"/post\" method=\"post\">""        <p> 账号: <input type=\"number\" name=\"usernum\" placeholder=\"请输入账号\" required=\"required\"/></p>""        <p> 密码: <input type=\"password\" name=\"pswd\" placeholder=\"请输入密码\" required=\"required\"/></p>""        <p><input type=\"submit\"/>      <input type=\"reset\"/>       </p>""    </form>""</BODY>""</HTML>";

控制页面HTML代码

String web_app = String("") +         //控制页面"<!DOCTYPE html>\n"+"<html>\n"+"<head>\n"+"    <meta charset=\"UTF-8\">\n"+"    <title>WebSocket Test</title>\n"+"    <script>\n"+"        var ws;\n"+"        window.onload = function () {\n"+"            if (\"WebSocket\" in window) {\n"+"                ws = new WebSocket(\"ws://\" + window.location.host + \"/\"); // 建立WebSocket连接\n"+"                ws.onopen = function () { // 连接建立成功时触发\n"+"                    document.getElementById(\"info\").innerHTML += \"WebSocket连接成功!\" + \"<br>\";\n"+"                    ws.send(\"connect ok!\"); // 向服务器发送数据\n"+"                };\n"+"                ws.onmessage = function (evt) { // 收到服务器数据时触发\n"+"var obj = JSON.parse(evt.data);\n"+"document.getElementById(\"TemperatureIntensity\").innerHTML = obj.Temperature;\n"+"document.getElementById(\"HumidityIntensity\").innerHTML = obj.Humidity;\n"+"document.getElementById(\"LightIntensity\").innerHTML = obj.light;\n"+"document.getElementById(\"info\").innerHTML += obj.light + obj.Humidity + obj.Temperature+\"<br>\";\n"+"                };\n"+"                ws.onerror = function () { // 发生错误时触发\n"+"                    document.getElementById(\"info\").innerHTML += \"通讯发送错误!\" + \"<br>\";\n"+"                };\n"+"                ws.onclose = function () { // 连接关闭时触发\n"+"                    document.getElementById(\"info\").innerHTML += \"WebSocketTest连接已关闭!\" + \"<br>\";\n"+"                };\n"+"            }\n"+"            else {\n"+"                document.getElementById(\"info\").innerHTML = \"浏览器不支持 WebSocket!\";\n"+"            }\n"+"        };\n"+"        function ledoff() {\n"+"            ws.send(\"led_off\"); // 向服务器发送数据\n"+"        }\n"+"        function ledon() {\n"+"            ws.send(\"led_on\");\n"+"        }\n"+"        function change() {\n"+"            document.getElementById(\"LightIntensity\").innerHTML = \"50\";\n"+"        }\n"+"    </script>\n"+"</head>\n"+"<body>\n"+"    <div id=\"container\" style=\"width: 1000px; height: 1000px;\">\n"+"        <div id=\"header\" style=\"background-color:#FFA500;\">\n"+"            <h1 style=\"margin-bottom: 0; text-align: center;\">智能温室光照补偿控制系统</h1>\n"+"        </div>\n"+"        <div id=\"menu\" style=\"background-color:#FFD700;height:420px;width:300px;float:left;\">\n"+"            <b>菜单</b>\n"+"            <p>\n"+"                打开光照:\n"+"                <button οnclick=\"ledoff()\" id=\"but1\">关灯</button>\n"+"                <button οnclick=\"ledon()\" id=\"but2\">开灯</button>\n"+"            </p>\n"+"            <p>\n"+"                内容\n"+"            </p>\n"+"            <p>\n"+"                当前温室温度:<font style=\"color:green\" size=\"3\" id=\"TemperatureIntensity\">00</font>℃\n"+"            </p>\n"+"            <p>\n"+"                当前温室湿度:<font style=\"color:green\" size=\"3\" id=\"HumidityIntensity\">00</font>RH\n"+"            </p>\n"+"            <p>\n"+"                当前光照强度:<font style=\"color:green\" size=\"3\" id=\"LightIntensity\">84</font>\n"+"            </p>\n"+"            <p>\n"+"                <button οnclick=\"change()\" id=\"but3\">点击改变数值</button>\n"+"            </p>  \n"+"        </div>\n"+"        <div id=\"content\" style=\"background-color:#EEEEEE;height:420px;width:200px;float:right;\">\n"+"            <div id=\"info\">调试内容</div>\n"+"        </div>\n"+"        <div id=\"footer\" style=\"background-color: #FFA500; clear: both; text-align: center;\">\n"+"            版权 © lalala.com\n"+"        </div>\n"+"    </div>\n"+"</body>\n"+"</html\n>";

注意:格式一定要按照这个格式,否则里面的JavaScript代码不会正常执行。别问为什么,问就是坑了我一下午。

在这里主体核心部分已经搭建完成,其余就是一些数据处理的代码和和硬件相关的代码
如果有小伙伴对HTML和JavaScript不是很熟,建议看教程
遇见狂神说 JavaScript他也有相关教程。
在我写这篇文章的时候为止,服务器向客户端推送的数据被我打包成json格式,但是客户端返回目前我只做了简单的命令形式的处理。考虑到系统的拓展性。之后会修改为json格式传输。
这里说明一下使用了cjson这个库来解析和构造json数据。
这部分不再赘述,如果有什么不明白可以去网上查查相关资料,还是很简单的
然后给出全部代码,注释写的非常详细了

#include <Arduino.h>
#include <WiFi.h>       //用于基础WiFi连接
#include <AsyncTCP.h>   //ESPAsyncWebServer.h的前置组件 这个库需要下载组件安装 https://github.com/me-no-dev/ESPAsyncWebServer
#include <ESPAsyncWebServer.h>  //用于websever和webstocket的建立
#include "string.h"         //用于对字符串进行处理
#include <stdlib.h>        //用于整型转字符型
#include <cJson.h>         //用于解析json和构造json数据
#include "DHT.h"DHT DHT11; //实例化一个温湿度对象#define T_S_pin   26
#define led_pin   4
#define ligth_pin 34#define led_on  digitalWrite(led_pin,HIGH)
#define led_off  digitalWrite(led_pin,LOW)typedef struct {             //定义一个用户变量const char* u_nume ;const char* u_pawd ;
}user;
user hujingxuan={     //用户实例化
.u_nume="221300",
.u_pawd="888888"
};AsyncWebServer server(80);    //web端口号 80
const char* PARAM_MESSAGE = "usernum";
char connet_flag=0;//是否建立stocketl连接标志int Humidity,Temperature; //温湿度
static char *json_data; //json数据对象const char* ssid = "DESKTOP";        //wifi密码和名称
const char* password = "11111111";const char* web_main="<HTML>"   //登录页面"<HEAD>""    <META charset=\"utf-8\">""    <META NAME=\"GENERATOR\" Content=\"Microsoft Visual Studio\">""    <TITLE>测试网页</TITLE>""</HEAD>""<BODY>""    <p style=\"color:red \"> <font size=\"5\">大棚温室光照登录系统</font>  </p>""    <form action=\"/post\" method=\"post\">""        <p> 账号: <input type=\"number\" name=\"usernum\" placeholder=\"请输入账号\" required=\"required\"/></p>""        <p> 密码: <input type=\"password\" name=\"pswd\" placeholder=\"请输入密码\" required=\"required\"/></p>""        <p><input type=\"submit\"/>      <input type=\"reset\"/>       </p>""    </form>""</BODY>""</HTML>";
String web_app = String("") +         //控制页面"<!DOCTYPE html>\n"+"<html>\n"+"<head>\n"+"    <meta charset=\"UTF-8\">\n"+"    <title>WebSocket Test</title>\n"+"    <script>\n"+"        var ws;\n"+"        window.onload = function () {\n"+"            if (\"WebSocket\" in window) {\n"+"                ws = new WebSocket(\"ws://\" + window.location.host + \"/\"); // 建立WebSocket连接\n"+"                ws.onopen = function () { // 连接建立成功时触发\n"+"                    document.getElementById(\"info\").innerHTML += \"WebSocket连接成功!\" + \"<br>\";\n"+"                    ws.send(\"connect ok!\"); // 向服务器发送数据\n"+"                };\n"+"                ws.onmessage = function (evt) { // 收到服务器数据时触发\n"+"var obj = JSON.parse(evt.data);\n"+"document.getElementById(\"TemperatureIntensity\").innerHTML = obj.Temperature;\n"+"document.getElementById(\"HumidityIntensity\").innerHTML = obj.Humidity;\n"+"document.getElementById(\"LightIntensity\").innerHTML = obj.light;\n"+"document.getElementById(\"info\").innerHTML += obj.light + obj.Humidity + obj.Temperature+\"<br>\";\n"+"                };\n"+"                ws.onerror = function () { // 发生错误时触发\n"+"                    document.getElementById(\"info\").innerHTML += \"通讯发送错误!\" + \"<br>\";\n"+"                };\n"+"                ws.onclose = function () { // 连接关闭时触发\n"+"                    document.getElementById(\"info\").innerHTML += \"WebSocketTest连接已关闭!\" + \"<br>\";\n"+"                };\n"+"            }\n"+"            else {\n"+"                document.getElementById(\"info\").innerHTML = \"浏览器不支持 WebSocket!\";\n"+"            }\n"+"        };\n"+"        function ledoff() {\n"+"            ws.send(\"led_off\"); // 向服务器发送数据\n"+"        }\n"+"        function ledon() {\n"+"            ws.send(\"led_on\");\n"+"        }\n"+"        function change() {\n"+"            document.getElementById(\"LightIntensity\").innerHTML = \"50\";\n"+"        }\n"+"    </script>\n"+"</head>\n"+"<body>\n"+"    <div id=\"container\" style=\"width: 1000px; height: 1000px;\">\n"+"        <div id=\"header\" style=\"background-color:#FFA500;\">\n"+"            <h1 style=\"margin-bottom: 0; text-align: center;\">智能温室光照补偿控制系统</h1>\n"+"        </div>\n"+"        <div id=\"menu\" style=\"background-color:#FFD700;height:420px;width:300px;float:left;\">\n"+"            <b>菜单</b>\n"+"            <p>\n"+"                打开光照:\n"+"                <button οnclick=\"ledoff()\" id=\"but1\">关灯</button>\n"+"                <button οnclick=\"ledon()\" id=\"but2\">开灯</button>\n"+"            </p>\n"+"            <p>\n"+"                内容\n"+"            </p>\n"+"            <p>\n"+"                当前温室温度:<font style=\"color:green\" size=\"3\" id=\"TemperatureIntensity\">00</font>℃\n"+"            </p>\n"+"            <p>\n"+"                当前温室湿度:<font style=\"color:green\" size=\"3\" id=\"HumidityIntensity\">00</font>RH\n"+"            </p>\n"+"            <p>\n"+"                当前光照强度:<font style=\"color:green\" size=\"3\" id=\"LightIntensity\">84</font>\n"+"            </p>\n"+"            <p>\n"+"                <button οnclick=\"change()\" id=\"but3\">点击改变数值</button>\n"+"            </p>  \n"+"        </div>\n"+"        <div id=\"content\" style=\"background-color:#EEEEEE;height:420px;width:200px;float:right;\">\n"+"            <div id=\"info\">调试内容</div>\n"+"        </div>\n"+"        <div id=\"footer\" style=\"background-color: #FFA500; clear: both; text-align: center;\">\n"+"            版权 © lalala.com\n"+"        </div>\n"+"    </div>\n"+"</body>\n"+"</html\n>";void data_pick()//采集外设数据,并打包成json发送到客户端
{cJSON *TCP = cJSON_CreateObject();                //创建一个对象cJSON_AddNumberToObject(TCP,"light",analogRead(ligth_pin));   //构造json数据cJSON_AddNumberToObject(TCP,"Humidity",Humidity);           //添加整型数字 cJSON_AddNumberToObject(TCP,"Temperature",Temperature);  //添加浮点型数字json_data = cJSON_Print(TCP);             //JSON数据结构转换为JSON字符串}void notFound(AsyncWebServerRequest *request) {       //客户端错误请求时调用request->send(404, "text/plain", "Not found");
}AsyncWebSocket ws("/"); // WebSocket对象,url为/
void data_deal(char* resivedata)//数据处理函数,对客户端发来的数据进行解析,如果执行比较大的程序,比如刷新led建议标记,在主循环处理。
{Serial.printf("这里是数据处理函数%s\n", resivedata);if(strcmp(resivedata,"led_off")==0){led_on;}else if(strcmp(resivedata,"led_on")==0){led_off;}else{Serial.printf("对不起没有找到指令:%s\n", resivedata);}}
// WebSocket事件回调函数
uint32_t clientID=0;   //用于存储连接对象的id
void onEventHandle(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len)
{if (type == WS_EVT_CONNECT) // 有客户端建立连接{Serial.printf("ws[%s][%u] connect\n", server->url(), client->id());clientID= client->id();client->printf("Hello Client %u !", client->id()); // 向客户端发送数据client->ping();                                    // 向客户端发送ping}else if (type == WS_EVT_DISCONNECT) // 有客户端断开连接{//Serial.printf("ws[%s][%u] disconnect: %u\n", server->url(), client->id());connet_flag=0;Serial.printf("服务端断开连接\n");}else if (type == WS_EVT_ERROR) // 发生错误{Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t *)arg), (char *)data);}else if (type == WS_EVT_PONG) // 收到客户端对服务器发出的ping进行应答(pong消息){Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len) ? (char *)data : "");}else if (type == WS_EVT_DATA) // 收到来自客户端的数据{AwsFrameInfo *info = (AwsFrameInfo *)arg;Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT) ? "text" : "binary", info->index, info->index + len);data[len] = 0;data_deal((char *)data);Serial.printf("%s\n", (char *)data);}
}
void tim1Interrupt()
{if(connet_flag)//如果连接打开{data_pick();// Serial.printf("%s\n", json_data);ws.printf(clientID, json_data);//向建立连接的客户端发送信息ws.cleanupClients();     // 关闭过多的WebSocket连接以节省资源} else{// Serial.printf("等待连接建立...\n"); }
}static TimerHandle_t timer1_Handle=NULL;
static TimerHandle_t timer2_Handle=NULL;void timer_callback();
void timer2_callback();
void setup() {Serial.begin(115200);pinMode(led_pin,OUTPUT); //初始化led引脚,并关闭leddigitalWrite(led_pin,HIGH);DHT11.setup(T_S_pin); //初始化温湿度传感器WiFi.mode(WIFI_STA);     //wifi 的打开和连接WiFi.begin(ssid, password);if (WiFi.waitForConnectResult() != WL_CONNECTED) {Serial.printf("WiFi Failed!\n");return;}Serial.print("IP Address: ");Serial.println(WiFi.localIP());   //获取到的ip地址,这个地址之后要显示在屏幕上ws.onEvent(onEventHandle); // WebSocket事件回调函数server.addHandler(&ws);    // 将WebSocket添加到服务器中server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){   //url 主页面请求request->send(200, "text/html",web_main);});server.on("/post", HTTP_POST, [](AsyncWebServerRequest *request){ //账户密码提交页面请求String message;char resive_name[10]={0},   //存放客户端发来的账号resive_pswd[10]={0};   //存放客户端发来的密码if (request->hasParam("usernum", true)) {  //找usernum这个键strcpy(resive_name,request->getParam("usernum", true)->value().c_str());Serial.printf("usernum: %s\n",resive_name);}if (request->hasParam("pswd", true)){//找pswd这个键// message = request->getParam("pswd", true)->value();strcpy(resive_pswd,request->getParam("pswd", true)->value().c_str());Serial.printf("pswd: %s\n",resive_pswd);}if(strcmp(resive_name,hujingxuan.u_nume)==0){ //得到提交数据之后开始密码校验Serial.printf("已找到用户:%s,开始密码校验...\n",resive_name);if(strcmp(resive_pswd,hujingxuan.u_pawd)==0){Serial.printf("用户密码正确!\n");connet_flag=1;request->send(200, "text/html",web_app);}else{Serial.printf("对不起,您输入的密码有误!\n");}}else{request->send(200, "text/html",web_main);Serial.printf("找不到指定用户,请重新输入!\n");}});server.onNotFound(notFound);server.begin();//开启一个freertos定时器,注意,定时器1不能时间间隔太短否则会导致消息堆积,发不出去timer1_Handle=xTimerCreate("timer1_Handle",250,pdTRUE,(void*)1,(TimerCallbackFunction_t )timer_callback);if(timer1_Handle!=NULL){xTimerStart(timer1_Handle,0);}timer2_Handle=xTimerCreate("timer2_Handle",1000,pdTRUE,(void*)2,(TimerCallbackFunction_t )timer2_callback);if(timer2_Handle!=NULL){xTimerStart(timer2_Handle,0);}Serial.printf("初始化结束\n");
}
unsigned char time1_flag=0,time2_flag=0;
void loop() {if(time1_flag){time1_flag=0;tim1Interrupt(); //定时回调}if(time2_flag){time2_flag=0;if(((int)DHT11.getHumidity()<500)&&((int)DHT11.getTemperature()<500))//滤除错误数据{Humidity=(int)DHT11.getHumidity();Temperature=(int)DHT11.getTemperature();Serial.printf("Humidity=%d,Temperature=%d\n",(int)DHT11.getHumidity(),(int)DHT11.getTemperature());}}
}
void timer_callback()//注意,这个函数还是在内部任务调用的,所以不能放太多内容,否则会堆栈溢出
{time1_flag=1;
}
void timer2_callback()
{time2_flag=1;
}

实验现象

实验现象
在最后呢,我想提一下,我只是一个大三学生。如果有什么正确的地方请多多包涵。同时这套系统后期可以拓展的东西很多,比如OTA网页升级程序,这将会大大减少用户的使用难度和维护成本。同时也可以接入互联网进行超远程控制。因为时间有限,没有做这些拓展。有兴趣可以自行设计加入。

基于esp32的物联网设计相关推荐

  1. 【立创EDA开源推荐】09期基于ESP32的物联网时钟

    作者: 立创EDA官方 工程主页链接: https://oshwhub.com/course-examples/wu-lian-wang-shi-zhong 简介: 立创EDA&高校联合实验室 ...

  2. 基于ESP32搭建物联网服务器十三(自已搭建一个MQTT服务器)

    在之前的文章中:ESP32搭建WEB服务器十二(使用MQTT协议与ESP32互动)_你的幻境的博客-CSDN博客 我们已经实现了ESP32通过MQTT协议连接到公共MQTT服务器上,但是公共服务器在稳 ...

  3. 基于ESP32搭建物联网服务器一(AP配网)

    目录 一.WiFi.mode();设置配网模式 二.WiFi.softAP();设置ESP32的WIFI属性 三.WiFi.softAPConfig();设置ESP32的IP,网关,子网掩码,DHCP ...

  4. 基于ESP32 蓝牙游戏手柄设计

    使用 ESP32 并通过 BLE 通信的 DIY 手持游戏手柄 这个项目中使用的东西 硬件组件 esp32        ×    1     ws2812b        ×    6     操纵 ...

  5. 基于ZigBee的物联网毕业论文设计

    概要 今年就要毕业了,已将毕业论文纂写完毕.目前将毕业设计的整体思路与具体实现方案做一个整体汇聚,方便日后查阅学习. 整体思路 首先明确论文攥写的主题是基于ZigBee的物联网设计,准备着手无线传感网 ...

  6. 【物联网初探】- 09 - 基于 ESP32 和微信小程序的土壤湿度监测【完结篇】

    文章目录 1. 硬件.接线.环境配置 2. 项目简介 2.1 初衷 2.2 技术路线 3. 实现方法 3.1 接线及电源选型 3.2 ESP32 端程序 3.2.1 源码 3.2.2 特别说明 3.3 ...

  7. 基于ESP32的蓝牙翻页器设计(论文附调试成功代码!!)

    基于ESP32的蓝牙翻页器设计 目录 基于ESP32的蓝牙翻页器设计 1 摘要 1 1.绪论 2 1.1认识蓝牙 2 1.2研究思路 3 2.软硬件设计 3 2.1中央处理模块------ESP32 ...

  8. 【毕业设计项目】基于ESP32的家庭气象站系统 - stm32 物联网 嵌入式 单片机

    文章目录 1 简介 2 主要器件 引脚连接 3 实现效果 4 部分实现代码 5 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍一个学长做的单片机项目 基于ESP32的家庭气象站系统 大家 ...

  9. 基于ESP32+AMG8833的物联网红外成像测温枪

    esp32_amg8833 介绍 用基于ESP32+amg8833模块开发的红外热成像测温仪,开发板用的是TTGO T-Display ESP32,测温模块用的是AMG8833 IR 8x8红外热像传 ...

  10. 基于机智云物联网平台的智能远程植物养护装置设计与实现

    摘要: 设计一种智能远程植物养护装置,采用STM32F103单片机为控制核心,对植物所处环境温度和土壤湿度进行检测,并根据用户所设置的适合植物生长的湿度参数,控制水泵的开关,通过机智云平台在手机APP ...

最新文章

  1. 如何从路由器中查找ADSL帐号 [2007年4月13日]
  2. java有无参数求长方形的周长面积_用java面向对象思想编程求长方形的周长和面积...
  3. string 日期比较_java8-新的日期API
  4. python 显示RGB颜色
  5. 在创建的Silverlight Control中使用图片
  6. 黑客入侵交警计算机系统删交通违法记录牟利
  7. Python刷题-6
  8. java unexpected type_意外类型需要变量找到值(Unexpected type required variable found value)...
  9. 再说人行分数解读分的作用
  10. python列表的排序方法_Python 列表 sort() 方法
  11. 在对比中理解 Node
  12. Linux命令之乐--iconv
  13. Oracle 恢复删除的表
  14. abb工业机器人电压不稳_ABB工业机器人常见故障及解决方法,想要提升自己的就赶紧保存下来吧...
  15. [OpenStack] OpenStack Essex - Glance api 的实验(curl)
  16. Delphi2007使用心得
  17. 用html设计前台界面,UI设计系列:WEB前端界面设计
  18. 2010年06期《程序员》配套源码及相关链接
  19. java 库知乎_基于原生Java API爬取最新版本知乎百万用户数据
  20. 高德地图API之定位API

热门文章

  1. 一、最简单的爬虫(python3 爬虫小白系列文章)
  2. 用Python写游戏脚本原来这么简单
  3. 打印机可以打印不能扫描怎么弄_惠普打印机可以打印但无法扫描的解决办法
  4. hpsocket java代码_java版本调用HP-Socket服务端代码
  5. 光谱共焦的测量原理及厚度测量模式
  6. 输入数字怎么变成大写python_用Python将数字转换为中文大写
  7. Digester简介和使用
  8. Jmeter使用CSV文件读取大量测试数据
  9. Java项目:Springboot校园报修管理系统
  10. 微信小程序如何搭建自己的后台(超详细,超完整)(上线必备)!!!