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 Found\n\n";
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>
浙公网安备 33010602011771号