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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352