??作者:一只大喵咪1201
??專欄:《智能家居項目》
??格言:你只管努力,剩下的交給時間!
這篇文章中,本喵將使用RT-Thread Studio
來實現(xiàn)這個智能家居的項目,最終效果和前面的裸機版本以及FreeRTOS
版本一樣。在這里本喵將讓大家體驗到RT-Thread Studio
的便利。
??創(chuàng)建工程
首先打開 RT-Thread Studio
軟件,如何安裝該軟件本喵就不講解了,直接去官網(wǎng)下載安裝即可。
如上圖,打開軟件以后,關閉掉歡迎界面,然后按照圖中的步驟來操作:
- 點擊左上角文件中的新建,選擇
RT-Thread
項目。
RT-Thread
項目是標準工程,它包含RT-Thread的所有功能,可以安裝大量的組件。RT-Thread Nano
項目是簡化版本,它包含的功能和FreeRTOS
一樣,僅支持任務,任務間通信等等,不支持組件。
- 輸入工程名字和工程文件保存路徑。
- 如果使用缺省位置,則會保存到
RT-Thread Studio
的安裝路徑下的某一個文件中。
- 選擇芯片型號和控制臺端口以及調(diào)試端口。
- 根據(jù)芯片的廠商,選擇相應的型號,本喵這里選擇的是STM32F103ZE。
- 選擇控制臺所用的串口,該控制臺就像是板子上運行的一個
shell
。- 選擇調(diào)試器以及接口類型,有
ST-Link
和J-Link
等等,根據(jù)自己的設備來選擇。
- 最后點擊完成。
如上圖,此時一個工程就創(chuàng)建好了,左邊是項目資源管理器,包含該工程中的所有文件。
RT-Thread Setting
:雙擊這個會出現(xiàn)一個圖形化界面,用來安裝各種組件,后面會用到。CubeMX Setting
:雙擊這個就會打開CubeMX
,可以配置芯片的外設,生成HAL
庫的代碼。drv_clk.c
:在drivers
目錄下的drv_clk.c
中,可以修改時鐘源,生成的工程默認使用的是內(nèi)部高速時鐘HSI
,可以修改代碼配置成外部時鐘源HSE
,本喵這里就不配置了,直接使用內(nèi)部高速時鐘。
如上圖所示,將工程進行編譯,然后將程序下載到開發(fā)板中。
如上圖所示,將開發(fā)板的uart1
和電腦相連,并且打開串口助手,可以看到內(nèi)核的打印信息(綠色框),和main
線程的打印信息,紅色框中。
- 在
RT-Thread
中,任務被叫做線程。main
函數(shù)僅是其中的一個線程。
main
函數(shù)在applications
目錄下,可以看到,該函數(shù)中并沒有像FreeRTOS
一樣的內(nèi)核初始化和啟動調(diào)度器等內(nèi)容,僅僅是一個干干凈凈的main
函數(shù)。
??RT-Thread啟動流程
如上圖所示RT-Thread
的啟動流程,本喵大概介紹一下:
-
第1個文件:startup_stm32f103xe.s
- 調(diào)用
SystemInit
:系統(tǒng)初始化,比如初始化時鐘 - 調(diào)用
__main
:重定位,比如把代碼段從Flash復制到內(nèi)存,然后執(zhí)行$Sub$$main
- 調(diào)用
-
第2個文件:src\components.c
- 執(zhí)行一系列的初始化
- 調(diào)用
rt_application_init
- 初始化RTT組件(包括創(chuàng)建SHELL線程):因為有SHELL線程,所以即使main函數(shù)為空,也是可以操作開發(fā)板的
- 調(diào)用
main
函數(shù):可以寫為空函數(shù)
- 啟動調(diào)度器:
rt_system_scheduler_start
位置①處創(chuàng)建了SHELL線程,用戶可以在串口上輸入各種命令;所以位置②的main函數(shù)寫為空函數(shù)也是可以的。
??添加DHT11軟件包
如上圖所示,增加DHT11
的軟件包:
- 雙擊項目資源管理器中的
RT-Thread Setting
,彈出一個圖形界面窗口。 - 點擊添加軟件包,彈出軟件包選擇界面。
- 搜索
DHT11
,出現(xiàn)多個軟件包。 - 找到下載次數(shù)最多的(綠色框),然后點擊相應軟件包的添加。
如上圖,此時軟件包這里就會有一個dht11
的圖標,然后按下快捷鍵Ctrl + s
保存,就會自動下載軟件包并且構建到工程中。
如上圖所示,此時在packages
目錄下就有一個dht11-latest
的目錄,里面包含幾個.c
和.h
文件。其中dht11_sample.c
是一個樣例。
打開dht11_sample.c
后,將#include "drv_gpio.h"
修改成#include "drv_common.h"
,這是由于版本原因,新版本和gpio
相關的定義都放在了drv_common.h
中。
還要修改讀取DHT11
溫濕度數(shù)據(jù)的引腳,生成工程后默認使用的是PB12
,查看原理圖使用自己對應的引腳,本喵這里是PF6
。
如上圖,在編譯的時候會報錯找不到sensor.h
頭文件,所以需要將頭文件的路徑告訴編譯器。
如上圖,sensor.h
頭文件位于sensors
文件夾中。點擊最上邊的c/c++項目
,找到該文件,然后右鍵點擊,在彈出的界面中進行添加構建。
- 添加構建就是在編譯的時候,要編譯這部分文件,否則不會編譯這里的文件。
如上圖所示,點擊標號1的設置,然后選擇標號2的路徑和符合,最后添加sensor.h
頭文件所在路徑。
//${ProjName}
表示的是工程文件名字,后面的是路徑。
如上圖所示,將程序重新編譯好下載到板子中以后,在串口助手上就可以看到輸出的溫濕度數(shù)據(jù)了。
如上圖所示,在我們安裝軟件包中的dht11_sample.c
中,專門有一個線程read_temp_entry
讀取溫濕度數(shù)據(jù)的線程,不斷調(diào)用rt_device_read
來讀取DHT11
溫濕度傳感器的數(shù)據(jù),并且打印出來。
rt_device_read
是一個標準接口,就像寫C語言代碼中的open
函數(shù)一樣。DHT11
的驅(qū)動框架是怎樣的,本喵就不在這里講解了。
此時我們就實現(xiàn)了溫濕度的讀取,可以看到,整個過程中也沒有寫多少代碼,RT-Thread Studio
中的軟件包幫我們實現(xiàn)了這部分代碼。
??添加ESP8266軟件包
如上圖所示,按照1~6
的步驟添加一個AT
設備,這是用來和ESP8266
通信的。
- 第6步中,填入WIFI模塊要連的WIFI名稱和密碼。
- 更改AT設備使用的串口為
uart3
,根據(jù)原理圖來確定。
如上圖所示,此時就自動有了一個AT DEVICE
軟件包和一個AT
客戶端組件(紅色框),然后點擊綠色框中的libc
使能C語言庫,因為要用到C語言庫中的函數(shù)。最后按下Ctrl + s
保存。
如上圖所示,要在drivers
目錄下的board.h
中定義uart3
,仿照uart1
定義即可,根據(jù)原理圖定義使用的引腳。
如上圖,將main.c
和dht11_sample.c
中的打印信息注釋掉,讓它不要干擾串口助手的輸出。
如上圖所示,將程序編譯下載到開發(fā)板后,可以從串口助手看到WIFI連接成功的消息。
在控制臺使用ifconfig
可以看到獲得了IP地址,并且可以使用ping
命令和www.baidu.com
進行網(wǎng)絡通信。此時ESP8266
就設置成功了。
??添加MQTT軟件包
MQTT
是一種網(wǎng)絡通信協(xié)議,適合于少量數(shù)據(jù)的傳輸,具體原理本喵就不在這里介紹了。
如上圖所示,按照步驟1~3
添加pahomqtt
軟件包。
如上圖所示,在軟件包處會有一個Paho MQTT
,將鼠標移上去以后點擊出現(xiàn)的配置項(步驟1),然后在彈出的界面中使能MQTT
示例(步驟2)。最后保存配置。
- 每次保存了新的配置以后,
sensor.h
文件又會找不到,這是該軟件的一個BUG,所以需要重新添加路徑和添加構建。
??與服務器建立連接
現(xiàn)在工程就配置好了,此時我們的開發(fā)板就是一個客戶端,接下來就是需要讓開發(fā)板和服務器進行連接和通信了。
如上圖,本喵在阿里云平臺配置了一個設備實例,打開該設備后,點擊里面的MQTT
連接參數(shù)后面的查看(紅色框),然后就會彈出參數(shù)。
如上圖所示,在產(chǎn)品中有默認的訂閱主題和發(fā)布主題,我們就直接訂閱/user/get
這個主題,以及發(fā)布/user/update
這個主題。
如上圖所示,將自動生成的mqtt_sample.c
中的默認MQTT
連接參數(shù)改成自己服務器的。
如上圖所示,在mqtt_sart
函數(shù)中,默認生成的代碼是隨機生成一個客戶端ID,此時我們有固定的客戶端ID,將我們前面服務器中的ID賦值過去。
如上圖所示,將程序編譯并下載到開發(fā)板中后,在串口助手中執(zhí)行help
命令,可以看到有幾個mqtt
打頭的指令。
如上圖所示,在串口助手中執(zhí)行mqtt_start
命令啟動MQTT
,會打印相關成功信息,并且此時服務器設備也顯示在線狀態(tài),說明此時開發(fā)板這個客戶端和服務器MQTT
連接成功。
如上圖所示,在服務器設備中的Topic
列表里,點擊發(fā)布消息,發(fā)布/user/get
主題的消息給開發(fā)板客戶端,然后在彈出來的框中填入發(fā)布的消息,最后點擊完成(步驟1~5
)。
如上圖所示,此時在串口助手上就能看到服務器發(fā)布的信息了。
如上圖所示,在串口助手中使用mqtt_publish
命令發(fā)布消息到服務器。
如上圖所示,在服務器設備中,根據(jù)步驟1~4
可以查看到開發(fā)板客戶端剛剛發(fā)布的消息。
此時我們的開發(fā)板就和服務器成功的建立了連接,并且可以進行通信了。
??服務器控制外設
如上圖代碼所示,在main.c
文件中,定義LED以及風扇的引腳,并在device_init
函數(shù)中進行初始化。
如上圖代碼所示,在device_control_callback
回調(diào)函數(shù)中根據(jù)服務器發(fā)布的消息來控制外設,具體控制細節(jié)和前面FreeRTOS
版本的一樣。
msh_exec
:調(diào)用該函數(shù)和我們在串口助手上輸入命令是一個效果。
如上圖所示,在main
函數(shù)中,讀取溫濕度傳感器的數(shù)據(jù),然后再向服務器發(fā)布,每兩秒進行一次。
- 控制設備的回調(diào)函數(shù)誰在執(zhí)行?
如上圖代碼所示,控制設備的device_control_callback
回調(diào)函數(shù)在mqtt_sub_callback
回調(diào)函數(shù)執(zhí)行。
- 在啟動
mqtt_start
的時候,會專門創(chuàng)建一個線程用來接收服務器發(fā)布的消息。- 當服務器發(fā)布了消息以后,該線程就會讀取,并且調(diào)用
mqtt_sub_callback
函數(shù)。
所以在控制設備的函數(shù)中就可以得到服務器發(fā)布的消息。
如上圖代碼所示,將原本dht11_sample.c
中的dht11_read_temp_sample
從段中移除,不讓該函數(shù)執(zhí)行,因為現(xiàn)在是在main.c
讀取溫濕度數(shù)據(jù)的。
如上圖所示,將程序編譯下載到開發(fā)板中后,等待和服務器建立連接后,可以從服務器的日志信息中查看到開發(fā)板發(fā)布的溫濕度數(shù)據(jù)。
消息格式 | 含義 |
---|---|
{“dev”:“l(fā)amp1”,“status”:“1”} | 點亮LED1,后面的status改為0則熄滅它 dev有多個取值:lamp1,lamp2,lamp3 |
{“dev”:“fan”,“status”:“1”} | 轉(zhuǎn)動風扇,后面的status改為0則停止它 |
{“dev”:“home”,“status”:“1”} | 離開了家,后面的status改為0則表示回家 |
{“Temperature”:28,“Humidity”:88} | 上報溫度、濕度 |
開發(fā)板和服務器進行通信的消息格式如上表所示,在服務器發(fā)布控制消息,開發(fā)板就會做出相應的操作。
如上圖所示,在服務器上發(fā)布一個這樣的消息,開發(fā)板上的所有LED燈都會亮,并且風扇也會開始轉(zhuǎn)動,最后面本喵會上傳效果圖。
??小程序控制外設
這里本喵使用百問網(wǎng)的小程序和服務器來控制開發(fā)板。
如上圖所示,在mqtt_sample.c
文件中定義百問網(wǎng)的三元組,不用定義客戶端ID,所以要將前面注釋掉的隨機ID修改回來。
在main.c
中,將發(fā)布消息的主題修改為/topic/humiture
,其他的不用動。
將程序編譯完成后下載到開發(fā)板中,此時開發(fā)板客戶端就會自動和百問網(wǎng)的服務器相連。
如上圖所示,在微信小程序中搜索百問網(wǎng)嵌入式物聯(lián)網(wǎng)
,選擇雙架構,然后就會出現(xiàn)這樣一個頁面。
第一步讓小程序連接服務器,第二部訂閱/topic/humiture
主題,這個主題必須和開發(fā)板發(fā)布的主題一樣。
然后就可以接收到開發(fā)板發(fā)來的溫濕度數(shù)據(jù),如綠色框中的內(nèi)容。
如上圖,點擊這幾個圖形化按鈕就會發(fā)布相應的/topic/ctrl
,該主題是開發(fā)板訂閱的主題。
溫濕度圖標無法點擊,它僅顯示開發(fā)板發(fā)布的溫濕度數(shù)據(jù)。
如上圖所示,點擊小程序中的按鈕,開發(fā)板的串口助手就會接收到訂閱的控制主題消息,并且做出相應的控制。
如上圖,此時開發(fā)板上的燈就亮了。
??總結(jié)
在整個智能家居實現(xiàn)的過程中,本喵自己根本就沒有寫多少代碼,尤其是驅(qū)動層的代碼,就沒有寫過,全部用的是RT-Thread
的軟件包和組件。這就是RT-Thread
的強大之處,它可以屏蔽底層的細節(jié),讓我們注重于上層應用的開發(fā)。文章來源:http://www.zghlxwxcb.cn/news/detail-854010.html
這種通過服務器來實現(xiàn)智能家居,不再像FreeRTOS
一樣小程序和開發(fā)板必須處于同一個局域網(wǎng)中,此時開發(fā)板和小程序可以處于任意一個局域網(wǎng)中。文章來源地址http://www.zghlxwxcb.cn/news/detail-854010.html
- 開發(fā)板和小程序訂閱以及發(fā)布的消息是通過服務器進行轉(zhuǎn)發(fā)的。
到了這里,關于【智能家居項目】RT-Thread版本——DHT11獲取溫濕度 | MQTT上傳到服務器 | 服務器控制外設的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!