ESP8266智能家居(3)——單片機數據發送到mqtt服務器

1.主要思想

? ? ? ? 前期已學習如何用ESP8266連接WIFI,并發送數據到服務器。現在只需要在單片機與nodeMCU之間建立起串口通信,這樣單片機就可以將傳感器測到的數據:光照,溫度,濕度等等傳遞給8266了,然后8266再對數據進行打包,發送到服務器。

? ? ? ? 51單片機和nodeMCU的連線方式如下

????????它們串口的兩根線交叉連接,二者的USB供電端一起接在電腦的USB口上。如果它們不是用的同一套供電系統,就需要注意共地的問題!?

2.代碼設計

51單片機的主體代碼大致如下;

主要就是測量一些數據,然后通過串口發送到nodeMCU

?nodeMCU的代碼如下:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
const char* ssid = "iPhone";          //WIFI名稱   自己補上你的WIFI
const char* password = "12345678";      //WIFI密碼    自己補上你的密碼
const char* mqtt_server = "broker-cn.emqx.io";      //mqtt服務器地址 (IP/域名)  不改
const char *pubTopic="my_pubtopic";
const char *subTopic="my_subtopic";WiFiClient espClient;
PubSubClient client(espClient);char information[80]="";
int value = 0;void setup_wifi() {delay(10);// We start by connecting to a WiFi networkSerial.println();Serial.print("Connecting to ");Serial.println(ssid);WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}randomSeed(micros());Serial.println("");Serial.println("WiFi connected");Serial.println("IP address: ");Serial.println(WiFi.localIP());
}void callback(char* topic, byte* payload, unsigned int length) {String cmd="";for (int i = 0; i < length; i++) {cmd+=(char)payload[i];}const size_t capacity = JSON_OBJECT_SIZE(1) + 10;   //計算buffer的大小   ...SIZE(1)表明buffer中只有一個對象DynamicJsonBuffer jsonBuffer(capacity);           //創建動態的jsonbufferJsonObject& root = jsonBuffer.parseObject(cmd);     //解析Json對象字符串Serial.println("get");if(root.containsKey("led"))      //判斷是否包含某個鍵{int led = root["led"]; if(led==1){Serial.println("1");}elseSerial.println("2");}if(root.containsKey("beep"))      //判斷是否包含某個鍵{int beep = root["beep"]; if(beep==1){Serial.println("3");}elseSerial.println("4");}
}void reconnect() {// Loop until we're reconnectedwhile (!client.connected()) {Serial.print("Attempting MQTT connection...");// Create a random client IDString clientId = "ESP8266Client-";clientId += String(random(0xffff), HEX);// Attempt to connectif (client.connect(clientId.c_str())) {Serial.println("connected");// Once connected, publish an announcement...client.publish(pubTopic, "hello world");// ... and resubscribeclient.subscribe(subTopic);} else {Serial.print("failed, rc=");Serial.print(client.state());Serial.println(" try again in 5 seconds");// Wait 5 seconds before retryingdelay(5000);}}
}void setup() {Serial.begin(9600);setup_wifi();client.setServer(mqtt_server, 1883);client.setCallback(callback);
}void loop() {if (!client.connected()) {reconnect();}client.loop();value=0;while(!Serial.available());    //等待數據傳送過來,若沒有數據,一直等待,即執行到本行不向下執行while(Serial.available()){    information[value]=(char)Serial.read();  value++;  delay(3);}client.publish(pubTopic, information); Serial.print(information);// }
}

3.注意實現

51單片機發送給nodeMCU的數據,全部存在了這個數組里面

所以這個數組要足夠大,至少要大于你發送的內容。不然就會導致nodeMCU出現堆棧溢出的錯誤。(本人在這里卡了好幾個小時)? 希望大家可以避免類似的錯誤

在nodeMCU將數據發送到服務器的同時,可以使用nodeMCU的串口,將數據打印出來,方便調試,看看是否正確的接收到了數據。如下圖所示,這種是正確接收的效果。

如果通信出現錯誤,沒有準確接收,那么它會顯示一群亂碼,根本看不清楚是什么!!!

如果你發現你接收到的數據總是不準確,或者總是有亂碼,可以嘗試調整這個延時時間

4.最終效果?

