版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
[13],支持多種設(shè)備和編程語言。其開發(fā)環(huán)境采用簡化版的C++語言,降低了編程學(xué)習(xí)的門檻容易上手。具有可靠性、開源編程特性和成本的優(yōu)勢(shì)。Arduino采用setup()和loop()函數(shù),代碼結(jié)構(gòu)相對(duì)簡單,編程的模式直觀,編程中無需理解復(fù)雜的操作系統(tǒng)或線程管理,只需關(guān)注核心邏輯。并且調(diào)試流程簡單,一鍵即可編譯。而且ArduinoIDE自帶大量示例代碼,可以參考。I2C接口的OLED屏幕通過標(biāo)準(zhǔn)庫驅(qū)動(dòng),無需手動(dòng)編寫底層通信協(xié)議。還有具備強(qiáng)大的庫支持和硬件兼容性強(qiáng)的特點(diǎn),直接支持本次設(shè)計(jì)中用的開發(fā)板。在本設(shè)計(jì)中使用ArduinoIDE進(jìn)行開發(fā),只需較短的代碼就可以連接Wi-Fi與網(wǎng)絡(luò),不用再手動(dòng)處理協(xié)議。還能便于OLED顯示的快速實(shí)現(xiàn)以及用簡潔的代碼實(shí)現(xiàn)時(shí)間同步一步到位。主程序的設(shè)計(jì)本設(shè)計(jì)中程序部分的編寫至關(guān)重要。在Arduino中,兩個(gè)主體函數(shù)分別為setup()和loop()函數(shù)。在setup()函數(shù)中完成Arduino的初始化設(shè)置,配置I/O口狀態(tài),初始化串口,整個(gè)階段只執(zhí)行一次。loop()函數(shù)用來實(shí)現(xiàn)邏輯功能,本設(shè)計(jì)中的各種模塊,控制IO的輸入和輸出等。Arduino編程環(huán)境封裝了上層調(diào)用,main函數(shù)在Arduino的核心庫中,作為程序的入口。setup和loop函數(shù)都在main函數(shù)中調(diào)用。loop通過for循環(huán)實(shí)現(xiàn)循環(huán)執(zhí)行,且每次的loop結(jié)束后,都會(huì)進(jìn)行串口事件判斷。以下為本次程序編寫的基本邏輯流程。主程序的編寫主程序的運(yùn)行邏輯是根據(jù)WiFi連接、時(shí)間同步、天氣信息獲取這三大核心功能展開的。設(shè)備通過OLED屏幕實(shí)時(shí)反饋狀態(tài)信息,在流程中設(shè)置各種條件分支來應(yīng)對(duì)不同場景下成功或失敗的情況。WiFi連接階段實(shí)現(xiàn)建立網(wǎng)絡(luò)連接。時(shí)間同步階段進(jìn)行校準(zhǔn)設(shè)備的時(shí)間。天氣獲取階段實(shí)現(xiàn)從網(wǎng)絡(luò)獲取實(shí)時(shí)天氣數(shù)據(jù)。每個(gè)階段都包含狀態(tài)顯示、錯(cuò)誤處理和用戶反饋,該流程的邏輯清晰而且模塊化。(1)Wi-Fi連接階段:啟動(dòng)程序,在開始進(jìn)行程序初始化,首先嘗試連接預(yù)設(shè)的WiFi網(wǎng)絡(luò)。網(wǎng)絡(luò)連接成功與否直接影響后續(xù)功能的實(shí)現(xiàn)。首先要進(jìn)行對(duì)連接結(jié)果進(jìn)行判斷。連接失敗,執(zhí)行以下操作:清除OLED顯示內(nèi)容。顯示失敗信息,輸出“WiFi連接失敗”的提示。展示嘗試連接的SSID名稱,便于排查密碼錯(cuò)誤或者信號(hào)弱等網(wǎng)絡(luò)配置問題。返回false,終止當(dāng)前的流程,向上層調(diào)用返回失敗狀態(tài),自動(dòng)重試。成功分支:清除OLED顯示,準(zhǔn)備展示新狀態(tài)。顯示成功信息,輸出“WIFI連接成功”,確認(rèn)網(wǎng)絡(luò)狀態(tài)正常。顯示設(shè)備的IP地址,用于調(diào)試和遠(yuǎn)程訪問。延時(shí)1秒,避免屏幕信息切換過快來不及閱讀。(2)時(shí)間同步階段:清除OLED顯示內(nèi)容。顯示同步提示,輸出“同步網(wǎng)絡(luò)時(shí)間”,提示當(dāng)前在進(jìn)行的操作。對(duì)同步結(jié)果進(jìn)行判斷,成功則延遲1秒之后顯示獲取天氣狀態(tài),最后輸出“正在獲取天氣”,進(jìn)入下一階段。(3)天氣信息獲取階段獲取天氣數(shù)據(jù),設(shè)備通過API從互聯(lián)網(wǎng)獲取實(shí)時(shí)溫度、濕度、天氣狀況的天氣狀況并對(duì)獲取結(jié)果進(jìn)行判斷。失敗分支:打印失敗信息,在OLED顯示“天氣獲取失敗”,用于提示網(wǎng)絡(luò)異常。延遲1秒。返回true,此處邏輯為不管天氣獲取是否失敗都返回“true”使主流程整體完成。成功分支:顯示天氣數(shù)據(jù),將解析后的天氣信息顯示在屏幕上。返回true,標(biāo)志主流程成功結(jié)束,表示設(shè)備可以進(jìn)入循環(huán)執(zhí)行的模式。流程圖如4-2所示。圖4-2主程序流程圖循環(huán)程序的編寫主循環(huán)Loop中的持續(xù)運(yùn)行邏輯是通過循環(huán)檢測與條件判斷,設(shè)備能夠收到并反饋網(wǎng)絡(luò)連接狀態(tài)的變化,并定時(shí)獲取數(shù)據(jù),及時(shí)反饋。主要分為以下幾個(gè)核心模塊:對(duì)WiFi連接狀態(tài)維護(hù),實(shí)時(shí)監(jiān)測網(wǎng)絡(luò)的連接,WiFi斷連時(shí)自動(dòng)嘗試恢復(fù)里連接。定時(shí)更新天氣,每10分鐘獲取一次天氣數(shù)據(jù),避免頻繁請(qǐng)求服務(wù)器。每秒更新一次顯示的內(nèi)容,屏幕進(jìn)行動(dòng)態(tài)刷新。(1)Wi-Fi連接檢測與恢復(fù):循環(huán)入口:程序進(jìn)入主循環(huán)后,首先檢查當(dāng)前WiFi的連接狀態(tài)。這個(gè)步驟是后續(xù)所有操作的重要前提。WiFi斷連處理:當(dāng)條件分支為WiFi未連接時(shí),先對(duì)OLED進(jìn)行清屏,再在屏幕上輸出“WiFi斷聯(lián)”的提示,最后顯示SSID,展示設(shè)備嘗試連接的WiFi的名稱,輔助進(jìn)行排查網(wǎng)絡(luò)連接的問題。重新同步網(wǎng)絡(luò)服務(wù):嘗試重新初始化WiFi模塊或切換備用網(wǎng)絡(luò)配置,包括調(diào)用WiFi.reconnect()函數(shù)來重新連接網(wǎng)絡(luò)和切換到備用SSID等待配置。再次檢測連接狀態(tài):循環(huán)返回的循環(huán)入口,持續(xù)監(jiān)測網(wǎng)絡(luò)直到恢復(fù)連接。另一個(gè)條件分支為WiFi已連接時(shí),直接進(jìn)入后續(xù)功能模塊,執(zhí)行時(shí)間同步與天氣數(shù)據(jù)更新。(2)時(shí)間管理與天氣更新獲取當(dāng)前時(shí)間:通過NTP同步和設(shè)備內(nèi)部時(shí)鐘來獲取當(dāng)前時(shí)間戳,用于判斷是否需要觸發(fā)更新操作。天氣更新條件判斷:第一個(gè)條件分支為距離上次更新超過10分鐘,則會(huì)觸發(fā)天氣更新,向天氣API發(fā)送請(qǐng)求,獲取實(shí)時(shí)天氣狀況數(shù)據(jù)。更新結(jié)果處理為更新屏幕的顯示,將最新天氣信息輸出至OLED。并且記錄更新時(shí)間,將當(dāng)前時(shí)間保存為“上次天氣更新時(shí)間”,用于下一次條件的判斷。無論成功與否,流程繼續(xù)執(zhí)行后續(xù)屏幕刷新的邏輯。另一條件分支為未超過10分鐘就跳過天氣的更新,直接進(jìn)入下一個(gè)屏幕的刷新流程。(3)屏幕顯示動(dòng)態(tài)刷新首先進(jìn)行屏幕刷新條件的判斷,第一個(gè)條件分支為距離上次刷新超過1秒,進(jìn)行更新屏幕顯示,根據(jù)最新的天氣數(shù)據(jù)信息來刷新OLED上顯示的內(nèi)容。記錄刷新的時(shí)間,保存當(dāng)前的時(shí)間戳,控制下一次刷新時(shí)間間隔。另一條件分支為上一次屏幕更新時(shí)間未超過一秒鐘時(shí),則跳過本次刷新返回循環(huán)程序的開始重新進(jìn)入。流程圖如圖4-3所示。圖4-3循環(huán)程序流程圖子程序的設(shè)計(jì)子程序分為串口通信模塊、Wi-Fi模塊、OLED模塊、NTP模塊、天氣模塊程序的分別編寫。串口通信模塊(1)Serial庫串口模塊代碼的編寫需要用到Serial庫,它是用于串行通信的一個(gè)重要庫。能讓Arduino板與計(jì)算機(jī)或其他設(shè)備進(jìn)行串行數(shù)據(jù)傳輸和調(diào)試。通過串口監(jiān)視器,用戶可以實(shí)時(shí)查看Arduino發(fā)送的數(shù)據(jù),或向Arduino發(fā)送指令。在本次設(shè)計(jì)中所使用到的與庫有關(guān)的代碼的說明如下初始化串口通信模塊Serial.begin(baud_rate):初始化串口通信,在本次設(shè)計(jì)中用到的波特率為115200。發(fā)送數(shù)據(jù)Serial.print(data):發(fā)送數(shù)據(jù)到串口,不自動(dòng)換行。Serial.println(data):發(fā)送數(shù)據(jù)到串口,在數(shù)據(jù)后添加換行符。(2)Serial程序的編寫在serial.h中程序的編寫為首先是初始化串口通信,設(shè)置波特率為115200,其次打印調(diào)試信息到串口,并自動(dòng)添加時(shí)間戳。在serial.cpp中設(shè)置波特率并且打印格式時(shí)間戳的消息內(nèi)容。流程如圖4-4所示。圖4-4串口程序流程圖WiFi模塊程序設(shè)計(jì)(1)WiFi庫WiFi庫是用于Arduino平臺(tái)上的WiFi模塊ESP8266進(jìn)行無線網(wǎng)絡(luò)連接的一個(gè)重要庫。本次設(shè)計(jì)中所需要的WiFi連接、網(wǎng)絡(luò)配置和數(shù)據(jù)傳輸?shù)裙δ芏加蛇@個(gè)庫輔助。其中有關(guān)WiFi庫的代碼及功能的闡述如下。模式設(shè)置Wi-Fi.mode(mode):設(shè)置Wi-Fi的工作模式。WIFI_STA:站點(diǎn)模式,設(shè)備作為客戶端連接到路由器。WIFI_AP:接入點(diǎn)模式,設(shè)備作為熱點(diǎn)供其他設(shè)備連接。WIFI_AP_STA:同時(shí)支持站點(diǎn)和接入點(diǎn)模式。連接管理WiFi.begin(ssid,password):開始連接到指定的WiFi網(wǎng)絡(luò),ssid是網(wǎng)絡(luò)名password是網(wǎng)絡(luò)密碼。WiFi.disconnect():斷開當(dāng)前的WiFi連接。WiFi.status():獲取當(dāng)前Wi-Fi的連接狀態(tài),返回值包括WL_CONNECTED(已連接)、WL_DISCONNECTED(未連接)等。網(wǎng)絡(luò)信息WiFi.localIP():獲取設(shè)備的本地IP地址。WiFi.SSID():獲取當(dāng)前連接的網(wǎng)絡(luò)SSID。WiFi.RSSI():獲取當(dāng)前連接的信號(hào)強(qiáng)度。(2)具體程序的設(shè)計(jì)WiFi.h程序編寫的邏輯為開始執(zhí)行wifiConnect進(jìn)行設(shè)置WiFi模式為STA模式再調(diào)用WiFi.begin(ssid,password)函數(shù),循環(huán)檢查連接狀態(tài),最后判斷是否連接成功,如果成功,返回true,如果超時(shí),返回false結(jié)果。代碼功能概述為引入ESP8266WiFi.h文件來實(shí)現(xiàn)ESP8266的WiFi功能。通過宏定義默認(rèn)的WIFI_SSID和WIFI_PASSWORD來配置預(yù)設(shè)。聲明wifiConnect函數(shù),支持自定義的SSID和密碼,返回連接狀態(tài)。流程如圖4-5所示。圖4-5WiF.h程序流程圖WiFi.cpp文件程序的編寫邏輯為wifi函數(shù)的實(shí)現(xiàn),WiFi.mode(WIFI_STA)用于設(shè)置WiFi為站點(diǎn)模式,即設(shè)備作為客戶端連接到路由器。WiFi.disconnect()用于斷開當(dāng)前可能的連接。用delay(100)延時(shí),讓W(xué)iFi模塊穩(wěn)定。serialPrint("WiFi模塊初始化完成")用于調(diào)用串口打印函數(shù),輸出初始化完成的信息。接著是wifiConnect函數(shù)的實(shí)現(xiàn)函數(shù)接受兩個(gè)參數(shù)ssid和password,默認(rèn)使用預(yù)定義的宏WIFI_SSID和WIFI_PASSWORD。調(diào)用WiFi.begin(ssid,password)開始連接WiFi網(wǎng)絡(luò)。進(jìn)入一個(gè)循環(huán),檢查連接狀態(tài),最多等待10秒。連接成功則打印連接成功的消息和獲取的IP地址,返回“true”。如果超時(shí)仍未連接,打印失敗消息,返回“false”。設(shè)計(jì)流程如圖4-6所示。圖4-6WiFi.cpp程序流程圖OLED模塊程序設(shè)計(jì)(1)U8g2庫U8g2庫為圖形庫,本次設(shè)計(jì)中使用它來處理顯示控制OLED屏幕,而且它適用于OLED的I2C接口,能提供中文字體的支持,滿足了本設(shè)計(jì)的顯示需求。支持雙緩沖U8g2模式和單緩沖U8x8模式,來適應(yīng)不同的內(nèi)存需求和性能要求。U8g2庫的重點(diǎn)代碼的編寫及功能的闡述如下。初始化和設(shè)置begin():在setup()函數(shù)中調(diào)用,確保在使用其他繪圖函數(shù)之前已正確初始化顯示器。setFont(constuint8_t*font):font是字體的指針,用于設(shè)置當(dāng)前使用的字體。enableUTF8Print():在初始化時(shí)調(diào)用,啟用UTF-8編碼支持,使print()函數(shù)能夠正確顯示UTF-8編碼的字符,從而確保顯示器能夠處理多語言字符。文本的顯示setCursor(intx,inty):用于設(shè)置文本光標(biāo)的位置,x,y為光標(biāo)的起始坐標(biāo)。print():在setCursor()設(shè)置的光標(biāo)位置后使用,用于在顯示器上打印文本。drawStr(intx,inty,constchar*s):在指定位置繪制字符串,x,y為字符串的起始坐標(biāo),s為要繪制的字符串。緩沖區(qū)管理clearBuffer():在開始新的繪制之前調(diào)用,用來清空顯示緩沖區(qū)。sendBuffer():在完成所有繪制操作后調(diào)用,以將緩沖區(qū)內(nèi)容發(fā)送到顯示器。(2)具體程序的設(shè)計(jì)在oled.h代碼的編寫中主要為初始化OLED,調(diào)用u8g2的begin()設(shè)置字體和UTF8支持。顯示文本:清除緩沖區(qū)并設(shè)置光標(biāo)位置,打印文本,發(fā)送緩沖區(qū)到屏幕和清除顯示這三塊。最后串口輸出初始化信息。在oled.cpp中代碼的編寫流程為初始化U8g2驅(qū)動(dòng),這一步包含了清空顯示緩沖區(qū)、設(shè)置中文字體、啟用UTF8編碼支持、發(fā)送空緩沖區(qū)到屏幕以及串口輸出完成信息這幾個(gè)步驟。OLED顯示流程為置文本坐標(biāo)(x,y)、將文本寫入緩沖區(qū)、發(fā)送緩沖區(qū)到屏幕這幾步。OLED清屏流程為清空顯示緩沖區(qū)再發(fā)送空緩沖區(qū)到屏幕。流程如圖4-7所示。圖4-7OLED程序流程圖NTP模塊程序設(shè)計(jì)NTP在本次設(shè)計(jì)中的主要作用是確保網(wǎng)絡(luò)中所有設(shè)備的時(shí)間保持一致。它從時(shí)間服務(wù)器獲取精確的時(shí)間信息來調(diào)整本地時(shí)鐘;使用分層結(jié)構(gòu),每個(gè)層級(jí)的服務(wù)器從上一級(jí)獲取時(shí)間信息,能提供精確的時(shí)間并進(jìn)行自我調(diào)整。(1)NTPClient類NTPClient是用于與NTP服務(wù)器進(jìn)行通信的客戶端類,它提供的接口用于實(shí)現(xiàn)時(shí)間同步功能。NTPClient的構(gòu)造函數(shù)用于初始化客戶端實(shí)例,配置與NTP服務(wù)器的通信細(xì)節(jié)。以下為其重要結(jié)構(gòu)的和功能的說明UDP&udp:引用一個(gè)UDP對(duì)象,本設(shè)計(jì)中為WiFiUDP,用于通過UDP協(xié)議進(jìn)行通信。constchar*poolServerName:NTP服務(wù)器的地址,默認(rèn)是""。inttimeOffset:時(shí)區(qū)偏移量,以秒為單位。用于調(diào)整時(shí)間以匹配本地時(shí)區(qū)。intupdateInterval:自動(dòng)更新時(shí)間的間隔,以毫秒為單位。NTPClient的常用函數(shù)可用于初始化、更新和獲取時(shí)間,以下為其具體說明。begin():初始化NTP客戶端,準(zhǔn)備與NTP服務(wù)器進(jìn)行通信。update():從NTP服務(wù)器獲取最新的時(shí)間戳,并更新內(nèi)部時(shí)間。通常在需要獲取最新時(shí)間之前調(diào)用。forceUpdate():強(qiáng)制從NTP服務(wù)器獲取時(shí)間getEpochTime():返回當(dāng)前時(shí)間的epoch時(shí)間戳。getFormattedTime():返回格式化的時(shí)間字符串。getHours():返回當(dāng)前時(shí)間的小時(shí)部分。getMinutes():返回當(dāng)前時(shí)間的分鐘部分。getSeconds():返回當(dāng)前時(shí)間的秒部分。setTimeOffset(intoffset):設(shè)置時(shí)區(qū)偏移量,以秒為單位。用于調(diào)整時(shí)間以匹配本地時(shí)區(qū)。setUpdateInterval(unsignedlonginterval):設(shè)置自動(dòng)更新時(shí)間的間隔,以毫秒為單位。用于控制從NTP服務(wù)器更新一次的時(shí)間。(2)gmtime函數(shù)的說明gmtime函數(shù)用于將時(shí)間戳epochtime轉(zhuǎn)換為協(xié)調(diào)世界時(shí)UTC的時(shí)間結(jié)構(gòu)。它是time.h頭文件的一部分。structtm*gmtime(consttime_t*timer):指向一個(gè)time_t類型的指針,表示epoch時(shí)間。返回值為返回一個(gè)指向tm結(jié)構(gòu)的指針,該結(jié)構(gòu)包含了轉(zhuǎn)換后的UTC時(shí)間信息。tm結(jié)構(gòu)指針指向的是一個(gè)靜態(tài)分配的內(nèi)存區(qū)域,因此每次調(diào)用gmtime后,之前的結(jié)果會(huì)被覆蓋。而本設(shè)計(jì)需要保留多個(gè)時(shí)間轉(zhuǎn)換結(jié)果,所以要將返回的tm結(jié)構(gòu)復(fù)制到用戶定義的結(jié)構(gòu)中。tm結(jié)構(gòu)包含以下幾個(gè)。inttm_sec:秒,范圍為0到59。inttm_min:分鐘,范圍為0到59。inttm_hour:小時(shí),范圍為0到23。inttm_mday:一個(gè)月中的第幾天,范圍為1到31。inttm_mon:月份,范圍為0到11。inttm_year:自1900年以來的年數(shù)。(3)具體程序的設(shè)計(jì)在ntp.h中代碼編寫的邏輯為先初始化NTP客戶端,設(shè)置NTP服務(wù)器和時(shí)區(qū),獲取當(dāng)前時(shí)間,獲取當(dāng)前日期和同步網(wǎng)絡(luò)時(shí)間。流程如圖4-8所示。圖4-8ntp.h程序流程圖在ntp.cpp文件中先創(chuàng)建UDP和NTP客戶端實(shí)例在其中完成創(chuàng)建UDP和NTP客戶端實(shí)例,使用阿里云NTP服務(wù)器,設(shè)置東八區(qū)更新時(shí)間、獲取時(shí)分秒并格式化時(shí)間字符串、將epoch時(shí)間轉(zhuǎn)換為日期并格式化日期字符串通過StringntpGetTime()函數(shù)同步設(shè)備的系統(tǒng)時(shí)間并嘗試強(qiáng)制更新時(shí)間。流程如圖4-9所示。圖4-9ntp.cpp程序流程圖天氣模塊的程序設(shè)計(jì)(1)重要參數(shù)的獲取從心知天氣平臺(tái)獲得兩個(gè)重要參數(shù):城市代碼、API和HTTP請(qǐng)求鏈接/v3/weather/daily.json?key=%s&location=%s&language=zh-Hans&unit=c&start=0&days=1。(2)HTTPClient類HTTPClient是一個(gè)用于在Arduino中進(jìn)行HTTP通信的庫。提供簡單的接口來發(fā)送HTTP請(qǐng)求和接收響應(yīng),支持常見的HTTP方法。主要功能為HTTP請(qǐng)求,客戶端發(fā)送HTTP請(qǐng)求,與服務(wù)器通信;請(qǐng)求頭和參數(shù),設(shè)置自定義HTTP請(qǐng)求頭。支持發(fā)送帶有參數(shù)的請(qǐng)求;響應(yīng)處理,能夠接收和處理包括響應(yīng)碼和響應(yīng)體HTTP響應(yīng)。并提供方法來獲取響應(yīng)的內(nèi)容長度、類型等信息。在本次設(shè)計(jì)使用的函數(shù)說明如下。begin():初始化HTTP請(qǐng)求,指定目標(biāo)URL??梢灾剌d以支持HTTPS和自定義端口。addHeader():添加自定義HTTP請(qǐng)求頭。GET():發(fā)送HTTPGET請(qǐng)求,返回HTTP響應(yīng)碼。POST():發(fā)送HTTPPOST請(qǐng)求,帶有可選的請(qǐng)求體。PUT():發(fā)送HTTPPUT請(qǐng)求,帶有可選的請(qǐng)求體。DELETE():發(fā)送HTTPDELETE請(qǐng)求。getString():獲取HTTP響應(yīng)體的內(nèi)容作為字符串。end():結(jié)束HTTP請(qǐng)求。(3)JSON相關(guān)函數(shù)JSON使用鍵值對(duì)的形式來表示數(shù)據(jù),用于構(gòu)建復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。在Web應(yīng)用程序中作為客戶端和服務(wù)器之間的數(shù)據(jù)交換格式,本次設(shè)計(jì)中將用于API通信。deserializeJson用于將JSON格式的字符串解析為JSON文檔對(duì)象。該函數(shù)是處理JSON數(shù)據(jù)的核心工具,在本次設(shè)計(jì)中,用于從網(wǎng)絡(luò)數(shù)據(jù)源中讀取和解析JSON數(shù)據(jù)。以下為對(duì)該函數(shù)的說明:函數(shù)原型:重要參數(shù):JsonDocument&doc:引用一個(gè)JsonDocument對(duì)象,用于存儲(chǔ)解析后的JSON數(shù)據(jù)。constchar*input:指向要解析的JSON字符串。constString&input:ArduinoString對(duì)象,包含要解析的JSON數(shù)據(jù)。Stream&input:ArduinoStream對(duì)象,支持從串口、網(wǎng)絡(luò)流中讀取JSON數(shù)據(jù)。char*input,size_tinputSize:指向JSON數(shù)據(jù)的字符數(shù)組及其大小。返回值:DeserializationError:返回一個(gè)DeserializationError對(duì)象用于指示解析結(jié)果。用error.c_str()來獲取錯(cuò)誤信息。(4)天氣模塊的代碼編寫在weather.h代碼的編寫中分為心知天氣API配置、天氣信息結(jié)構(gòu)體、初始化天氣模塊,設(shè)置默認(rèn)值;從API獲取并更新天氣信息并更新是否成功;獲取當(dāng)前天氣信息這幾個(gè)部分并返回到當(dāng)前天氣的結(jié)構(gòu)體。心知天氣API配置包括API密鑰、城市代碼以及存儲(chǔ)天氣API請(qǐng)求地址這幾個(gè)宏定義天氣信息結(jié)構(gòu)體包括城市名稱、天氣狀況和溫濕度這幾塊。流程如圖4-10所示。圖4-10weather.h程序流程圖在weather.cpp代碼的編寫中分為存儲(chǔ)天氣信息的全局變量;初始化天氣模塊并設(shè)置默認(rèn)值;構(gòu)建API請(qǐng)求URL;HTTP請(qǐng)求與數(shù)據(jù)處理這幾塊。HTTP請(qǐng)求與數(shù)據(jù)處理分為解析JSON數(shù)據(jù)、更新天氣信息、輸出調(diào)試信息這幾塊。流程如圖4-11所示圖4-11weather.cpp程序流程圖
制作與測試硬件的制作與調(diào)試在電路的連接前需要用簡單的程序?qū)LED屏幕和開發(fā)板進(jìn)行測試,確定屏幕能成功點(diǎn)亮并顯示文字。再測試開發(fā)板的WiFi模塊功能是否完好。將提前準(zhǔn)備的例程燒錄進(jìn)開發(fā)板中編譯下載,對(duì)串口監(jiān)視器波特率進(jìn)行設(shè)置,觀察開發(fā)板能否尋找到附近的WiFi信號(hào)并顯示在串口監(jiān)視器里面,之后將開發(fā)板連網(wǎng),最后測試WiFi網(wǎng)絡(luò)控制開發(fā)板端口輸出狀態(tài)。本設(shè)計(jì)硬件電路的連接較為簡潔,在理解開發(fā)板和OLED引腳功能的基礎(chǔ)上對(duì)其進(jìn)行布線和焊接。在確保電路連接正確的基礎(chǔ)上。對(duì)連接后的電路進(jìn)行測試能否上電和正確顯示文字。功能測試(1)串口模塊和WiFi模塊的程序編寫完成后先燒錄,再觀察WiFi能否和連接熱點(diǎn)。一開始顯示W(wǎng)iFi連接失敗,因?yàn)閑sp8266模塊連接的2.4Ghz的網(wǎng)絡(luò),因此首先確認(rèn)要先檢查程序中SSID和密碼是否正確,再確認(rèn)所使用的網(wǎng)絡(luò)能否提供2.4G的服務(wù)。自動(dòng)最后進(jìn)行調(diào)整之后即可順利連接網(wǎng)絡(luò)并顯示IP地址。遇到在WiFi連接過程中斷連的情況則設(shè)計(jì)自動(dòng)重新連接。調(diào)試結(jié)果如圖5-1、5-2和5-3所示。圖5-1連接失敗圖5-2連接成功圖5-3自動(dòng)重連(2)在WiFi連接成功后需要獲取準(zhǔn)確的時(shí)間信息,進(jìn)行同步網(wǎng)絡(luò)時(shí)間,并給出時(shí)間同步成功的提示,便于后續(xù)調(diào)試。具體結(jié)果如圖5-4和圖5-5所示圖5-4時(shí)間同步提示圖5-5成功后顯示時(shí)間(3)OLED上文字布局有問題,在屏幕上要展現(xiàn)的信息布局凌亂。發(fā)現(xiàn)是在OLED部分程序的編寫時(shí),坐標(biāo)部分的代碼沒有設(shè)計(jì)清晰,最后對(duì)布局進(jìn)行調(diào)整,重新修改了程序部分x、y、z的坐標(biāo)最后調(diào)整為以下顯示效果最佳。結(jié)果如圖5-6和圖5-7所示圖5-6布局調(diào)整前圖5-6合理布局(4)WiFi連接之后要獲取天氣信息,而天氣信息需要IP,因此一開始遇到問題是天氣無法正確顯示,進(jìn)行調(diào)整后雖然獲取了天氣卻發(fā)現(xiàn)與本地天氣不同。對(duì)程序進(jìn)行檢查后發(fā)現(xiàn)的地址接口中城市代碼改錯(cuò)了。最后在確認(rèn)手動(dòng)JSON解析了獲取天氣接口后確定對(duì)接口的改動(dòng)沒有問題后正確顯示了本地天氣。結(jié)果如圖5-8和圖5-9所示圖5-7重新獲取天氣信息圖5-8顯示正確的天氣信息
結(jié)論本設(shè)計(jì)完成了天氣時(shí)鐘的設(shè)計(jì)的基本要求,有一定的成果和經(jīng)驗(yàn),但也存在著不足之處。從硬件部分的選型到完成了硬件部分電路的設(shè)計(jì)與連接。電路完成后就是對(duì)整體程序框架的搭建,使用Arduino開發(fā)平臺(tái)進(jìn)行設(shè)計(jì),主要分為主程序與循環(huán)程序的設(shè)計(jì),在準(zhǔn)備好相關(guān)函數(shù)的知識(shí)后進(jìn)行整體程序設(shè)計(jì)的邏輯與流程的把握。在子程序中分為各個(gè)模塊進(jìn)行逐一實(shí)現(xiàn)。首先是先是了解了最基本的串口知識(shí),通過對(duì)串口模塊程序的編寫將電路通過串口連接到計(jì)算機(jī)。其次本次設(shè)計(jì)最重要的Wi-Fi模塊程序?qū)崿F(xiàn)ESP8266連接網(wǎng)絡(luò),將設(shè)備設(shè)為站點(diǎn)模式,作為客戶端連接到路由器。編寫程序?qū)崿F(xiàn)通過API來獲取本地的天氣信息。通過HTTP請(qǐng)求用與服務(wù)器進(jìn)行通信獲取精準(zhǔn)的時(shí)間信息來調(diào)整本地時(shí)鐘。設(shè)計(jì)主程序和循環(huán)程序的流程,將各個(gè)模塊的程序?qū)懭胫鞒绦?。因?yàn)槔碚摵图夹g(shù)的不足,本設(shè)計(jì)還存在一些不足。在OLED顯示方面,顯示信息不夠豐富,僅僅展現(xiàn)了IP和當(dāng)天天氣以及溫濕度。在信息的布局方面也沒有使得信息更加突出,不夠美觀。通過WiFi聯(lián)網(wǎng)時(shí),更改連接的網(wǎng)絡(luò)與密碼時(shí)需要在程序中對(duì)相關(guān)代碼進(jìn)行修改,以及WiFi的連接較慢而且不夠穩(wěn)定容易??梢詫⒃O(shè)備作為熱點(diǎn)與手機(jī)或者計(jì)算機(jī)連接,或者同時(shí)支持站點(diǎn)和接入點(diǎn)模式。從而使得設(shè)備進(jìn)行網(wǎng)絡(luò)連接更加便捷。
參考文獻(xiàn)AydemirF,Ba??ift?iF.PerformanceandAvailabilityAnalysisofAPIDesignTechniquesforAPIGateways[J].ArabianJournalforScienceandEngineering,2024,(prepublish):1-14.王銀,張紹杰,樊夏漪.LoRa技術(shù)在智能
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年一級(jí)建造師之一建民航機(jī)場工程實(shí)務(wù)考試題庫300道及1套完整答案
- 2026年注冊(cè)會(huì)計(jì)師備考題庫附答案(精練)
- 2026年安全員考試題庫300道含答案(能力提升)
- 2026年二級(jí)建造師之二建機(jī)電工程實(shí)務(wù)考試題庫500道附答案(綜合卷)
- 2026年初級(jí)經(jīng)濟(jì)師之初級(jí)經(jīng)濟(jì)師財(cái)政稅收考試題庫300道【黃金題型】
- 2026年注冊(cè)巖土工程師考試題庫200道及參考答案(新)
- 古建琉璃工安全綜合評(píng)優(yōu)考核試卷含答案
- 2026年一級(jí)注冊(cè)建筑師之建筑材料與構(gòu)造考試題庫500道完整參考答案
- 2026年一級(jí)建造師之一建民航機(jī)場工程實(shí)務(wù)考試題庫300道附參考答案【輕巧奪冠】
- 城市軌道交通行車值班員崗前成果轉(zhuǎn)化考核試卷含答案
- 語言接觸語音變異-洞察及研究
- 保障性住房政策宣傳課件
- 常見脫發(fā)疾病診療概述
- 紅色景區(qū)展館游覽服務(wù)禮儀制作人江西旅游商貿(mào)職業(yè)劉歡01課件
- 生態(tài)教育心理干預(yù)-洞察及研究
- 電梯井鋼結(jié)構(gòu)施工合同(2025版)
- 抽成合同協(xié)議書范本
- 生物利用度和生物等效性試驗(yàn)生物樣品的處理和保存要求
- 全生命周期健康管理服務(wù)創(chuàng)新實(shí)踐
- 2025-2030年中國寵物疼痛管理行業(yè)市場現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- epc甲方如何管理辦法
評(píng)論
0/150
提交評(píng)論