侧边栏壁纸
博主昵称
Yi

ESP8266远程定时打氧机

2025年04月23日 43阅读 0评论 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

14 文章数
9 标签数
2 评论量