脚本宝典收集整理的这篇文章主要介绍了ESP32开发(3)红外学习 网页 文件 多串口,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
http://4490.replace.favo.gengnie.com/
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.50122e8dJH3bCJ&id=547198899364&_u=51qf7bf5dd52
有三种方法下载
1、用g0口接地。
2、下载时,一直按boot健。
3、同时按rst健与boot
上传程序
上传文件
程序串口
NodeMCU-32S 开发板左右各19个引脚,共38个,下图中1Z实验室为大家对NodeMCU-32S的各个引脚进行了详细的标注。
https://www.cnblogs.com/gooutlook/p/11028641.html
链接:https://pan.baidu.com/s/1fjk0qiudRPKPxB-7SqFSAQ?pwd=fdn4 提取码:fdn4 --来自百度网盘超级会员V4的分享
代码
//#include <SoftwareSerial.h> //SoftwareSerial portOne(9, 10);// rx tx #define portOne Serial2 #include "FS.h" #include "SPIFFS.h" #include <WiFi.h> #include <WebServer.h> WebServer server (80); //连接或者要辐射的wifi信息 //String wifiName = ("ESPWIFI_"+(String)ESP.getChipId()); // 2 设置WIFI名称 //String wifiName = "love"; // 2 设置WIFI名称 //String password ="love123456"; // 需要连接的wifi热点密码 const char *wifiName ="love"; // 2 设置WIFI名称 const char *password ="love123456"; // 需要连接的wifi热点密码 //登录账号密码 String LoginName="admin"; String LoginPwd="admin"; //工作模式 String work_mode="STA";// AP 自己辐射wifi STA 链接wifi //本机ip 会自动修改 String LocaIP="192.168.1.1";//跳转使用 int CanPost=1;//记录本次请求是否处理完毕 /** * 网页系统API * 根据文件后缀获取html协议的返回内容类型 */ String getContentType(String filename){ if(server.hasArg("download")) return "application/octet-stream"; else if(filename.endsWith(".htm")) return "text/html"; else if(filename.endsWith(".html")) return "text/html"; else if(filename.endsWith(".css")) return "text/css"; else if(filename.endsWith(".js")) return "application/javascript"; else if(filename.endsWith(".png")) return "image/png"; else if(filename.endsWith(".gif")) return "image/gif"; else if(filename.endsWith(".jpg")) return "image/jpeg"; else if(filename.endsWith(".ico")) return "image/x-icon"; else if(filename.endsWith(".xml")) return "text/xml"; else if(filename.endsWith(".pdf")) return "application/x-pdf"; else if(filename.endsWith(".zip")) return "application/x-zip"; else if(filename.endsWith(".gz")) return "application/x-gzip"; return "text/plain"; } /* NotFound处理 * 用于处理没有注册的请求地址 */ void handleNotFound() { String path = server.uri(); Serial.print("load url:"); Serial.println(path); String contentType = getContentType(path); String pathWithGz = path + ".gz"; if(SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)){ if(SPIFFS.exists(pathWithGz)) path += ".gz"; File file = SPIFFS.open(path, "r"); size_t sent = server.streamFile(file, contentType); file.close(); return; } String message = "File Not Foundnn"; message += "URI: "; message += server.uri(); message += "nMethod: "; message += ( server.method() == HTTP_GET ) ? "GET" : "POST"; message += "nArguments: "; message += server.args(); message += "n"; for ( uint8_t i = 0; i < server.args(); i++ ) { message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "n"; } server.send ( 404, "text/plain", message ); } /* 引脚更改处理 * 访问地址为htp://192.162.xxx.xxx/ 返回主页面 */ void handleMain() { /* 返回信息给浏览器(状态码,Content-type, 内容) * 这里是访问当前设备ip直接返回一个String */ Serial.print("handleMain"); File file = SPIFFS.open("/index.html", "r"); size_t sent = server.streamFile(file, "text/html"); file.close(); return; } int leran_state=0; void handle_PinControl_DoMySelf( String action){ if (action=="learn_on"){ //学习模式按键 leran_state=1; server.send ( 200, "text/html", "进入学习模式n 请在在网页按下需要学习的按键后,接收器蓝灯常亮"); return; // 返回数据 } else if (action=="learn_off"){// 控制模式按键 leran_state=0; uint8_t buffer[1]; buffer[0] = 0xe2; portOne.write(buffer,1); //退出学习模式 server.send ( 200, "text/html", ",进入正常模式n 接收器蓝灯熄灭"); return; // 返回数据 } else if (action=="open_on"){// 控制模式按键 if (leran_state==0){ uint8_t buffer[2]; buffer[0] = 0xe3; buffer[1] = 0x01; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据 } else if (leran_state==1){ uint8_t buffer[2]; buffer[0] = 0xe0; buffer[1] = 0x01; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据 } } else if (action=="open_off"){// 控制模式按键 if (leran_state==0){ uint8_t buffer[2]; buffer[0] = 0xe3; buffer[1] = 0x02; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据 } else if (leran_state==1){ uint8_t buffer[2]; buffer[0] = 0xe0; buffer[1] = 0x02; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据 } } else if (action=="cold_on"){// 控制模式按键 if (leran_state==0){ uint8_t buffer[2]; buffer[0] = 0xe3; buffer[1] = 0x03; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据 } else if (leran_state==1){ uint8_t buffer[2]; buffer[0] = 0xe0; buffer[1] = 0x03; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据 } } else if (action=="hot_on"){// 控制模式按键 if (leran_state==0){ uint8_t buffer[2]; buffer[0] = 0xe3; buffer[1] = 0x04; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据 } else if (leran_state==1){ uint8_t buffer[2]; buffer[0] = 0xe0; buffer[1] = 0x04; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据 } } else if (action=="20"){// 控制模式按键 if (leran_state==0){ uint8_t buffer[2]; buffer[0] = 0xe3; buffer[1] = 0x05; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据 } else if (leran_state==1){ uint8_t buffer[2]; buffer[0] = 0xe0; buffer[1] = 0x05; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据 } } else if (action=="24"){// 控制模式按键 if (leran_state==0){ uint8_t buffer[2]; buffer[0] = 0xe3; buffer[1] = 0x06; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据 } else if (leran_state==1){ uint8_t buffer[2]; buffer[0] = 0xe0; buffer[1] = 0x06; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据 } } else if (action=="27"){// 控制模式按键 if (leran_state==0){ uint8_t buffer[2]; buffer[0] = 0xe3; buffer[1] = 0x07; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据 } else if (leran_state==1){ uint8_t buffer[2]; buffer[0] = 0xe0; buffer[1] = 0x07; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器按对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据 } } else if (action=="30"){// 控制模式按键 if (leran_state==0){ uint8_t buffer[2]; buffer[0] = 0xe3; buffer[1] = 0x08; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据 } else if (leran_state==1){ uint8_t buffer[2]; buffer[0] = 0xe0; buffer[1] = 0x08; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器按对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据 } } else if (action=="flysx_on"){// 控制模式按键 if (leran_state==0){ uint8_t buffer[2]; buffer[0] = 0xe3; buffer[1] = 0x07; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据 } else if (leran_state==1){ uint8_t buffer[2]; buffer[0] = 0xe0; buffer[1] = 0x07; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器按对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据 } } else if (action=="flysx_off"){// 控制模式按键 if (leran_state==0){ uint8_t buffer[2]; buffer[0] = 0xe3; buffer[1] = 0x11; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据 } else if (leran_state==1){ uint8_t buffer[2]; buffer[0] = 0xe0; buffer[1] = 0x11; portOne.write(buffer, 2); server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器按对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据 } } } String REC_comdata="{"turang":0,"light":0,"tem":0,"AlramMsg":"工作中..."}"; // 控制页面请求函数处理 ESP数据给单片机,由单片机处理后返回数据 ///Get_SensorData?action=all&sensor=all void handle_PinControl() { if(CanPost==1) { CanPost=0; } else { server.send ( 200, "text/html", REC_comdata); return; } if(server.hasArg("action") && server.hasArg("sensor")) { // 请求中是否包含有a的参数 String action = server.arg("action"); // 获得动作 String sensor = server.arg("sensor"); // 获得传感器型号 String ShowMsg =String()+"sensor-"+ sensor+"-action-"+action+";"; Serial.println (ShowMsg); //电脑串口打印 //根据传感器型号进行控制 //本机处理 if(sensor=="sensor_airconditin"){ handle_PinControl_DoMySelf(action);//调用本机函数处理 server.send ( 200, "text/html", "消息本机处理:"+ShowMsg); // 返回数据 CanPost=1; return; }//转发单片机处理 else{ //其他设备控制 //消息打包生成 ShowMsg =String()+ sensor+"-"+action+";"; //转发给单片机处理 portOne.print(ShowMsg); //等待单片机回应消息 //String REC_comdata; if (portOne.available()){ //发送端是加了换行符发送的 不加 n 会导致连续发送两行积累 所以解析段必须去除 n 字符 REC_comdata =portOne.readStringUntil(';'); //REC_comdata=REC_comdata.replace("n",""); Serial.print("Rec_arduino:");Serial.println(REC_comdata); } server.send ( 200, "text/html", REC_comdata); CanPost=1; return; } } else{ server.send ( 200, "text/html", "action no found"); } } //用来跳转页面 String GoUrl(String urlName){ String ALLHtml=String("")+ "<HTML>"+ "<HEAD>"+ "<meta HTTP-EQUIV='REFRESH' content='0; url="+urlName+"'/>"+ "<TITLE>Success</TITLE>"+ "</HEAD>"+ "<BODY>"+ "Success"+ "</BODY>"+ "</HTML>"; return ALLHtml; } void handle_Login(){ if(server.hasArg("config")) { // 请求中是否包含有a的参数 String config = server.arg("config"); // 获得a参数的值 String RecLoginName; String RecLoginPwd; if(config == "on") { // a=on if(server.hasArg("name")) { // 请求中是否包含有a的参数 RecLoginName = server.arg("name"); // 获得a参数的值 } else{ String backtxt= "请输入用户名" ; server.send ( 200, "text/html", backtxt); return; } if(server.hasArg("pwd")) { // 请求中是否包含有a的参数 RecLoginPwd = server.arg("pwd"); // 获得a参数的值 } if(RecLoginName==LoginName && RecLoginPwd==LoginPwd){ String backtxt= "成功登录! 名称:"+ RecLoginName +" 密码:"+ RecLoginPwd ; Serial.print("handleMain"); backtxt=GoUrl("http://"+LocaIP+"/index1_control.html"); server.send ( 200, "text/html", backtxt); return; } else{ String backtxt= "失败登录,账号和密码错误!n 名称:"+ RecLoginName +" 密码:"+ RecLoginPwd ; server.send ( 200, "text/html", backtxt); return; } } server.send ( 200, "text/html", "unknown action"); return; } server.send ( 200, "text/html", "action no found"); } //工作模式1 自身建立wifi等待连接 void Int_SetWIfi(String wifiName_,String password_){ //LocaIP="192.168.1.1"; IPAddress softLocal(192,168,1,1); // 1 设置内网WIFI IP地址 IPAddress softGateway(192,168,1,1); IPAddress softSubnet(255,255,255,0); WiFi.softAPConfig(softLocal, softGateway, softSubnet); //String wifiName = ("ESPWIFI_"+(String)ESP.getChipId()); // 2 设置WIFI名称 //const char *softAPName = wifiName_.c_str(); WiFi.softAP(wifiName, password); // 3创建wifi 名称 +密码 adminadmin IPAddress myIP = WiFi.softAPIP(); // 4输出创建的WIFI IP地址 Serial.print("AP IP address: "); LocaIP=myIP.toString().c_str(); Serial.println(LocaIP); Serial.print("softAPName: "); // 5输出WIFI 名称 Serial.println(wifiName); } //工作模式2 连接到wifi 获取ip访问 void Int_wificonnect(String wifiName,String password){ int connectCount = 0; WiFi.begin ( wifiName.c_str(), password.c_str() ); while ( WiFi.status() != WL_CONNECTED ) { delay ( 1000 ); Serial.print ( "." ); if(connectCount > 30) { Serial.println( "Connect fail!" ); break; } connectCount += 1; } if(WiFi.status() == WL_CONNECTED) { Serial.println ( "" ); Serial.print ( "Connected to " ); Serial.println ( wifiName ); Serial.print ( "IP address: " ); //Serial.println ( WiFi.localIP() ); LocaIP=WiFi.localIP().toString().c_str(); Serial.println ( LocaIP ); connectCount = 0; } } void setup() { // 日常初始化网络 pinMode(2, OUTPUT); Serial.begin ( 9600 ); //portOne.begin(9600);//软串口1 单片机之间过高导致解析出错 portOne.begin(115200);//软串口2 红外模块串口通信默认115200 SPIFFS.begin(); if(work_mode=="STA"){ Int_wificonnect(wifiName,password); } else{ Int_SetWIfi(wifiName,password); } server.on ("/", handleMain); // 绑定‘/’地址到handleMain方法处理 默认返回登陆网页 server.on ("/login", HTTP_GET, handle_Login); // 处理登陆请求是否正确,然后跳转控制页面 server.on ("/Control_SensorPin", HTTP_GET, handle_PinControl); //处理控制页面的按键和滑动条请求 server.onNotFound ( handleNotFound ); // NotFound处理 默认会返回登陆页面 server.begin(); Serial.println ( "HTTP server started" ); } void loop() { /* 循环处理,因为ESP8266的自带的中断已经被系统占用, * 只能用过循环的方式来处理网络请求 */ server.handleClient(); }
index1_control.html
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!---网页预览小标题-----> <title>网页配置信息</title> <link href="css/bootstrap.min.css" rel="stylesheet"> </head> <script src="js/jquery.min.js"></script> <script src="js/bootstrap.min.js"></script> <body> <nav class="navbar navbar-inverse"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <!---网页黑色工具栏标题-----> <a class="navbar-brand" href="#">智能遥控器</a> </div> </div> </nav> <div class="container"> <ul class="nav nav-tabs"> <!---网页白色工具栏小标题-----> <li role="presentation" class="active"><a href="index.html">主页</a></li> <li role="presentation" class="active"><a href="index1_control.html">设备控制</a></li> </ul> <div class="starter-template"> <h1 style="color:red;">空调按键控制</h1> <button onclick='setPinValue("sensor_airconditin","open_on")' >打开空调</button> <button onclick='setPinValue("sensor_airconditin","open_off")' >关闭空调</button> </br> </br> <button onclick='setPinValue("sensor_airconditin","cold_on")' >制冷模式</button> <button onclick='setPinValue("sensor_airconditin","hot_on")' >制热模式</button> </br> </br> <button onclick='setPinValue("sensor_airconditin","flysx_on")' >上下扫风打开</button> <button onclick='setPinValue("sensor_airconditin","flysx_off")' >上下扫风关闭</button> </br> </br> <button onclick='setPinValue("sensor_airconditin","20")' >20度</button> <button onclick='setPinValue("sensor_airconditin","24")' >24度</button> <button onclick='setPinValue("sensor_airconditin","27")' >27度</button> <button onclick='setPinValue("sensor_airconditin","30")' >30度</button> </br> </br> <h1 style="color:red;">学习控制</h1> <button onclick='setPinValue("sensor_airconditin","learn_on")' >开始学习</button> <button onclick='setPinValue("sensor_airconditin","learn_off")' >关闭学习</button> <p>按键状态消息: <span id="txtState"></span></p> <h1 style="color:red;">学习模式说明</h1> <p> 1网页按下“开始学习”按键</p> <p> 2在提示语为学习模式前提下,按下要学习的按键,例如按下“打开空调”按键。 可以看到红外模块蓝灯常亮。 </p> <p> 3拿着遥控器对准有4个红外头的红外模块,距离5-10cm,不要有其他干扰和红外设备干扰。确保遥控器显示屏显示处于关闭状态下,按一下开关键。 </p> <p> 4红外头蓝灯关闭,代表学习成功。自动切回控制模式</p> </div> </div> <script type="text/javascript"> // 按键发送请求 输入 1传感器名字 2要调整的数值 function setPinValue(sensor_value,action_value) { alert(sensor_value+"按键点击!"); var xmlhttp; if (sensor_value.length==0 && action_value.length==0) { document.getElementById("txtState").innerHTML="请点击正确按键!"; return; } if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码 xmlhttp=new XMLHttpRequest(); } else { // IE6, IE5 浏览器执行代码 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState==4 && xmlhttp.status==200){ //alert(xmlhttp.responseText); //alert("操作成功"); document.getElementById("txtState").innerHTML = xmlhttp.responseText; } } var requestString = "/Control_SensorPin?action=" + action_value + "&sensor="+sensor_value; xmlhttp.open("GET", requestString, true); xmlhttp.send(null); } </script> </body> </html>
以上是脚本宝典为你收集整理的ESP32开发(3)红外学习 网页 文件 多串口全部内容,希望文章能够帮你解决ESP32开发(3)红外学习 网页 文件 多串口所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。