基于CH32V208WB和CH32V003F4的微型氣象站
1.前言
????微型氣象站主要實(shí)現(xiàn)對居住或辦公場所內(nèi)溫度、濕度、大氣壓強(qiáng)和光照等氣象變化實(shí)時監(jiān)測,更為準(zhǔn)確呈現(xiàn)屋內(nèi)或辦公區(qū)域的氣象變化,便于直觀感知。
????微型氣象站由檢測端和接收端兩部分組成。檢測端連接傳感器,將傳感器測量數(shù)據(jù)上報(bào)至騰訊云物聯(lián)網(wǎng)平臺。在騰訊云物聯(lián)網(wǎng)平臺建立數(shù)據(jù)流轉(zhuǎn)規(guī)則,將檢測端上報(bào)的數(shù)據(jù)以MQTT報(bào)文形式轉(zhuǎn)發(fā)至接收端。接收端處理收到的數(shù)據(jù),顯示在液晶屏上。實(shí)現(xiàn)一處檢測,多處查看。

2.硬件構(gòu)成
2.1 檢測端硬件構(gòu)成
??? 檢測端圍繞CH32V208WBU6評估板,外接AHT21B溫濕度傳感器、BMP280壓力傳感器、光敏電阻、1.44"LCD和W25Q64 SPI Flash模塊組成。由于作者非電子行業(yè)從業(yè)者,能力有限,沒有設(shè)計(jì)專門的電路板,所以本項(xiàng)目外接模塊均以杜邦線連接。


a.CH32V208WBU6評估板:


??? 主控CH32V208WBU6集成10M以太網(wǎng) MAC+PHY模塊、SPI接口、I2C接口和16路ADC通道等豐富外設(shè);以及最大可配置64KB易失數(shù)據(jù)存儲區(qū)SRAM,480KB可配置程序存儲區(qū)CodeFlash(零等待應(yīng)用區(qū)+非零等待數(shù)據(jù)區(qū))。滿足本項(xiàng)目對外設(shè)資源的需求。
????CH32V208WBU6通過I2C接口讀取并處理AHT21B和BMP280測量的溫濕度和大氣壓強(qiáng)原始數(shù)據(jù)成實(shí)際值;通過ADC通道采樣光敏電阻的電壓轉(zhuǎn)換成光照狀態(tài),以及采樣內(nèi)置溫度傳感器的溫度并轉(zhuǎn)換成實(shí)際值作為參照溫度;通過SPI接口接入的LCD和帶字庫的SPI Flash將傳感器測量值顯示在LCD上;通過將接入了10M以太網(wǎng) MAC+PHY模塊的RJ45接口連接路由器,接入互聯(lián)網(wǎng),以TCP協(xié)議連接至騰訊云物聯(lián)網(wǎng)平臺,以MQTT消息傳輸協(xié)議定時上報(bào)測量的溫濕度和氣壓數(shù)據(jù),實(shí)現(xiàn)跨區(qū)域消息傳遞,并定期獲取網(wǎng)絡(luò)時間校準(zhǔn)RTC時間。

b.AHT21B溫濕度傳感器
AHT21B是一款配置了專用的ASIC傳感器芯片、高性能的半導(dǎo)體硅基電容式濕度傳感器和一個標(biāo)準(zhǔn)的片上溫度傳感器,使用標(biāo)準(zhǔn)I2C數(shù)據(jù)輸出信號格式。
?AHT21B溫度測量范圍:-40~+80°C,濕度測量范圍:0~100%RH;溫度測量精度:±0.5℃,濕度測量精度:±3%RH(25℃);溫度分辨率:0.01℃,濕度分辨率:0.024%RH。
????本項(xiàng)目選用是已經(jīng)引出了電源和I2C接口的AHT21B模塊,方便接入CH32V208WB評估板使用。
c.BMP280氣壓傳感器
BMP280壓力測量范圍:300-1100hPa(海拔高度-500m到9000m);相對精度:±0.12hPa ?(950-1050hPa@25℃);絕對精度:±1hPa(950-1050hPa,0~40℃);支持I2C和SPI兩種形式通信。
??? 本項(xiàng)目選用是已經(jīng)引出了電源和I2C接口的BMP280模塊,方便接入CH32V208WB評估板使用。
d.1.44" 128x128像素LCD
????本項(xiàng)目選用的是驅(qū)動IC為ST7735S帶背光的液晶屏,SPI接口通信。屏幕尺寸1.44寸,分辨率128x128,此尺寸和分辨率顯示16像素字高的漢字和ASCII字符具有不錯的效果,也可以減少顯示內(nèi)容刷新對主控CH32V208WB過長時間的占用,避免過大的字符或圖案刷新占用主控CH32V208WB過長時間,影響實(shí)時性要求高的任務(wù)刷新。
e.SPI Flash
????存儲LCD顯示字庫,為LCD顯示ASCII字符和漢字字符提供字模數(shù)據(jù)來源。
f.光敏電阻
????光敏電阻器是利用半導(dǎo)體的光電導(dǎo)效應(yīng)制成的一種電阻值隨入射光的強(qiáng)弱而改變的電阻器,利用此特性接入ADC通道采樣電阻值變化,即可轉(zhuǎn)換為光照情況。
2.2 接收端硬件構(gòu)成
????接收端圍繞CH32V003F4P6核心板,外接ESP8266-01 802.11b/g/n Wi-Fi通信模塊和0.96" 128x64像素OLED液晶屏組成。


