硬件
micro USB
USB母座
继电器
电阻电容若干
ESP8266-12F
CH340C
硬件电路
USB转UART一键下载电路
5V转3.3V电路(降压、供电)
ESP8266-12F主控电路
key电路
继电器电路
此处设计为了给USB供电充足,避免供电不足灯频闪,加了个电容,利用电容充放电来提供充足电压(这是我个人的想法,不知正确否,实际测试过才行,也欢迎各位读者批评指正)
总电路原理图
2020.8.28翻车部分
板子到了焊接,第一块板在所有焊接完成后,发现CH340C的芯片有问题。早上单独焊接了烧写的电路CH340C,在新版上的烧写电路是没问题的,电脑也能成功识别
由于过于自信,没有多买元件,使得第一板哪里有错误难以检查,而且没有好好核对原理图,买少了元件导致没得焊三个电阻,虽然有最小系统,但是烧录固件ESP12F呈现了十分奇怪的一直闪灯,但不走进程的状态
更多分析可以观看B站同步分享的视频
B站同步的分析视频
2020.8.31成功控制台灯
自己设计的这块板子理论上能够控制所有采用USB 5V供电的设备
硬件代码部分
先为ESP8266-12F刷入固件(可先刷AT固件,接着刷入nodemcu固件,避免出现错误)
接着写代码,可以用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> 开关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)在运用到控制台灯上,有些灯会出现频闪的问题。初步分析是由于里面元器件会分压到最后没能达到额定电压导致不能正常工作,需要对电路进行分析计算,以解决这个问题