资讯详情

立创开源|esp8266三路继电器

简介: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.h>        // 本程序使用 ESP8266WiFi库 #include <ESP8266WebServer.h>   //  ESP8266WebServer库 #include <FS.h>  #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);// 初始化继电器引脚状态
}

 

标签: 101继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台