需要工具:Arduino IDE 配置好esp8266环境
ESP8266开发板(此处用的esp8266-01s 带5v继电器如下图)
串口工具TTL随便什么芯片(但作者刚好带了一个PL2303HXA的芯片(网上有驱动下载安装后,一插拔又让联系供货商),结果找不到其他ch340芯片了)
流程: 下载好开发环境和 代码包,地址:https://cloud.bemfa.com/docs/#/?id=_22-%e6%8e%a7%e5%88%b6%e5%8d%95%e7%89%87%e6%9c%ba
然后连接设备 烧录。 完成
巴法云官网里面有接入文档:https://bemfa.com/
手头上暂时有几个esp8266的板子
ESP8266-01/S的外观区别
其他的也可以更具实际需求修改代码
1 //********************需要修改的部分*******************// 2 3 #define DEFAULT_STASSID "QQqun:51798659" //WIFI名称,区分大小写,不要写错 4 #define DEFAULT_STAPSW "51798659" //WIFI密码 5 String UID = "QQ群:51798659----------"; //用户私钥,可在控制台获取,修改为自己的UID 6 String TOPIC = "light002"; //主题名字,可在控制台新建 7 const int LED_Pin = 0; //单片机LED引脚值 ESP8266-01S用这个脚 8 9 //**************************************************//
串口芯片驱动装好后就会有串口COMX
串口连接8266
GND->GND
VCC->3.3v
TX<->RX
GPIO0->GND
RST->GND烧录前按下上电
然后就是串口选好和开发板选好
准备烧录
还没传输数据前 要按住rst上电放开手即可。gpio0一定要接入gnd
随后用的以前有个小E开发板来接的
最终代码(需要更具自己的修改):
1 /* 2 * 天猫精灵控制 3 * 2020-05-12 4 * QQ交流群:824273231 5 * 官网https://bemfa.com 6 */ 7 #include <WiFiClient.h> 8 #include <ESP8266WiFi.h> 9 10 11 //巴法云服务器地址默认即可 12 #define TCP_SERVER_ADDR "bemfa.com" 13 //服务器端口,tcp创客云端口8344 14 #define TCP_SERVER_PORT "8344" 15 16 //********************需要修改的部分*******************// 17 18 #define DEFAULT_STASSID "QQqun:51798659" //WIFI名称,区分大小写,不要写错 19 #define DEFAULT_STAPSW "51798659" //WIFI密码 20 String UID = "QQ群:51798659----------"; //用户私钥,可在控制台获取,修改为自己的UID 21 String TOPIC = "light002"; //主题名字,可在控制台新建 22 const int LED_Pin = 0; //单片机LED引脚值 ESP8266-01S用这个脚 23 24 //**************************************************// 25 26 27 28 //最大字节数 29 #define MAX_PACKETSIZE 512 30 //设置心跳值30s 31 #define KEEPALIVEATIME 30*1000 32 33 34 35 //tcp客户端相关初始化,默认即可 36 WiFiClient TCPclient; 37 String TcpClient_Buff = ""; 38 unsigned int TcpClient_BuffIndex = 0; 39 unsigned long TcpClient_preTick = 0; 40 unsigned long preHeartTick = 0;//心跳 41 unsigned long preTCPStartTick = 0;//连接 42 bool preTCPConnected = false; 43 44 45 46 //相关函数初始化 47 //连接WIFI 48 void doWiFiTick(); 49 void startSTA(); 50 51 //TCP初始化连接 52 void doTCPClientTick(); 53 void startTCPClient(); 54 void sendtoTCPServer(String p); 55 56 //led 控制函数 57 void turnOnLed(); 58 void turnOffLed(); 59 60 61 62 /* 63 *发送数据到TCP服务器 64 */ 65 void sendtoTCPServer(String p){ 66 67 if (!TCPclient.connected()) 68 { 69 Serial.println("Client is not readly"); 70 return; 71 } 72 TCPclient.print(p); 73 Serial.println("[Send to TCPServer]:String"); 74 Serial.println(p); 75 } 76 77 78 /* 79 *初始化和服务器建立连接 80 */ 81 void startTCPClient(){ 82 if(TCPclient.connect(TCP_SERVER_ADDR, atoi(TCP_SERVER_PORT))){ 83 Serial.print("\nConnected to server:"); 84 Serial.printf("%s:%d\r\n",TCP_SERVER_ADDR,atoi(TCP_SERVER_PORT)); 85 86 String tcpTemp=""; //初始化字符串 87 tcpTemp = "cmd=1&uid="+UID+"&topic="+TOPIC+"\r\n"; //构建订阅指令 88 sendtoTCPServer(tcpTemp); //发送订阅指令 89 tcpTemp="";//清空 90 91 preTCPConnected = true; 92 preHeartTick = millis(); 93 TCPclient.setNoDelay(true); 94 } 95 else{ 96 Serial.print("Failed connected to server:"); 97 Serial.println(TCP_SERVER_ADDR); 98 TCPclient.stop(); 99 preTCPConnected = false; 100 } 101 preTCPStartTick = millis(); 102 } 103 104 105 /* 106 *检查数据,发送心跳 107 */ 108 void doTCPClientTick(){ 109 //检查是否断开,断开后重连 110 if(WiFi.status() != WL_CONNECTED) return; 111 112 if (!TCPclient.connected()) {//断开重连 113 114 if(preTCPConnected == true){ 115 116 preTCPConnected = false; 117 preTCPStartTick = millis(); 118 Serial.println(); 119 Serial.println("TCP Client disconnected."); 120 TCPclient.stop(); 121 } 122 else if(millis() - preTCPStartTick > 1*1000)//重新连接 123 startTCPClient(); 124 } 125 else 126 { 127 if (TCPclient.available()) {//收数据 128 char c =TCPclient.read(); 129 TcpClient_Buff +=c; 130 TcpClient_BuffIndex++; 131 TcpClient_preTick = millis(); 132 133 if(TcpClient_BuffIndex>=MAX_PACKETSIZE - 1){ 134 TcpClient_BuffIndex = MAX_PACKETSIZE-2; 135 TcpClient_preTick = TcpClient_preTick - 200; 136 } 137 preHeartTick = millis(); 138 } 139 if(millis() - preHeartTick >= KEEPALIVEATIME){//保持心跳 140 preHeartTick = millis(); 141 Serial.println("--Keep alive:"); 142 sendtoTCPServer("cmd=0&msg=keep\r\n"); 143 } 144 } 145 if((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick>=200)) 146 {//data ready 147 TCPclient.flush(); 148 Serial.println("Buff"); 149 Serial.println(TcpClient_Buff); 150 if((TcpClient_Buff.indexOf("&msg=on") > 0)) { 151 turnOnLed(); 152 }else if((TcpClient_Buff.indexOf("&msg=off") > 0)) { 153 turnOffLed(); 154 } 155 TcpClient_Buff=""; 156 TcpClient_BuffIndex = 0; 157 } 158 } 159 160 void startSTA(){ 161 WiFi.disconnect(); 162 WiFi.mode(WIFI_STA); 163 WiFi.begin(DEFAULT_STASSID, DEFAULT_STAPSW); 164 } 165 166 167 168 /************************************************************************** 169 WIFI 170 ***************************************************************************/ 171 /* 172 WiFiTick 173 检查是否需要初始化WiFi 174 检查WiFi是否连接上,若连接成功启动TCP Client 175 控制指示灯 176 */ 177 void doWiFiTick(){ 178 static bool startSTAFlag = false; 179 static bool taskStarted = false; 180 static uint32_t lastWiFiCheckTick = 0; 181 182 if (!startSTAFlag) { 183 startSTAFlag = true; 184 startSTA(); 185 Serial.printf("Heap size:%d\r\n", ESP.getFreeHeap()); 186 } 187 188 //未连接1s重连 189 if ( WiFi.status() != WL_CONNECTED ) { 190 if (millis() - lastWiFiCheckTick > 1000) { 191 lastWiFiCheckTick = millis(); 192 } 193 } 194 //连接成功建立 195 else { 196 if (taskStarted == false) { 197 taskStarted = true; 198 Serial.print("\r\nGet IP Address: "); 199 Serial.println(WiFi.localIP()); 200 startTCPClient(); 201 } 202 } 203 } 204 //打开灯泡 205 void turnOnLed(){ 206 Serial.println("Turn ON"); 207 digitalWrite(LED_Pin,LOW); 208 } 209 //关闭灯泡 210 void turnOffLed(){ 211 Serial.println("Turn OFF"); 212 digitalWrite(LED_Pin,HIGH); 213 } 214 215 216 // 初始化,相当于main 函数 217 void setup() { 218 Serial.begin(115200); 219 pinMode(LED_Pin,OUTPUT); 220 digitalWrite(LED_Pin,HIGH); 221 Serial.println("Beginning..."); 222 } 223 224 //循环 225 void loop() { 226 doWiFiTick(); 227 doTCPClientTick(); 228 }