如上圖所示,服務器已經可以成功接收到單片機發送的數據了!!!

此時,只需要開發一個MQTT協議的手機APP,就可以實現單片機數據在手機上顯示的效果!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697088.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697088.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697088.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java Web3J :使用web3j調用自己的智能合約,返回一個內部有數組的對象結構時出現NPE問題

之前有寫過一篇文章Java Web3J :使用web3j調用自己的智能合約的方法(教程),當時只是簡單的方法調用,也不涉及到什么復雜的數據類型,入參是long類型,出參是String類型。 目錄 問題描述報錯信息嘗試解決控制變量法查看源碼網上查閱解決最后問題描述 遇到這個問題是因為有…

【AI應用】SoraWebui——在線文生視頻工具

SoraWebui 是一個開源項目&#xff0c;允許用戶使用 OpenAI 的 Sora 模型使用文本在線生成視頻&#xff0c;從而簡化視頻創建&#xff0c;并具有輕松的一鍵網站部署功能 在 Vercel 上部署 1. 克隆項目 git clone gitgithub.com:SoraWebui/SoraWebui.git 2. 安裝依賴 cd Sor…

本科畢業設計(論文)開題報告:基于人工智能的短視頻獲客平臺的設計與實現

目錄 1.選題概述1.題目背景2.目的及意義3.技術現狀 2.題目內容1.任務概述2.系統設計1.數據采集模塊&#xff1a;2.數據處理與分析模塊&#xff1a;3.客戶識別模塊&#xff1a;4.推廣策略模塊&#xff1a; 3.功能模塊1.數據采集模塊&#xff1a;2.數據處理與分析模塊&#xff1a…

【Java EE初階二十】http的簡單理解(一)

1. 初識http HTTP 最新的版本應該是 HTTP/3.0&#xff0c;目前大規模使用的版本 HTTP/1.1&#xff1b; 下面來簡單說明一下使用 HTTP 協議的場景: 1、瀏覽器打開網站 (基本上) 2、手機 APP 訪問對應的服務器 (大概率) 前面的 TCP與UDP 和http不同&#xff0c;HTTP 的報文格式&a…

React基礎-webpack+creact-react-app創建項目

學習視頻&#xff1a;學習視頻 2節&#xff1a;webpack工程化創建項目 2.1.webpack工程化工具&#xff1a;vite/rollup/turbopak; 實現組件的合并、壓縮、打包等&#xff1b; 代碼編譯、兼容、校驗等&#xff1b; 2.2.React工程化/組件開發 我們可以基于webpack自己去搭建…

sql-labs25-28a

一、環境 網上都有不過多闡述 二、sql-labs第25關 它說你的OR和and屬于它,那就是過濾了OR和and 注入嘗試 不用or和and進行爆破注入,很明顯是有注入點的 ?id-1 union select 1,2,3-- 查看數據庫 ok&#xff0c;此道題算是解了但是如果我們用了and了呢 ?id-1 and updatex…

淺談集群的分類

本文主要介紹集群部署相關的知識&#xff0c;介紹集群部署的基礎&#xff0c;集群的分類、集群的負載均衡技術&#xff0c;集群的可用性以及集群的容錯機制。隨后介紹Redis-Cluster以及Mysql的架構以及主從復制原理。 集群介紹 單臺服務器本身會受到帶寬、內存、處理器等多方面…

STM32-串口通信(串口的接收和發送)

文章目錄 STM32的串口通信一、STM32里的串口通信二、串口的發送和接收串口發送串口接收 三、串口在STM32中的配置四、串口接收的兩種實現方式1. 需要更改的地方2. 查詢RXNE標志位3. 使用中斷 總結 STM32的串口通信 本文在于記錄自己的學習過程中遇到的問題和總結&#xff0c;各…

golang,gin腳手架,完美集成與結構化,gin-restful-api模板gin-layout,開箱即用

關于gtools golang非常奈斯&#xff0c;gin作為web框架也非常奈斯&#xff0c;但我們在開發過程中&#xff0c;前期搭建會花費大量的時間&#xff0c;且還不盡人意。 為此我集成了gin-restful-api的模板gin-layout&#xff0c;還有腳手架一鍵生成項目。 集成相關 ginviperz…

大型語言模型的語義搜索(一):關鍵詞搜索

