ESP8266远程控制台灯

硬件

micro USB

USB母座

继电器

电阻电容若干

ESP8266-12F

CH340C

硬件电路

USB转UART一键下载电路

CH340C的电路设计

5V转3.3V电路(降压、供电)

5V转3.3V

ESP8266-12F主控电路

最小系统

key电路

手动复位等,万一自动下载不工作就靠这个

继电器电路

此处设计为了给USB供电充足,避免供电不足灯频闪,加了个电容,利用电容充放电来提供充足电压(这是我个人的想法,不知正确否,实际测试过才行,也欢迎各位读者批评指正)


继电器电路

总电路原理图

总原理图
PCB 3D效果图

2020.8.28翻车部分

  板子到了焊接,第一块板在所有焊接完成后,发现CH340C的芯片有问题。早上单独焊接了烧写的电路CH340C,在新版上的烧写电路是没问题的,电脑也能成功识别
  由于过于自信,没有多买元件,使得第一板哪里有错误难以检查,而且没有好好核对原理图,买少了元件导致没得焊三个电阻,虽然有最小系统,但是烧录固件ESP12F呈现了十分奇怪的一直闪灯,但不走进程的状态

左边为焊好的板,由于检查到CH340C的损坏所以把它焊下来了。右边为对比检测,下载电路是没问题的

  更多分析可以观看B站同步分享的视频
B站同步的分析视频

2020.8.31成功控制台灯

B站观看效果点击这里

通过自己写的APP点亮台灯图片

 自己设计的这块板子理论上能够控制所有采用USB 5V供电的设备

硬件代码部分

  1. 先为ESP8266-12F刷入固件(可先刷AT固件,接着刷入nodemcu固件,避免出现错误)

  2. 接着写代码,可以用esplorer用lua写代码,或者用arduinoIDE用C语言写代码,本人用C语言比较多,且用arduinoIDE比较多因此选择arduinoIDE

代码思路,先连接WIFI,连上网后连上物联网平台(这里我使用贝壳物联,进行内网穿透,使得外网发信息能够收到),接着写控制代码(这里贝壳物联有demo,再对demo进行修改)

/*
    此文件需安装Arduino esp8266开发环境支持,环境搭建参见:http://www.bigiot.net/talk/237.html
    本程序可以用来控制两路继电器
    ESP8266烧入此程序直接,使用高低电频控制光耦继电器来控制电灯
    我的继电器默认高电频开启,所以在初始化时都初始化为低电平,play开启D5,stop关闭D5.ESP8266上的灯作为提示灯
    代码基于https://github.com/bigiot/bigiotArduino/blob/master/examples/ESP8266/kaiguan/kaiguan.ino
    上的代码进行调整,此代码可以直接烧入到nodemcu模块,分享代码希望对大家有帮助(2020.9.7)
*/

#include <ESP8266WiFi.h>
#include <aJSON.h>

//=============  此处必须修该============
String DEVICEID="***"; // 你的设备编号   ==
String  APIKEY = "***"; // 设备密码==//贝壳物联申请一下
//=======================================
unsigned long lastCheckInTime = 0; //记录上次报到时间
const unsigned long postingInterval = 40000; // 每隔40秒向服务器报到一次

const char* ssid     = "***";//无线名称
const char* password = "***";//无线密码

const char* host = "www.bigiot.net";
const int httpPort = 8181;

int ELed=D4;

int SW=D5;
int SW1=D6;
//int arr_len = sizeof(pins)/sizeof(pins[0]);

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  WiFi.begin(ssid, password);
  //默认输出关闭电频
  pinMode(ELed,OUTPUT);
  pinMode(SW,OUTPUT);
  pinMode(SW1,OUTPUT);
  digitalWrite(ELed,HIGH);
  digitalWrite(SW,LOW);
  digitalWrite(SW1,LOW);

  
}

WiFiClient client;

void loop() {

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }

  // Use WiFiClient class to create TCP connections
  if (!client.connected()) {
    if (!client.connect(host, httpPort)) {
      Serial.println("connection failed");
      delay(5000);
      return;
    }
  }

  if(millis() - lastCheckInTime > postingInterval || lastCheckInTime==0) {
    checkIn();
  }
  
  // Read all the lines of the reply from server and print them to Serial
  if (client.available()) {
    String inputString = client.readStringUntil('\n');
    inputString.trim();
    Serial.println(inputString);
    int len = inputString.length()+1;
    if(inputString.startsWith("{") && inputString.endsWith("}")){
      char jsonString[len];
      inputString.toCharArray(jsonString,len);
      aJsonObject *msg = aJson.parse(jsonString);
      processMessage(msg);
      aJson.deleteItem(msg);          
    }
  }
}

