esp8266三路继电器

简介:ESP8266三路继电器开关,支持局域网远程控制,可自行映射到公网。不依赖第三方平台

ESP8266三路继电器开关,支持局域网远程控制,可自行映射到公网。不依赖第三方平台

主控使用ESP12F,继电器使用松乐5v继电器,板载电源指示灯,三路继电器指示灯,RST按键和用户按键,两个用户LED灯

板载220V转5V变压模块,方便直接接入电源。

esp8266三路继电器_第1张图片

esp8266三路继电器_第2张图片

该工程已在立创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);   // 启动串口通讯波特率115200

  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 Found)
  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);// 初始化继电器引脚状态
}

你可能感兴趣的:(ESP8266,嵌入式硬件)