關鍵詞搜索(Keyword Search)是文本搜索種一種常用的技術&#xff0c;很多知名的應用app比如Spotify、YouTube 或 Google map等都會使用關鍵詞搜索的算法來實現用戶的搜索任務&#xff0c;關鍵詞搜索是構建搜索系統最常用的方法&#xff0c;最常用的搜索算法是Okapi BM25&#x…

Liunx使用nginx和http搭建yum-server倉庫

文章目錄 1. yum-server的搭建方式2. nginx搭建yum-server倉庫2.1. 安裝配置nginx2.2 配置yum-server的rpm2.3. 同步yum源相關包2.3.1 rsync同步源3.3.1 reposync同步源 2.4. 配置客戶端訪問yum配置2.5. 驗證測試 3. http服務搭建yum-server倉庫3.1. 安裝配置http3.2 配置yum-s…

基于微信小程序校園洗衣系統設計與實現(PHP后臺)可行性分析

博主介紹&#xff1a;黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者&#xff0c;CSDN博客專家&#xff0c;在線教育專家&#xff0c;CSDN鉆石講師&#xff1b;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…

Firewalld防火墻

Firewalld概述 Firewalld firewalld防火墻是centos7系統默認防火墻的防火墻管理工具&#xff0c;取代了之前的iptables防火墻&#xff0c;也是工作在網絡層&#xff0c;屬于包過濾防火墻。 支持網絡區域所定義的網絡鏈接以及接口安全等級的動態防火墻管理工具至此IPv4、IPv6…

ECMAScript modules規范示例詳解

ECMAScript modules&#xff08;簡稱 ES modules&#xff09;是JavaScript的標準模塊系統。每個模塊都是一個獨立的JavaScript文件&#xff0c;可以在其中定義導出的變量、函數或類&#xff0c;并從其他模塊中導入這些變量、函數或類。以下是ES modules規范的一些示例和詳解&am…

Go 線程池實現案例

Go 語言并不像其他一些語言&#xff08;例如 Java 或 C#&#xff09;那樣直接提供一個線程池的概念。相反&#xff0c;Go 使用 goroutines 來實現并發&#xff0c;它是一種比線程更輕量級的并發執行單元。不過&#xff0c;仍然可以實現一個類似線程池的結構&#xff0c;來管理和…

studio one 6正版多少錢?怎么購買studio one 更便宜,有優惠券哦

Presonus Studio One Studio One是由美國PreSonus公司開發的數字音頻工作站&#xff0c;作為DAW屆的新人&#xff0c;功能強大且全面&#xff0c;雖然它不像其他DAW那樣擁有歷史和聲譽&#xff0c;但它是一個可愛的軟件&#xff0c;包含許多其它DAW所不具備的實用功能&#xff…

web基礎及http協議 (二)----------Apache相關配置與優化

一、httpd 安裝組成 http 服務基于 C/S 結構 1 .常見http 服務器程序 httpd apache&#xff0c;存在C10K&#xff08;10K connections&#xff09;問題 nginx 解決C10K問題lighttpd IIS .asp 應用程序服務器 tomcat .jsp 應用程序服務器 jetty 開源的servlet容器&#xf…

選擇 Python IDE(VSCode、Spyder、Visual Studio 2022和 PyCharm)

前言 當選擇 Python 開發工具時&#xff0c;你需要考慮自己的需求、偏好和項目類型。下面是對VSCode、Spyder、Visual Studio 2022和 PyCharm的對比推薦總結&#xff1a; 結論 1、如果你專注于“數據科學”&#xff0c;選擇SpyDer沒錯。 內容 Visual Studio Code (VS Code)…

react項目中的redux以及react-router-dom

掃盲知識點&#xff1a; 1 傳遞自定義事件&#xff1a; <button onClick{(e)>{change(e)}}>獲取事件對象e</button> 將事件對象e傳遞到了change的這個方法中。 2 同時傳遞自定義事件和參數&#xff1a; <button onClick{(e)>{change(‘我…

基于微信小程序失物招領系統設計與實現(PHP后臺+Mysql)可行性分析

博主介紹&#xff1a;黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者&#xff0c;CSDN博客專家&#xff0c;在線教育專家&#xff0c;CSDN鉆石講師&#xff1b;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…