a.CH32V003F4P6核心板


????主控CH32V003F4P6集成2個看門狗定時器和1個32位系統(tǒng)時基定時器,以及USART、I2C等常見外設(shè),具有2KB SRAM+16KB Flash,滿足外接模塊對主控外設(shè)資源的需求。
????CH32V003F4P6通過USART1接入ESP8266-01模塊,配置ESP8266-01模塊連接至騰訊云物聯(lián)網(wǎng)平臺,接收騰訊云物聯(lián)網(wǎng)平臺流轉(zhuǎn)的檢測端上報(bào)的數(shù)據(jù);通過IIC1接口接入OLED屏幕,將接收到的數(shù)據(jù)現(xiàn)在OLED屏幕上。

b.ESP8266-01模塊
????ESP8266-01模塊是一款基于樂鑫ESP8266EX的低功耗UART-WiFi芯片模組,在燒錄MQTT+AT固件后,可以實(shí)現(xiàn)使用AT指令接入云端服務(wù),為連接該模塊的設(shè)備添加聯(lián)網(wǎng)功能。
????CH32V003F4P6沒有連接以太網(wǎng)相關(guān)的外設(shè),為了方便連接互聯(lián)網(wǎng),使用一片ESP8266-01模塊提供聯(lián)網(wǎng)功能。
c.0.96" OLED屏幕模塊
????本項(xiàng)目選用的是使用IIC模式通信的0.96" OLED屏幕模塊,屏幕像素128x64。接收端沒有大量的圖形或者數(shù)據(jù)刷新要求,此尺寸和模式滿足項(xiàng)目要求
3.程序說明
????檢測端和接收端程序均使用MounRiver Studio作為IDE開發(fā)編寫。文件編碼使用默認(rèn)的GBK,絕大多數(shù)文件內(nèi)都添加了方便理解的漢字注釋(如下方systick服務(wù)函數(shù)所示),如果使用默認(rèn)文件格式是UTF-8格式的編輯器或者IDE打開出現(xiàn)亂碼,請使用增強(qiáng)型文本編輯器轉(zhuǎn)換一下格式即可。
3.1 ?檢測端程序說明
??? 檢測端程序包含兩部分,一是傳感器檢測部分,每5s讀取一次傳感器測量值,處理成實(shí)際值后顯示在LCD屏幕上;二是ETH以太網(wǎng)任務(wù)部分,同步傳感器檢測周期5s,將最新一次的測量數(shù)據(jù)發(fā)送至騰訊云物聯(lián)網(wǎng)平臺。任務(wù)使用SysTick作為時基定時器,確保周期性任務(wù)的準(zhǔn)時執(zhí)行。
????從SPI Flash中讀取字模數(shù)據(jù)和將字模數(shù)據(jù)發(fā)送至LCD主控IC ST7735S均使用SPI DMA功能,提高數(shù)據(jù)傳輸效率。因?yàn)閷DC采樣的三個通道實(shí)時性要求不高,同步傳讀取傳感器測量值周期5秒,ADC工作模式配置使用手動觸發(fā),單次采樣,使用SPI DMA接收采樣數(shù)據(jù)。SysTick作為任務(wù)刷新時基定時器,每10ms在中斷服務(wù)函數(shù)中刷新一次以太網(wǎng)通信的時間任務(wù)狀態(tài)(統(tǒng)計(jì)TCP超時等),同時更新周期性任務(wù)狀態(tài)機(jī)狀態(tài)。
SysTick中斷服務(wù)函數(shù)


3.2 接收端程序說明
????接收端因?yàn)闆]有外接過多的模塊和涉及大量的數(shù)據(jù)處理,于是將系統(tǒng)時鐘調(diào)整至了與CH32V003F4P6核心板上晶振一致的24MHz,節(jié)省能耗。