void processMessage(aJsonObject *msg){
  aJsonObject* method = aJson.getObjectItem(msg, "M");
  aJsonObject* content = aJson.getObjectItem(msg, "C");     
  aJsonObject* client_id = aJson.getObjectItem(msg, "ID");
  if (!method) {
    return;
  }
    String M = method->valuestring;
    if(M == "say"){
      String C = content->valuestring;
      String F_C_ID = client_id->valuestring;
      if(C == "sw1"){

        digitalWrite(ELed,LOW); //ESP8266上的灯亮
        digitalWrite(SW,HIGH);//D5口通电
        sayToClient(F_C_ID,"LED All on!");    
      }else if(C == "stop1"){

        digitalWrite(ELed,HIGH);//ESP8266上的灯灭
        digitalWrite(SW,LOW);//D5口断电
        sayToClient(F_C_ID,"LED All off!"); //贝壳平台可以看到这句提示   
      }else if(C=="sw2"){
         digitalWrite(ELed,LOW);
        digitalWrite(SW1,HIGH);//D6通电
        sayToClient(F_C_ID,"SW2 ON!");
        }else if(C=="stop2"){
         digitalWrite(ELed,HIGH);
        digitalWrite(SW1,LOW);//D6断电
        sayToClient(F_C_ID,"SW2 OFF!");
        }
        

    }
}

void checkIn() {
    String msg = "{\"M\":\"checkin\",\"ID\":\"" + DEVICEID + "\",\"K\":\"" + APIKEY + "\"}\n";
    client.print(msg);
    lastCheckInTime = millis(); 
}

void sayToClient(String client_id, String content){
  String msg = "{\"M\":\"say\",\"ID\":\"" + client_id + "\",\"C\":\"" + content + "\"}\n";
  client.print(msg);
  lastCheckInTime = millis();
}

控制软件

自己开发个app或者使用贝壳物联提供的app
这里我用HbuilderX自己开发的app,5+app。简单来说是网站式的app
参考代码部分:

//2020.9.15更新
<!DOCTYPE html>
<html >
<head >
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <title></title>
    <script src="js/mui.min.js"></script>
    <link rel="stylesheet" type="text/css" href="css/1.css"/>
    <link href="css/mui.min.css" rel="stylesheet"/>
    <script type="text/javascript" charset="utf-8">
        mui.init();
    </script>
</head>

<body>
<div class="abg">//这里class是自己写的一个背景图片css样式
    <br>
    <div style="margin: auto;text-align: center;font-size: x-large;color: white;font:;"><label>宿舍台灯控制</label></div>
    
    
            <br>
            <div class="bod">
            <div style="display: flex;color: white;"><label>开关1:</label>
                <div class="mui-switch " id="mySwitch">
                    <div class="mui-switch-handle"></div>
                </div>
                <div style="display: flex; color: white;"><label>&nbsp;&nbsp;开关2:</label>
                    <div class="mui-switch " id="mySwitch1">
                        <div class="mui-switch-handle"></div>
                    </div>
                </div>
            </div>
            
    
            
            
</div>
    <script type="text/javascript">
            var ws = new WebSocket("ws://www.bigiot.net:8383");
            //var lb = document.getElementById("lb2")
            ws.onopen = function() {
                
                mui.toast("连接成功")//软件界面显示连接成功
            };
            ws.onmessage = function(evt) {
                var received_msg = evt.data;
                //lb.innerText = received_msg
                console.log(received_msg);
                var obj = JSON.parse(received_msg)
                if (obj.M == "WELCOME TO BIGIOT") {
                    ws.send('{"M":"checkin","ID":"设备ID","K":"APIKEY"}')//发送连接设备
                }
                if(obj.M=="checkinok"){
                    mui.toast("服务器连接成功!可以进行控制")//这里是判断贝壳物联有没返回成功连接信息
                }
                if (obj.M == "ping") //判断是否收到心跳包
                {
                    ws.send('{"M":"beat"}') //发送心跳包数据
                }
            };
            document.getElementById("mySwitch").addEventListener("toggle", function(event) {
                if (event.detail.isActive) {
                    mui.toast("打开开关1")
                    console.log("你启动了开关");
                    ws.send('{"M": "say","ID": "D+设备ID","C": "sw1","SIGN": "xx3"}')//D+设备ID,D代表设备。D+ID代表要发送信息到我们的esp8266设备
                } else {
                    mui.toast("关闭开关1")
                    ws.send('{"M": "say","ID": "D+设备ID","C": "stop1","SIGN": "xx3"}')//这里发送的命令要跟ESP8266的判断的命令相匹配才会产生效果
                    console.log("你关闭了开关");
                }
            })
            document.getElementById("mySwitch1").addEventListener("toggle", function(event) {
                if (event.detail.isActive) {
                    mui.toast("打开开关2")
                    console.log("你启动了开关");
                    ws.send('{"M": "say","ID": "D+设备ID","C": "sw2","SIGN": "xx3"}')
                } else {
                    mui.toast("关闭开关2")
                    ws.send('{"M": "say","ID": "D+设备ID","C": "stop2","SIGN": "xx3"}')
                    console.log("你关闭了开关");
                    
                }
            })
            
        </script>
</body>
</html>

最后附上软件界面

软件界面效果图

文件已开源(2020.9.15),码云gitee下载地址:https://gitee.com/riddler11/esp8266-control-desk-lamp/tree/master/

(2020.9.21)在运用到控制台灯上,有些灯会出现频闪的问题。初步分析是由于里面元器件会分压到最后没能达到额定电压导致不能正常工作,需要对电路进行分析计算,以解决这个问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。