摘要:教程傳送門基于平臺開發連接巴法云簡介實驗準備硬件軟件實驗步驟點燈實驗發送溫濕度指令升級總結關于巴法云專注于開源,智造,創新,分享。
關于巴法云
專注于開源,智造,創新,分享。關注硬件與創新,突破技術極限,面向未來,我們是認真的。
崇尚開源,發掘未知。 ————巴法科技
ESP8266-NodeMCU的環境配置已經在一篇文章有所交代,接下讓我們開啟巴法云的物聯網開發吧!???
設計目標
- 實現esp8266自動配網;
- 實現ESP8266通過TCP協議連接巴法云的TCP創客云,串口發送指令控制LED的亮滅;
- 實現ESP8266通過MQTT協議連接巴法云的MQTT設備云;串口發送指令控制LED的亮滅,還實現DHT11溫濕度數據的獲取,并將數據上發巴法云平臺,在線顯示數據;
- 實現巴法云平臺對ESP8266的OTA指令升級,基于前面兩個實驗。
本次需要做三個實驗,分別是TCP點燈實驗,MQTT發送溫濕度和OTA指令升級,準備工作包括硬件???和軟件???兩部分。
你要實現巴法云的三個實驗,你需要準備以下材料???
硬件連接:ESP8266-NodeMCU硬件連接非常簡單,只需將DHT11數據線接入D6引腳就好,這套連線三個實驗都通用,具體接線如下???
ESP8266-NodeMCU -----> USBVCC -----> 3.3V GND -----> GNDout -----> D2
首先搭建巴法云平臺,創建的產品相關主題,檢測相關數據流,上傳固件和發送指令,以便后期程序端口接入開發。???
文件名 | 功能 |
---|---|
bemfa02 | 程序初始化調用和主程序調用; |
TCP | 發送數據到TCP服務器,初始化wifi連接,初始化和服務器建立連接; |
motion | 檢查數據,發送心跳,檢查WiFi; |
update | 固件升級函數。 |
bemfa02.ino
/* * 智能語言控制控制,支持天貓、小愛、小度、google Assistent同時控制 * Time:20211127 * Author: 2345VOR * 項目實例:發送on、off的指令開關燈 * 參考文獻:https://bbs.bemfa.com/84/last */#include #include #define server_ip "bemfa.com" //巴法云服務器地址默認即可#define server_port "8344" //服務器端口,tcp創客云端口8344//********************需要修改的部分*******************//#define wifi_name "J09 502" //WIFI名稱,區分大小寫,不要寫錯#define wifi_password "qwertyuiop111" //WIFI密碼String UID = "e8882ae28d5bde39766c330ea913fd46"; //用戶私鑰,可在控制臺獲取,修改為自己的UIDString TOPIC = "light002"; //主題名字,可在控制臺新建const int LED_Pin = D4; //單片機LED引腳值,D2是NodeMcu引腳命名方式,其他esp8266型號將D2改為自己的引腳 String upUrl = "http://bin.bemfa.com/b/3BcZTg4ODJhZTI4ZDViZGUzOTc2NmMzMzBlYTkxM2ZkNDY=light002.bin";//固件鏈接,在巴法云控制臺復制、粘貼到這里即可//**************************************************////最大字節數#define MAX_PACKETSIZE 512//設置心跳值30s#define KEEPALIVEATIME 30*1000//tcp客戶端相關初始化,默認即可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;//相關函數初始化//連接WIFIvoid doWiFiTick();void startSTA();//TCP初始化連接void doTCPClientTick();void startTCPClient();void sendtoTCPServer(String p);//led控制函數,具體函數內容見下方#define turnOnLed() digitalWrite(LED_Pin,LOW);#define turnOffLed() digitalWrite(LED_Pin,HIGH);// 初始化,相當于main 函數void setup() { Serial.begin(115200); pinMode(LED_Pin,OUTPUT); digitalWrite(LED_Pin,HIGH); Serial.println("Beginning...");}//循環void loop() { doWiFiTick(); doTCPClientTick();}
TCP.ino
/* *發送數據到TCP服務器 */void sendtoTCPServer(String p){ if (!TCPclient.connected()) { Serial.println("Client is not readly"); return; } TCPclient.print(p);}/* *初始化wifi連接*/void startSTA(){ WiFi.disconnect(); WiFi.mode(WIFI_STA); WiFi.begin(wifi_name, wifi_password);}/* *初始化和服務器建立連接 :style="value.online?"訂閱設備在線":"無訂閱設備"" color:#9A9A9A;*/void startTCPClient(){ if(TCPclient.connect(server_ip, atoi(server_port))){ Serial.print("/nConnected to server:"); Serial.printf("%s:%d/r/n",server_ip,atoi(server_port)); String tcpTemp=""; //初始化字符串 tcpTemp = "cmd=1&uid="+UID+"&topic="+TOPIC+"/r/n"; //構建訂閱指令 sendtoTCPServer(tcpTemp); //發送訂閱指令 tcpTemp="";//清空 /* //如果需要訂閱多個主題,可再次發送訂閱指令 tcpTemp = "cmd=1&uid="+UID+"&topic="+主題2+"/r/n"; //構建訂閱指令 sendtoTCPServer(tcpTemp); //發送訂閱指令 tcpTemp="";//清空 */ preTCPConnected = true; preHeartTick = millis(); TCPclient.setNoDelay(true); } else{ Serial.print("Failed connected to server:"); Serial.println(server_ip); TCPclient.stop(); preTCPConnected = false; } preTCPStartTick = millis();}
motion.ino
/* *檢查數據,發送心跳*/void doTCPClientTick(){ //檢查是否斷開,斷開后重連 if(WiFi.status() != WL_CONNECTED) return; if (!TCPclient.connected()) {//斷開重連 if(preTCPConnected == true){ preTCPConnected = false; preTCPStartTick = millis(); Serial.println(); Serial.println("TCP Client disconnected."); TCPclient.stop(); } 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; } preHeartTick = millis(); } if(millis() - preHeartTick >= KEEPALIVEATIME){//保持心跳 preHeartTick = millis(); Serial.println("--Keep alive:"); sendtoTCPServer("ping/r/n"); //發送心跳,指令需/r/n結尾,詳見接入文檔介紹 } } if((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick>=200)) { TCPclient.flush(); Serial.print("Rev string: "); TcpClient_Buff.trim(); //去掉首位空格 Serial.println(TcpClient_Buff); //打印接收到的消息 String getTopic = ""; String getMsg = ""; if(TcpClient_Buff.length() > 15){//注意TcpClient_Buff只是個字符串,在上面開頭做了初始化 String TcpClient_Buff = ""; //此時會收到推送的指令,指令大概為 cmd=2&uid=xxx&topic=light002&msg=off int topicIndex = TcpClient_Buff.indexOf("&topic=")+7; //c語言字符串查找,查找&topic=位置,并移動7位,不懂的可百度c語言字符串查找 int msgIndex = TcpClient_Buff.indexOf("&msg=");//c語言字符串查找,查找&msg=位置 getTopic = TcpClient_Buff.substring(topicIndex,msgIndex);//c語言字符串截取,截取到topic,不懂的可百度c語言字符串截取 getMsg = TcpClient_Buff.substring(msgIndex+5);//c語言字符串截取,截取到消息 Serial.print("topic:------"); Serial.println(getTopic); //打印截取到的主題值 Serial.print("msg:--------"); Serial.println(getMsg); //打印截取到的消息值 } if(getMsg == "on"){ //如果收到指令on==打開燈 turnOnLed(); }else if(getMsg == "off"){ //如果收到指令off==關閉燈 turnOffLed(); }else if(getMsg == "update"){ //如果收到指令update updateBin();//執行升級函數 } TcpClient_Buff=""; TcpClient_BuffIndex = 0; }}/************************************************************************** WIFI***************************************************************************//* WiFiTick 檢查是否需要初始化WiFi 檢查WiFi是否連接上,若連接成功啟動TCP Client 控制指示燈*/void doWiFiTick(){ static bool startSTAFlag = false; static bool taskStarted = false; static uint32_t lastWiFiCheckTick = 0; if (!startSTAFlag) { startSTAFlag = true; startSTA(); } //未連接1s重連 if ( WiFi.status() != WL_CONNECTED ) { if (millis() - lastWiFiCheckTick > 1000) { lastWiFiCheckTick = millis(); } } //連接成功建立 else { if (taskStarted == false) { taskStarted = true; Serial.print("/r/nGet IP Address: "); Serial.println(WiFi.localIP()); startTCPClient(); } }}
update.ino
/** * 固件升級函數 * 在需要升級的地方,加上這個函數即可,例如setup中加的updateBin(); * 原理:通過http請求獲取遠程固件,實現升級 */void updateBin(){ Serial.println("start update"); WiFiClient UpdateClient; t_httpUpdate_return ret = ESPhttpUpdate.update(UpdateClient, upUrl); switch(ret) { case HTTP_UPDATE_FAILED: //當升級失敗 Serial.println("[update] Update failed."); break; case HTTP_UPDATE_NO_UPDATES: //當無升級 Serial.println("[update] Update no Update."); break; case HTTP_UPDATE_OK: //當升級成功 Serial.println("[update] Update ok."); break; }}
修改bemfa02主程序對應wifi和巴法云參數,upUrl參數可以暫時不修改,實驗三再修改???
編譯程序,然后上傳esp8266,觀察esp8266和巴法云TCP控制臺????
實驗效果:在訂閱的“light002”主題下,發送on或者off,可見esp8266板載燈分別會亮滅。?????
登錄巴法云物聯網平臺,選擇控制臺,點擊MQTT設備云,然后新建led002控制端和temp004狀態端主題,那么巴法云MQTT設備云就配置好了?
程序設計,程序有四部分dht11_led_OTA1.0、OTA(update)PubSubClient.cpp和PubSubClient.h,其中:??
文件名 | 功能 |
---|---|
dht11_led_OTA1.0 | 程序初始化調用和主程序調用,自動連接目標wifi,重新連接,led002的回調函數處理; |
OTA(update) | 固件升級函數。 |
dht11_led_OTA1.0.ino
/* Time:20211127 Author: 2345VOR 項目示例:通過MQTT協議發送on或off控制開關,溫濕度上傳巴法云 參考文獻:https://www.cnblogs.com/bemfa/p/14590133.html*/#include //默認,加載WIFI頭文件#include "PubSubClient.h"//默認,加載MQTT庫文件#include //自動升級庫 https://bbs.bemfa.com/84#include //dht11庫文件String upUrl = "http://bin.bemfa.com/b/1BcZTg4ODJhZTI4ZDViZGUzOTc2NmMzMzBlYTkxM2ZkNDY=led002.bin";const char* ssid = "J09 502"; //修改,修改為你的路由的WIFI名字const char* password = "qwertyuiop111"; //修改為你的WIFI密碼const char* mqtt_server = "bemfa.com"; //默認,MQTT服務器地址const int mqtt_server_port = 9501; //默認,MQTT服務器端口#define ID_MQTT "e8882ae28d5bde39766c330ea913fd46" //mqtt客戶端ID,修改為你的開發者密鑰const char* topic = "led002"; //Led主題名字,可在巴法云控制臺自行創建,名稱隨意const char * dhttopic = "temp004"; //溫濕度主題名字,可在巴法云mqtt控制臺創建int pinDHT11 = D2; //dht11傳感器引腳輸入int B_led = D4; //控制的led引腳long timeval = 3 * 1000; //上傳的傳感器時間間隔,默認3秒#define ledstatus !digitalRead(B_led);//led狀態默認0long lastMsg = 0;//時間戳SimpleDHT11 dht11(pinDHT11);//dht11初始化WiFiClient espClient;PubSubClient client(espClient);//mqtt初始化//燈光函數及引腳定義#define turnOnLed() digitalWrite(B_led, LOW);#define turnOffLed() digitalWrite(B_led, HIGH);//自動連接目標wifivoid setup_wifi() { delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP());}//重新連接void reconnect() { // Loop until we"re reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(ID_MQTT)) {//連接mqtt Serial.println("connected"); client.subscribe(topic);//修改,修改為你的主題 } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } }}void setup() { pinMode(B_led, OUTPUT); Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, mqtt_server_port); client.setCallback(callback); digitalWrite(B_led, HIGH);}void loop() { if (!client.connected()) {//判斷mqtt是否連接 reconnect(); } client.loop();//mqtt客戶端 long now = millis();//獲取當前時間戳 if (now - lastMsg > timeval) {//如果達
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125585.html
摘要:本文,將介紹如何通過這個芯片連接到巴法云的設備云。例如向主題推送數據,可為示例調試測試的內容就是上面的指令,使用網絡調試助手連接上巴法云后,修改就可以直接發送指令了。 ...
摘要:導入文件后,如果只是簡單使用,只需要修改兩個地方,一個是主題名字,一個是,均需開發者置換成自己的主題名字和用戶私鑰,均可在巴法云控制臺獲取點擊跳轉。 esp32-...
摘要:使用實現連網實現巴法云物聯網使用硬件程序思路基于正點原子的測試程序在巴法云物聯網創建的主題初始化代碼比較簡陋主函數代碼如果想用串口助手調試,接線方法如下使用硬件我這里使用的是正點原子家的開發板精英版和模塊。 ...
摘要:具體操作如下創建自己的設備進入到阿里云控制臺,找到物聯網平臺,創建屬于自己的設備點擊公共實例進行創建里面有個設備管理,點擊產品,里面有個創建產品輸入名稱即可,然后選擇標準品類這里我創建的是溫濕度檢測。 ...
摘要:查詢附近名稱密碼連接路由器的查看路由器分配給模組的地址例如設置單連接設置透傳模式建立的服務器開始發送數據進入發送模式發送數據注意退出透傳,直接發送。取消發送新行五參考模塊指令入門指南透傳簡單使用模塊指令匯總一、所需硬件材料 1.ESP8266:01s某寶上3、5塊錢 2.杜邦線:某寶幾塊錢一組40P,這里只需要三根,用于連接 樹莓派與繼電器 ?? 3.燒錄器 ...
閱讀 3735·2023-01-11 11:02
閱讀 4244·2023-01-11 11:02
閱讀 3050·2023-01-11 11:02
閱讀 5180·2023-01-11 11:02
閱讀 4737·2023-01-11 11:02
閱讀 5534·2023-01-11 11:02
閱讀 5313·2023-01-11 11:02
閱讀 3986·2023-01-11 11:02