????USART1使用TC(發(fā)送完成)和IDLE(總線空閑)中斷結(jié)合DMA功能,形成接發(fā)不定長數(shù)據(jù)(一定范圍內(nèi)的不定長)形式,提高初始化配置ESP8266-01模塊工作模式和接收ESP8266-01模塊轉(zhuǎn)發(fā)的數(shù)據(jù)的效率。如下代碼介紹了TC和IDLE中斷對單次啟用DMA功能的配置方法。
????ESP8266-01模塊配置連接到騰訊云物聯(lián)網(wǎng)平臺使用狀態(tài)機(jī)模式,上一任務(wù)ESP8266-01模塊返回執(zhí)行成功后,解鎖并開始執(zhí)行下一任務(wù)。如下代碼介紹了使用AT指令配置EPS8266-01模塊連接至騰訊云物聯(lián)網(wǎng)平臺的流程。
4.騰訊云物聯(lián)網(wǎng)開發(fā)平臺
騰訊云物聯(lián)網(wǎng)開發(fā)平臺(IoT Explorer)是面向智慧生活與產(chǎn)業(yè)互聯(lián)應(yīng)用的物聯(lián)網(wǎng) PaaS 平臺,為基于物聯(lián)網(wǎng)的各行業(yè)設(shè)備制造商、方案商及應(yīng)用開發(fā)商提供一站式設(shè)備智能化服務(wù)。
本項(xiàng)目基于騰訊云物聯(lián)網(wǎng)開發(fā)平臺的提供最多50個設(shè)備接入的“公共實(shí)例”資源實(shí)現(xiàn)。
4.1 騰訊云物聯(lián)網(wǎng)開放平臺新建一個產(chǎn)品



4.2 物模型添加自定義功能

4.3 屬性上報(bào)實(shí)現(xiàn)方式

例如:

如果訂閱了屬性上報(bào)響應(yīng)主題會收到如下圖所示的報(bào)文內(nèi)容

檢測端上報(bào)屬性由如下部分代碼實(shí)現(xiàn)
4.4 獲取網(wǎng)絡(luò)時間校準(zhǔn)RTC時間的實(shí)現(xiàn)方式

例如:

發(fā)布報(bào)文:{"type":"get","resource":["time"]}

收到訂閱的ntp服務(wù)消息下行主題發(fā)布的ntp消息,字符“time”后的數(shù)值即為當(dāng)前UTC時間戳,ntptime1和ntptime2后的數(shù)值最后三位為毫秒。

程序中由如下代碼提取出time字符之后的數(shù)值字符并轉(zhuǎn)換成整形數(shù)字
再將變量UnixTimeStampCount存儲的UTC時間戳寫入到RTC計(jì)數(shù)寄存器,實(shí)現(xiàn)設(shè)備同步網(wǎng)絡(luò)時間。
4.5 物模型屬性云流轉(zhuǎn)實(shí)現(xiàn)方式
a.檢測端和接收端以新建設(shè)備形式添加至“設(shè)備調(diào)試”列表

b.新建一個或者使用一個空閑的自定義主題作為消息云流轉(zhuǎn)目標(biāo)主題接收檢測端上報(bào)主題的消息

c.“數(shù)據(jù)流轉(zhuǎn)”→“規(guī)則引擎”→“新建規(guī)則”,新建一條數(shù)據(jù)流轉(zhuǎn)規(guī)則

d.編輯規(guī)則


e.添加行為

f.啟用規(guī)則

g.訂閱自定義主題,等待規(guī)則轉(zhuǎn)發(fā)數(shù)據(jù)



h.在流轉(zhuǎn)規(guī)則“字段”中添加篩選條件(params.Temperature, params.Humidity, params.Atmosphere),只將上報(bào)屬性報(bào)文中“params.Temperature”,“params.Humidity”和“params.Atmosphere”三項(xiàng)內(nèi)容流轉(zhuǎn)至接收端。
上報(bào)的 JSON 數(shù)據(jù)格式,可以是嵌套的 JSON。例如:{"device_status":{"switch":"on"}},可以通過 device_status.switch 來獲取到 switch 的值。



接收端對流轉(zhuǎn)數(shù)據(jù)的處理方式如下代碼所示:
5.后記
????感謝沁恒公司組織的這次創(chuàng)新應(yīng)用大賽,讓我接觸到了沁恒公司推出的外設(shè)資源豐富的RISC-V內(nèi)核的通用微控制器,結(jié)合易于上手的IDE和常用開發(fā)文檔均能找到中文版本,很大程度縮短了學(xué)習(xí)時間。由于本人水平有限,謬誤之處,請不吝批評指正。
