侧边栏壁纸
博主昵称
Yi

ESP8266远程定时打氧机

  • yi 2025年04月23日 85阅读 0评论
  • 起因是家里养了一些小鱼需要打氧,但是又不需要24小时全天候的开着,电机的声音实在是太吵了,就想着能不能做个定时开关给它,在网上看到esp8266这个单片机功能好像挺多的,而且也不需要什么技术含量就可以做,于是就在淘宝上买了一套(esp8266/继电器底座/USB烧录器),这个价格真的是爱了!
    1000003910

    买回来肯定是不能直接使用的,需要给他刷写程序,得让它连上网络,在收到指令做出相应的动作,所以需要用到一些工具,也可以去官网下载完整版(百度网盘2个多G,太折磨人了)
    下载软件包,解压到"D:\mixly\"根目录,不要有中文和特殊符号,然后点一键更新.bat
    1000003912
    期间会提示安装单片机依赖,y回车(选装8266即可)
    1000003916
    安装完成后,双击打开软件主程序"Mixly.exe"
    1000003921
    右边点击找到esp8266这个型号点进去
    1000003926
    找到设置→库管理→巴法云esp8266扩展库
    1000003936

    进入 巴法云官网 注册一个账号,然后进入工作台。创建一个主题,xxxx001
    1000003939
    在左边工具添加这些代码块,填入自己的WiFi名称密码和巴法云私钥。
    1000003945

    当然你也可以用我编辑好的dome下载导入填写信息后上传即可。

    又或者粘贴代码

    #include <ESP8266WiFi.h>
    
    #define TCP_SERVER_ADDR "bemfa.com"
    #define TCP_SERVER_PORT 8344
    #ifndef AP_CONFIG
    String UID = "你的密钥";
    #endif
    #define MAX_PACKETSIZE 512
    #define KEEPALIVEATIME 30*1000
    WiFiClient TCPclient;
    String TcpClient_Buff = "";
    unsigned int TcpClient_BuffIndex = 0;
    unsigned long TcpClient_preTick = 0;
    unsigned long preHeartTick = 0;
    unsigned long preTCPStartTick = 0;
    bool preTCPConnected = false;
    bool subFlag = false;
    void doWiFiTick();
    void doTCPClientTick();
    void sendtoTCPServer(String p);
    
    void subTopic(String topic) {
      String tcpTemp = "";
      tcpTemp = "cmd=1&uid="+UID+"&topic="+topic+"\r\n";
      Serial.println(tcpTemp);
      sendtoTCPServer(tcpTemp);
      tcpTemp="";
      Serial.print("sub topic:");
      Serial.println(topic);
    }
    
    void doWiFiTick() {
      static bool taskStarted = false;
      static uint32_t lastWiFiCheckTick = 0;
      if (WiFi.status() != WL_CONNECTED) {
        taskStarted = false;
        if (millis() - lastWiFiCheckTick > 1000) {
          lastWiFiCheckTick = millis();
    
        }
      } else {
        if (taskStarted == false) {
          taskStarted = true;
          Serial.print("Get IP Address: ");
          Serial.println(WiFi.localIP());
          startTCPClient();
        }
      }
    }
    
    void sendtoTCPServer(String p) {
      if (!TCPclient.connected()) {
        Serial.println("Client is not readly");
        return;
      }
      TCPclient.print(p);
      preHeartTick = millis(); //心跳计时开始,需要每隔60秒发送一次数据
    }
    
    void startTCPClient() {
      if (TCPclient.connect(TCP_SERVER_ADDR, TCP_SERVER_PORT)) {
        Serial.print("Connected to server:");
        Serial.println(TCP_SERVER_ADDR);
        subFlag = true;
        preHeartTick = millis();
        TCPclient.setNoDelay(true);
      } else {
        Serial.print("Failed connected to server:");
        Serial.println(TCP_SERVER_ADDR);
        TCPclient.stopAll();
        preTCPConnected = false;
      }
      preTCPStartTick = millis();
    }
    void subTopicCenter() {
      if (subFlag == true) {
        subFlag = false;
        subTopic("主题名称");
      }
    }
    void doTCPClientTick() {
      if(WiFi.status() != WL_CONNECTED) return;
      if (!TCPclient.connected()) {
        TCPclient.stopAll();
        if (preTCPConnected == true) {
          preTCPConnected = false;
          preTCPStartTick = millis();
          Serial.println();
          Serial.println("TCP Client disconnected.");
        } else if (millis() - preTCPStartTick > 1*1000) {
          startTCPClient();
        }
      } else {
        if (TCPclient.available()) {
          char c =TCPclient.read();
          TcpClient_Buff +=c;
          TcpClient_BuffIndex++;
          TcpClient_preTick = millis();
          if (TcpClient_BuffIndex >= MAX_PACKETSIZE - 1) {
            TcpClient_BuffIndex = MAX_PACKETSIZE-2;
            TcpClient_preTick = TcpClient_preTick - 200;
          }
        }
        if (millis() - preHeartTick >= KEEPALIVEATIME) {
          preHeartTick = millis();
          Serial.println("--Keep alive:");
          sendtoTCPServer("ping\r\n");
        }
      }
      if ((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick>=200)) {
        TCPclient.flush();
        TcpClient_Buff.trim();
        String topic = "";
        String msg = "";
        if (TcpClient_Buff.length() > 15) {
          int topicIndex = TcpClient_Buff.indexOf("&topic=")+7;
          int msgIndex = TcpClient_Buff.indexOf("&msg=");
          topic = TcpClient_Buff.substring(topicIndex,msgIndex);
          msg = TcpClient_Buff.substring(msgIndex+5);
        }
        Serial.println(topic);
        Serial.println(msg);
        if (msg == "on") {
          digitalWrite(0,HIGH);
          digitalWrite(2,HIGH);
    
        }
        if (msg == "off") {
          digitalWrite(0,LOW);
          digitalWrite(2,LOW);
    
        }
        msg = "";
        topic = "";
        TcpClient_Buff="";
        TcpClient_BuffIndex = 0;
      }
    }
    
    void setup(){
      Serial.begin(9600);
      WiFi.begin("wifi名字", "wifi密码");
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("Local IP:");
      Serial.print(WiFi.localIP());
    
      doWiFiTick();
      pinMode(0, OUTPUT);
      pinMode(2, OUTPUT);
    }
    
    void loop(){
      doTCPClientTick();
      subTopicCenter();
    
    }

    然后在上面工具栏找到你的端口COMx,最后点击上传等待完成即可

    最后最后一步就是接线方面,如下图:
    1000003863

    0

    —— 评论区 ——

    昵称
    邮箱
    网址
    取消
    博主栏壁纸
    博主头像 Yi

    11 文章数
    7 标签数
    2 评论量