发布作者: yi
百度收录: 正在检测是否收录...
作品采用: 《 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 》许可协议授权
起因是家里养了一些小鱼需要打氧,但是又不需要24小时全天候的开着,电机的声音实在是太吵了,就想着能不能做个定时开关给它,在网上看到esp8266这个单片机功能好像挺多的,而且也不需要什么技术含量就可以做,于是就在淘宝上买了一套(esp8266/继电器底座/USB烧录器),这个价格真的是爱了!
买回来肯定是不能直接使用的,需要给他刷写程序,得让它连上网络,在收到指令做出相应的动作,所以需要用到一些工具,也可以去官网下载完整版(百度网盘2个多G,太折磨人了)
期间会提示安装单片机依赖,y回车(选装8266即可)
安装完成后,双击打开软件主程序"Mixly.exe"
右边点击找到esp8266这个型号点进去
找到设置→库管理→巴法云esp8266扩展库
进入 巴法云官网 注册一个账号,然后进入工作台。创建一个主题,xxxx001
在左边工具添加这些代码块,填入自己的WiFi名称密码和巴法云私钥。
当然你也可以用我编辑好的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,最后点击上传等待完成即可
最后最后一步就是接线方面,如下图:
—— 评论区 ——