立创开源|esp8266三路继电器
时间:2022-09-15 09:00:00
简介:ESP支持局域网远程控制的8266三路继电器开关,可自行映射到公网。不依赖第三方平台
ESP支持局域网远程控制的8266三路继电器开关,可自行映射到公网。不依赖第三方平台
主控使用ESP12F,松乐5用于继电器v继电器、板载电源指示灯、三路继电器指示灯、RST按钮和用户按钮,两个用户LED灯
板载220V转5V方便直接接入电源的变压模块。
该项目已在立创EDA同时将演示视频上传到开源工程,开源链接:esp8266三路继电器 - 嘉立创EDA开源硬件平台
打样可以直接修改
代码如下
/********************************************************************** 项目名称/Project : 局域网开关神器 程序目的/Purpose : 使用ESP8266建立基本服务器,用户可以通过浏览器访问8266建立的网页,并控制继电器打开和关闭开关。 ***********************************************************************/ #define KEY 14 #define CH1 4 #define CH2 5 #define CH3 16 #include // 本程序使用 ESP8266WiFi库 #include // ESP8266WebServer库 #include #include "Config.h"//其他配置信息 //=================配置网络信息=====================// const char* ssid = "Xiaomi_4A45"; // 连接WiFi名称需要连接WiFi在引号中填写名称 const char* password = "12345789"; // 连接WiFi需要连接密码WiFi在引号中填写密码 //===============为方便访问,配置为固定IP,需要根据自己的路由器进行调整===================// IPAddress local_IP(192,168,2,12); // 设置IP IPAddress gateway(192,168,2, 1); // 设置网关 IPAddress subnet(255, 255, 255, 0); // 设置子网掩码 IPAddress dns(192,168,2,1); // 设置局域网DNS ESP8266WebServer esp8266_server(80);// 为响应建立网络服务器对象HTTP请求。监控端口(80) bool CH1_Status = 0; bool CH2_Status = 0; bool CH3_Status = 0; void setup(void) { Serial.begin(115200); // 1152 InitPort() // 设置网络参数 if (!WiFi.config(local_IP, gateway, subnet, dns)) { Serial.println("Failed to Config ESP8266 IP"); } WiFi.begin(ssid, password); // 启动网络连接 Serial.print("Connecting to "); // 串口监视器输出网络连接信息 Serial.print(ssid); Serial.println(" ..."); // 告知用户控制器正在尝试WiFi连接 int i = 0; // 本节目语句用于检查WiFi连接是否成功 while (WiFi.status() != WL_CONNECTED) // WiFi.status()函数的返回值是由WiFi连接状态所决定的。 { delay(1000); // 如果WiFi如果连接成功,返回值为WL_CONNECTED Serial.print(i ); Serial.print(' '); // 此处通过While每秒检查一次循环WiFi.status()函数返回值 } // 同时,通过串口监视器输出连接时间读秒。 // 读秒是通过变量i每隔一秒自加1来实现的。 // WiFi连接成功后,信息将通过串口监视器输出连接 Serial.println('\n'); Serial.print("Connected to "); Serial.println(WiFi.SSID()); // 通过串口监视器输出连接WiFi名称 Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); // 控制板通过串口监控器输出IP if(SPIFFS.begin()) // 启动闪存文件系统 { Serial.println("SPIFFS Started"); } else { Serial.println("SPIFFS Failed to Start"); } esp8266_server.on("/setCH1", HandleSwitch1); esp8266_server.on("/setCH2", HandleSwitch2); esp8266_server.on("/setCH3", HandleSwitch3); esp8266_server.onNotFound(HandleUserRequest); // 处理其它网络请求 esp8266_server.begin(); // 启动网站服务 Serial.println("Server Started"); } // 设置处理404情况的函数handleNotFound' void handleNotFound() { esp8266_server.send(404, "text/plain", "404: Not found"); // 发送"404: Not found" } void loop(void) { esp8266_server.handleClient()//监控网络请求 } void HandleSwitch1(void) //回调函数 { String CH1_State = esp8266_server.arg("CH1state"); //获取参数 Serial.println(CH1_State); esp8266_server.send(200, "text/plain", "OK"); if(CH1_State == "1") { CH1_Status = 1; digitalWrite(CH1,HIGH); //LED ON } else { CH1_Status = 0; digitalWrite(CH1,LOW); //LED ON } } void HandleSwitch2(void) //回调函数 { String CH2_State = esp8266_server.arg("CH2state"); //获取参数 Serial.println(CH2_State); esp8266_server.send(200, "text/plain", "OK"); if(CH2_State == "1") { CH2_Status = 1; digitalWrite(CH2,HIGH); //LED ON } else { CH2_Status = 0; digitalWrite(CH2,LOW); //LED ON } } void HandleSwitch3(void) //回调函数 { String CH3_State = esp8266_server.arg("CH3state"); //获取参数 Serial.println(CH3_State); esp8266_server.send(200, "text/plain", "OK"); if(CH3_State == "1") { CH3_Status = 1; digitalWrite(CH3,HIGH); //LED ON } else { CH3_Status = 0; digitalWrite(CH3,LOW); //LED ON } } // 处理用户浏览器HTTP访问 void HandleUserRequest(void) { String reqResource = esp8266_server.uri(); // 获取用户要求的资源(Request Resource) Serial.print("reqResource: "); Serial.println(reqResource); bool fileReadOK = handleFileRead(reqResource); // 通过handleFileRead函数处理用户要求资源 // 如果在SPIFFS找不到用户访问的资源,则回复404 (Not ound)
if(!fileReadOK)
{
esp8266_server.send(404, "text/plain", "404 Not Found");
}
}
bool handleFileRead(String resource) //处理浏览器HTTP访问
{
if(resource.endsWith("/")) // 如果访问地址以"/"为结尾
{
resource = "/index.html"; // 则将访问地址修改为/index.html便于SPIFFS访问
}
// if (resource == "/index.html" && !CH1_Status){
// resource = "/index2.html";
// }
if(resource == "/index.html"){
if(CH1_Status && CH2_Status && CH3_Status) resource = "/index111.html";
if(!CH1_Status && CH2_Status && CH3_Status) resource = "/index011.html";
if(CH1_Status && !CH2_Status && CH3_Status) resource = "/index101.html";
if(CH1_Status && CH2_Status && !CH3_Status) resource = "/index110.html";
if(CH1_Status && !CH2_Status && !CH3_Status) resource = "/index100.html";
if(!CH1_Status && CH2_Status && !CH3_Status) resource = "/index010.html";
if(!CH1_Status && !CH2_Status && CH3_Status) resource = "/index001.html";
if(!CH1_Status && !CH2_Status && !CH3_Status) resource = "/index000.html";
}
String contentType = getContentType(resource); // 获取文件类型
if (SPIFFS.exists(resource)) // 如果访问的文件可以在SPIFFS中找到
{
File file = SPIFFS.open(resource, "r"); // 则尝试打开该文件
esp8266_server.streamFile(file, contentType); // 并且将该文件返回给浏览器
file.close(); // 并且关闭文件
return true; // 返回true
}
return false; // 如果文件未找到,则返回false
}
// 获取文件类型
String getContentType(String filename){
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";
}
/**************************************************
* 函数名称:InitPort
* 函数功能:初始化端口
* 参数说明:无
**************************************************/
void InitPort(void)
{
pinMode(LED_BUILTIN, OUTPUT); // 初始化板载LED引脚为OUTPUT
digitalWrite(LED_BUILTIN, HIGH);// 初始化LED引脚状态
pinMode(KEY, INPUT); // 初始按键为INPUT
pinMode(CH1, OUTPUT); // 初始化继电器控制为output
digitalWrite(CH1, LOW);// 初始化继电器引脚状态
pinMode(CH2, OUTPUT); // 初始化继电器控制为output
digitalWrite(CH2, LOW);// 初始化继电器引脚状态
pinMode(CH3, OUTPUT); // 初始化继电器控制为output
digitalWrite(CH3, LOW);// 初始化继电器引脚状态
}