作者:Willian Chan
概述:
分布式溫度監(jiān)控系統(tǒng)基于 STM32 系類芯片開發(fā),支持采集多達(dá)六個分節(jié)點的溫度數(shù)據(jù),網(wǎng)關(guān)節(jié)點收集分節(jié)點的數(shù)據(jù)并通過 WIFI 上傳云端遠(yuǎn)程實時監(jiān)視,也可本地連接串口與 PC 端通訊,上位機(jī)實時顯示分節(jié)點數(shù)據(jù)。該系統(tǒng)適用于家庭、辦公室、教室等小面積場所的多點溫度監(jiān)控,無線傳輸距離可達(dá) 100m ~ 500m,具有功耗低,丟包率低,傳輸距離遠(yuǎn)等特點,是一個相當(dāng)實用的設(shè)計。
開發(fā)環(huán)境
擴(kuò)展板:DS18B20數(shù)字溫度傳感器,NRF24L01無線射頻模塊,ESP8266 WIFI模塊
RT-Thread版本:RT-Thread V 4.0.3
開發(fā)工具及版本:MDK 5.27
RT-Thread使用情況概述
內(nèi)核部分:調(diào)度器,信號量,消息隊列。
調(diào)度器:創(chuàng)建多個線程來實現(xiàn)不同的工作。
信號量:用來同步線程。
消息隊列:用來實現(xiàn)線程之間傳遞的數(shù)據(jù)。
組件部分:SPI框架, Sensor框架,SAL 套接字抽象層
SPI框架:使用 SPI 框架來驅(qū)動溫度傳感器,上層代碼可以提高代碼的可重用性。
Sensor框架:為上層提供統(tǒng)一的操作接口,提高上層代碼的可重用性;簡化底層驅(qū)動開發(fā)的難度,只要實現(xiàn)簡單的 ops(operations: 操作命令) 就可以將傳感器注冊到系統(tǒng)上。
SAL 套接字抽象層:組件完成對不同網(wǎng)絡(luò)協(xié)議?;蚓W(wǎng)絡(luò)實現(xiàn)接口的抽象并對上層提供一組標(biāo)準(zhǔn)的 BSD Socket API,這樣開發(fā)者只需要關(guān)心和使用網(wǎng)絡(luò)應(yīng)用層提供的網(wǎng)絡(luò)接口,而無需關(guān)心底層具體網(wǎng)絡(luò)協(xié)議棧類型和實現(xiàn),極大的提高了系統(tǒng)的兼容性,方便開發(fā)者完成協(xié)議棧的適配和網(wǎng)絡(luò)相關(guān)的開發(fā)
軟件包部分:
Webclient:提供設(shè)備與 HTTP Server 的通訊的基本功能。
pahomqtt,:本軟件包是在 Eclipse paho-mqtt 源碼包的基礎(chǔ)上設(shè)計的一套 MQTT 客戶端程序。
Onenet:是 RT-Thread 針對 OneNET 平臺連接做的的適配,通過這個軟件包,可以讓設(shè)備在 RT-Thread 上非常方便的連接 OneNet 平臺,完成數(shù)據(jù)的發(fā)送、接收、設(shè)備的注冊和控制等功能。
cJSON:C語言實現(xiàn)的極簡的解析 JSON 格式的軟件包。
at_device:是由 RT-Thread AT 組件針對不同 AT 設(shè)備的移植文件和示例代碼組成,目前支持的 AT 設(shè)備有:ESP8266、M26、MC20、RW007、MW31、SIM800C 以及 SIM76XX 系列設(shè)備等。
nRF24L01:是一個 RT-Thread 的軟件包,該軟件包提供了 nRF24L01 模塊的驅(qū)動。
硬件框架
MCU 定時讀取 DS180B20 的溫度數(shù)據(jù),然后通過 NRF24L01 傳輸?shù)浇邮展?jié)點,接收節(jié)點把數(shù)據(jù)分別傳輸?shù)皆贫撕蚉C上位機(jī)。
軟件框架說明
本項目使用分布節(jié)點的方式來實現(xiàn)溫度的采集與上傳,從而避免一個節(jié)點的系統(tǒng)崩潰并不影響到其余的節(jié)點,本項目軟件分為兩部分:
第一部分:采集節(jié)點
MCU 上電之后完成板級外設(shè)初始化,并初始化溫度傳感器DS18B20 準(zhǔn)備采集溫度數(shù)據(jù),無線射頻芯片NRF24L01,在一切準(zhǔn)備妥當(dāng)之后,就會定時向接收節(jié)點發(fā)送溫度數(shù)據(jù)。
第二部分:接收節(jié)點
MCU 上電之后首先完成板級外設(shè)的初始化,并初始化 ESP8266 實現(xiàn)與 ONENET 的連接。初始化 NRF24L01 準(zhǔn)備接收來自采集節(jié)點的溫度信息,接收到節(jié)點發(fā)送過來的溫度數(shù)據(jù),分別發(fā)送到 ONENET 平臺和PC 端上位機(jī)。
軟件模塊說明
發(fā)送節(jié)點:
發(fā)送節(jié)點創(chuàng)建了3個線程,1個消息隊列
read_temp_entry:周期性的讀取溫度傳感器的值,并把讀取到的值通過消息隊列發(fā)送
nrf24l01_send_entry:使用消息隊列來接收傳感器檢測到的溫度值,并通過 BRF24L01 發(fā)送到接收節(jié)點
led_shine_entry:LED 在每次發(fā)送成之后,來改變當(dāng)前的狀態(tài),來檢測當(dāng)前系統(tǒng)的運(yùn)行狀態(tài)
接收節(jié)點:
接收節(jié)點創(chuàng)建了6個線程,1個信號量,1個事件集,2個ringbuff,1個郵箱,1個消息內(nèi)存池
nrf24l01_receive_entry: NRF24L01 數(shù)據(jù)接收線程,正確收到數(shù)據(jù)后會發(fā)送WRITE_EVENT_P0事件,然后把數(shù)據(jù)放到 ringbuff,申請一塊內(nèi)存池,然后把數(shù)據(jù)放入內(nèi)存池,最后把內(nèi)存池的首地址放到郵箱。
save_recv_p0_data_entry:保存數(shù)據(jù)線程,接收WRITE_EVENT_P0 事件后,讀取ringbuff0的數(shù)據(jù),保存 節(jié)點0 的溫度與時間戳。
save_recv_p1_data_entry:保存數(shù)據(jù)線程,接收WRITE_EVENT_P1 事件后,讀取ringbuff1的數(shù)據(jù),保存 節(jié)點1 的溫度與時間戳。
onenet_mqtt_init_entry:初始化 onenet_mqtt, mqtt初始化成功之后,釋放信號量告知onenet_upload_data_thread線程可以上傳數(shù)據(jù)了,這里會做循環(huán)處理,周期性的檢查onenet_mqtt的狀態(tài),如果已經(jīng)斷線,就進(jìn)行再次連接。
onenet_upload_data_entry: take信號量的方式,獲取到信號量之后,通過郵箱獲取到的內(nèi)存池首地址去拿到數(shù)據(jù),然后就可以發(fā)數(shù)據(jù)到 onenet云平臺和PC端上位機(jī)。
led_shine_entry:led 閃爍線程,用來檢測當(dāng)前系統(tǒng)的運(yùn)行狀態(tài)。
演示效果
視頻觀看:
代碼地址
(附件為代碼地址,下載后打開可見)
比賽感悟
紙上得來終覺淺,絕知此事要躬行。陸游的這首詩,完美的詮釋了我在這次比賽中的收獲。
時代的發(fā)展,MCU的性能也越來越強(qiáng),萬物互聯(lián)的需求也愈加強(qiáng)烈,使用RTOS來實現(xiàn)物與網(wǎng)的鏈接,是時代發(fā)展的潮流,通過綜合對比,我選擇了國人自主的 RT-Thread。
通過 RT-Thread官網(wǎng)上的文檔中心,我學(xué)習(xí)了 多線程及其調(diào)度、信號量、郵箱、消息隊列、內(nèi)存管理、定時器等,學(xué)完之后,有種感覺就是看過了,我都懂,但是感覺把這些都融合不起來,通過這次比賽的項目實踐,這些知識點已經(jīng)全部融會貫通,我對RTOS也有了全新的認(rèn)識。
另外就是RT-Thread的軟件包非常的好用,如果沒有前人提供的軟件包,我可能不會這么快的完成這個項目,說到這里,由衷的感謝開源社區(qū)大佬們的貢獻(xiàn)。
最后感謝主辦方提供了這么好的一個平臺,不僅能展示自我,也能學(xué)到很多知識,還要感謝論壇上那些解決我問題以及制作軟件包的大佬,希望有朝一日我也能給開源社區(qū)貢獻(xiàn)一份自己力量。