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 
#include 

//=============  此处必须修该============
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更新



    
    
    
    
    
    
    



//这里class是自己写的一个背景图片css样式

最后附上软件界面

软件界面效果图

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

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

你可能感兴趣的:(ESP8266远程控制台灯)