女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用RT-Thread Studio來實現疫情監控平臺

RTThread物聯網操作系統 ? 來源:RTThread物聯網操作系統 ? 2020-09-04 14:49 ? 次閱讀

上周末加班,這周末休息,有時間整理一篇之前做的基于RT-Thread的疫情監控平臺。上一篇文章我們使用STM32F103 MCU裸機開發的方式實現了疫情監控平臺。這次我們玩點高端的,使用RT-Thread Studio來實現同樣的功能,一起來看看吧!

文章目錄

使用到的軟件包

0.RT-Thread Studio的下載和安裝

1.硬件準備

2.新建工程

3.添加LED閃爍功能

4.添加ESP8266軟件包

5.疫情數據的獲取

6.疫情數據的解析

7.疫情數據的顯示

開源地址

最終的顯示效果:

顯示效果

有效文件就這9個,其他的就全是圖形化配置:

有效文件

整個流程下來,如果順利的話,可以在2個小時內完成。

使用到的軟件包

at device:用于ESP8266配網

webclient:用于發送HTTPS請求

mbdetls:用于HTTPS加密

cJSON:用于JSON數據解析

0.RT-Thread Studio的下載和安裝

一站式的 RT-Thread 開發工具,通過簡單易用的圖形化配置系統以及豐富的軟件包和組件資源,讓物聯網開發變得簡單和高效。

RT-Thread Studio

支持多種芯片,STM32全系列

支持創建裸機工程、RT-Thread Nano和Master工程

強大的代碼編輯功能,基于Eclipse框架

免費無版權限制,基于開源Eclipse和ARM-GCC編譯器。

支持多種仿真器,J-Link,ST-link等,支持在線調試,變量觀察。

SDK管理器,圖形化配置RT-Thread軟件包,同步RT-Thread最新版本。

集成Putty串口終端工具

更多的使用教程

https://www.rt-thread.org/page/studio.html

目前最新版本為1.1.3版本,支持3種下載方式,我們選擇最后一個下載方式,從RT-Thread 官網服務器上下載。

下載地址:

http://117.143.63.254:9012/www/studio/download/RT-Thread%20Studio-v1.1.3-setup-x86_64_20200731-2100.exe

下載鏈接

安裝過程和常用的軟件安裝方法一樣,選擇安裝路徑,然后Next就行了。

1.硬件準備

開發板用的是我在大四時自己設計的STM32開發板——NiceDay,基于STM32F103RET主控。這是我設計的第二塊板子(第一塊是畢業設計兩輪平衡車主板),是在大四快畢業時,畢設實物和論文完成之后還有點時間,就設計了這款板子,最開始是準備做桌面天氣時鐘的。

開發板

2.新建工程

RT-Thread Studio支持創建裸機工程、包含RT-Thread Nano版本的工程和包含Master版本的工程。這里,我們選擇創建RT-Thread 項目,即包含完整版RT-Thread的工程。

新建項目

工程支持基于芯片創建工程,或者基于已有的BSP創建,這里使用的是我自己設計的開發板,所以選擇基于芯片,選擇芯片型號:STM32F103RE,調試串口選擇串口1,調試器選擇J-Link,SWD接口

新建項目

創建完成之后,直接按Ctrl+B編譯整個工程,第一次編譯時間會長一點,如果修改很少,下次再進行編譯就會很快了,可以看到無警告無錯誤。

編譯結果

使用SWD接口連接JLink調試器和開發板,開發板上電,直接點擊下載按鈕,也可以使用快捷鍵Ctrl+Alt+D下載

下載程序

底部可以看到下載信息,從LOG來看,下載的程序文件是Bin文件,比較,擦除,編程,驗證,復位整個流程耗時13s左右。

下載LOG

RT-Thread Studio是自帶Putty串口終端的,點擊終端圖標:

終端按鈕

選擇串口號、波特率、文字編碼方式等。

配置終端

底部切換到終端窗口,可以看到串口終端輸出信息:

串口終端

這樣,不到5分鐘,一個基于STM32F103RET6的工程模板就創建好了,包含RT-Thread完整版操作系統,整個過程不需要寫一行代碼,完全圖形化配置。

3.添加LED閃爍功能

作為單片機點燈小能手,RT-Thread下如何點燈是必須掌握的。打開RT-Thread組件圖形化配置界面,可以看到默認開啟了PIN和串口設備驅動的。

圖形化配置界面

在main.c文件中添加LED閃爍功能。包含頭文件和添加宏定義

#include #include #defineLED_RED_PINGET_PIN(A,7) #defineLED_BLUE_PINGET_PIN(A,6) intmain(void) { intcount=1; rt_pin_mode(LED_RED_PIN,PIN_MODE_OUTPUT); rt_pin_mode(LED_BLUE_PIN,PIN_MODE_OUTPUT); while(count++) { rt_pin_write(LED_BLUE_PIN,PIN_LOW); rt_pin_write(LED_RED_PIN,PIN_LOW); rt_thread_mdelay(100); rt_pin_write(LED_BLUE_PIN,PIN_HIGH); rt_pin_write(LED_RED_PIN,PIN_HIGH); rt_thread_mdelay(100); } returnRT_EOK; }

重新編譯,下載。可以看到LED閃爍起來了。工程默認是使用內部RC作為輸入時鐘,所以無論你的板子是8M還是12M,都可以正常閃爍。我的開發板是8M晶體,這里我們配置使用外部HSE作為輸入時鐘。

打開drivers->stm32f1xx_hal_conf.h文件,修改HSE_VALUE宏定義為8M。

晶體頻率修改

打開drivers->drv_clk.c文件:

時鐘源修改

配置PLL時鐘源為HSE,并設置倍頻系數為9。

時鐘源修改

倍頻系數

這里根據實際板子晶體頻率來設置,如果是12M晶體,倍頻系數應該設置為6,如果是16M,需要參考時鐘樹,先2倍分頻,然后9倍倍頻。

#include voidsystem_clock_config(inttarget_freq_Mhz) { RCC_OscInitTypeDefRCC_OscInitStruct={0}; /**InitializestheCPU,AHBandAPBbussesclocks */ RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState=RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLSource=RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLState=RCC_PLL_ON; ........ //9倍頻 RCC_OscInitStruct.PLL.PLLMUL=RCC_PLL_MUL9;//8*9=72M ........ }

這樣就修改為外部8M晶體作為PLL時鐘源,再次編譯下載,和之前的現象是一樣的。

4.添加ESP8266軟件包

聯網設備,我們選擇的是ESP8266-01S,如果看過上一篇疫情監控三部曲——在STM32F103 MCU上實現(裸機版),里面介紹了如何配置ESP8266 GET HTTPS請求, 配置工作模式 > 連接WiFi > 與服務器建立SSL連接 > 發送GET請求獲取數據等等,整個流程固定而繁瑣,那么能不能封裝成一個模塊,直接拿來使用呢?

esp8266

這里就要介紹RT-Thread的AT Device軟件包了,

AT device 軟件包是由 RT-Thread AT 組件針對不同 AT 設備的移植文件和示例代碼組成,目前支持的 AT 設備有:ESP8266、ESP32、M26、MC20、RW007、MW31、SIM800C、W60X 、SIM76XX、A9/A9G、BC26 、AIR720、ME3616、M6315、BC28、EC200X、M5311系列設備等,目前上述設備都完成對 AT socket 功能的移植,及設備通過 AT 命令實現標準 socket 編程接口,完成 socket 通訊的功能,具體功能介紹可參考 《RT-Thread 編程指南》AT 命令章節 。
https://www.rt-thread.org/document/site/programming-manual/at/at/

簡單的說,就是我只需要調用這個軟件包,然后修改WiFi賬號和密碼,就可以直接配置ESP8266聯網了。

由于AT Device依賴于libc組件,所以在添加AT Device軟件包之前,先開啟libc。

在RT-Thread Settings中點擊libc灰色圖標,變成彩色說明已經開啟。

組件配置

添加AT Device軟件包,點擊立即添加

軟件包

在彈出的軟件包中心,搜索at_device,然后點擊添加,添加到當前工程。

軟件包

在at_device軟件包上右鍵,選擇詳細配置:

軟件包

在彈出的頁面,選擇我們使用的WiFi模塊類型,樂鑫的ESP8266系列,并配置WiFi賬號和密碼,WiFi模塊所連接的串口號。

WiFi配置

點擊保存之后,工程會重新進行配置,添加相應的軟件包文件到當前工程,重新生成Makefile文件,rtconfig文件等等。

雖然我們在at_device配置中選擇了uart2作為at_device設備連接的串口。但此時串口2并沒有開啟,還需要我們手動使能。

打開drivers->board.h文件,通過宏定義的方式使能串口2。

#defineBSP_USING_UART2 #defineBSP_UART2_TX_PIN"PA2" #defineBSP_UART2_RX_PIN"PA3"

這樣就開啟了UART2的片上外設,Ctrl + B重新進行編譯,時間會有些長,編譯完成之后,可以看到flash文件大小明顯比之前大了。

編譯結果

Ctrl + Alt + D重新下載運行,打開串口終端:

終端

可以看到,UART2初始化成功,WiFi連接成功。說明我們的串口模塊已經可以正常工作了。提示[E/at.clnt] execute command (AT+CIPDNS_CUR?) failed!失敗信息,是因為當前ESP8266的固件版本不支持AT+CIPDNS_CUR?這條命令,把固件升級到最新版本就好了。這個不影響后面的操作,所以就不用在意這個了。

測試一下ifconfig和ping命令,都是正常的。

終端

在RT-Thread Studio中配置ESP8266模塊聯網,整個流程只寫了3行代碼,可以說是非常的快速方便。

5.疫情數據的獲取

WiFi模塊連接上互聯網之后,就可以連接GET疫情數據的API接口https://lab.isaaclin.cn/nCoV/api/overall,然后讀取返回的疫情數據。在上一篇的裸機工程中,是通過先和服務器建立SSL連接,然后發送GET HTTPS請求,獲取到的返回數據,那RT-Thread有沒有這樣功能的軟件包呢?這里就需要添加另一個軟件包webclient。

WebClient 軟件包是 RT-Thread 自主研發的,基于 HTTP 協議的客戶端的實現,它提供設備與 HTTP Server 的通訊的基本功能。
WebClient 軟件包功能特點如下:

支持 IPV4/IPV6 地址;

支持 GET/POST 請求方法;

支持文件的上傳和下載功能;

支持 HTTPS 加密傳輸;

完善的頭部數據添加和處理方式。

和添加at_device一樣,在軟件包中心中搜索webclient,

軟件包

然后添加到當前工程,右鍵進行配置,由于我們的https://lab.isaaclin.cn/nCoV/api/overall這個疫情數據接口是HTTPS類型的,根據軟件包使用手冊,我們需要選擇TLS模式中的 MbedTLS。勾選添加GET和POST示例。

軟件包配置

保存配置,看一下當前已經添加了哪些功能,可以看到有一些組件我們并沒有去打開,但是已經被開啟了,這是因為有些軟件包是會依賴一些組件的,當使能軟件包時,一些依賴的組件也被同時使能。

軟件包

Ctrl + B編譯,Ctrl + Alt + D下載運行。在終端輸入web_get_test測試GET請求功能。

GET示例

可以看到,執行get命令之后,會返回一個字符串,那么GET的是哪個地址呢?打開packages->webclient-v2.1.2->samples->webclient_get_sample.c文件,

示例代碼

可以看到GET的是這個地址:http://www.rt-thread.com/service/rt-thread.txt,我們用電腦上的瀏覽器訪問一下:

瀏覽器訪問

經過實際測試發現,GET HTTPS請求,還需要使能軟件模擬RTC這個組件,否則會報assertion failed at function:gettimeofday, line number:19錯誤。

使能RTC

我們重新寫一個獲取疫情數據的函數,并導出到MSH。

usr_ncov.c文件內容

//usr_ncov.c #include"usr_ncov.h" intget_NCOV_Data(void) { char*uri=RT_NULL; structwebclient_session*session=RT_NULL; uint8_t*buffer=RT_NULL; intindex,ret=0; intbytes_read,resp_status; intcontent_length=-1; intbuffer_size=1600; uri=web_strdup(API_NCOV); rt_kprintf("startgetapi:%s ",API_NCOV); if(uri!=RT_NULL) { buffer=(unsignedchar*)web_malloc(buffer_size); if(buffer==RT_NULL) { rt_kprintf("nomemoryforreceivebuffer. "); ret=-RT_ENOMEM; goto__exit; } /*createwebclientsessionandsetheaderresponsesize*/ session=webclient_session_create(buffer_size); if(session==RT_NULL) { ret=-RT_ENOMEM; goto__exit; } /*sendGETrequestbydefaultheader*/ if((resp_status=webclient_get(session,uri))!=200) { rt_kprintf("webclientGETrequestfailed,response(%d)error. ",resp_status); ret=-RT_ERROR; goto__exit; } rt_kprintf("webclientgetresponsedata: "); content_length=webclient_content_length_get(session); if(content_length

usr_ncov.h文件內容

#ifndefAPPLICATIONS_USR_NCOV_H_ #defineAPPLICATIONS_USR_NCOV_H_ #include #include #include #defineAPI_NCOV"https://lab.isaaclin.cn/nCoV/api/overall" intget_NCOV_Data(void); #endif/*APPLICATIONS_USR_NCOV_H_

重新編譯,下載,運行。在終端運行這個命令:

命令獲取疫情數據

可以看到獲取到了返回的數據,長度1366個字節。下一步就是對這個JSON數據進行解析,獲取到我們想要的疫情數據。

6.疫情數據的解析

API返回的數據是JSON格式的,關于JSON的介紹和解析,可以查看使用cJSON庫解析和構建JSON字符串。數據的解析使用的開源小巧的cJSON解析庫,我們可以在軟件包管理中心直接添加:

添加cJSON

在進行解析之前,先來分析一下JSON原始數據的格式:results鍵的值是一個數組,數組只有一個JSON對象,獲取這個對象對應鍵的值可以獲取到國內現存和新增確診人數、累計和新增死亡人數,累計和新增治愈人數等數據。

全球疫情數據保存在globalStatistics鍵里,它的值是一個JSON對象,對象僅包含簡單的鍵值對,這些鍵的值,就是全球疫情數據,其中updateTime鍵的值是更新時間,這是毫秒級UNIX時間戳,可以轉換為標準北京時間。

{ "results":[{ "currentConfirmedCount":509, "currentConfirmedIncr":16, "confirmedCount":85172, "confirmedIncr":24, "suspectedCount":1899, "suspectedIncr":4, "curedCount":80015, "curedIncr":8, "deadCount":4648, "deadIncr":0, "seriousCount":106, "seriousIncr":9, "globalStatistics":{ "currentConfirmedCount":4589839, "confirmedCount":9746927, "curedCount":4663778, "deadCount":493310, "currentConfirmedIncr":281, "confirmedIncr":711, "curedIncr":424, "deadIncr":6 }, "updateTime":1593227489355 }], "success":true }

先定義了結構體NCOV_DATA,用于存儲國內和全球疫情數據:

structNCOV_DATA{ intcurrentConfirmedCount; intcurrentConfirmedIncr; intconfirmedCount; intconfirmedIncr; intcuredCount; intcuredIncr; intdeadCount; intdeadIncr; intseriousCount; intseriousIncr; charupdateTime[20]; };

對應的解析函數:

#include structNCOV_DATAdataChina={0,0,0,0,0,0,0,0,0,0,"06-1316:22"};; structNCOV_DATAdataGlobal={0,0,0,0,0,0,0,0,0,0,NULL}; intparseData(uint8_t*str) { intret=0; cJSON*root,*result_arr; cJSON*result,*global; time_tupdateTime; structtm*time; root=cJSON_Parse((constchar*)str);//創建JSON解析對象,返回JSON格式是否正確 if(root!=0) { rt_kprintf("JSONformatok,startparse!!! "); result_arr=cJSON_GetObjectItem(root,"results"); if(result_arr->type==cJSON_Array) { //rt_kprintf("resultisarray "); result=cJSON_GetArrayItem(result_arr,0); if(result->type==cJSON_Object) { //rt_kprintf("result_arr[0]isobject "); /*chinadataparse*/ dataChina.currentConfirmedCount=cJSON_GetObjectItem(result,"currentConfirmedCount")->valueint; dataChina.currentConfirmedIncr=cJSON_GetObjectItem(result,"currentConfirmedIncr")->valueint; dataChina.confirmedCount=cJSON_GetObjectItem(result,"confirmedCount")->valueint; dataChina.confirmedIncr=cJSON_GetObjectItem(result,"confirmedIncr")->valueint; dataChina.curedCount=cJSON_GetObjectItem(result,"curedCount")->valueint; dataChina.curedIncr=cJSON_GetObjectItem(result,"curedIncr")->valueint; dataChina.deadCount=cJSON_GetObjectItem(result,"deadCount")->valueint; dataChina.deadIncr=cJSON_GetObjectItem(result,"deadIncr")->valueint; rt_kprintf("**********chinancovdata********** "); rt_kprintf("%-23s:%8d,%-23s:%8d ","currentConfirmedCount",dataChina.currentConfirmedCount,"currentConfirmedIncr",dataChina.currentConfirmedIncr); rt_kprintf("%-23s:%8d,%-23s:%8d ","confirmedCount",dataChina.confirmedCount,"confirmedIncr",dataChina.confirmedIncr); rt_kprintf("%-23s:%8d,%-23s:%8d ","curedCount",dataChina.curedCount,"curedIncr",dataChina.curedIncr); rt_kprintf("%-23s:%8d,%-23s:%8d ","deadCount",dataChina.deadCount,"deadIncr",dataChina.deadIncr); /*globaldataparse*/ global=cJSON_GetObjectItem(result,"globalStatistics"); if(global->type==cJSON_Object) { dataGlobal.currentConfirmedCount=cJSON_GetObjectItem(global,"currentConfirmedCount")->valueint; dataGlobal.currentConfirmedIncr=cJSON_GetObjectItem(global,"currentConfirmedIncr")->valueint; dataGlobal.confirmedCount=cJSON_GetObjectItem(global,"confirmedCount")->valueint; dataGlobal.confirmedIncr=cJSON_GetObjectItem(global,"confirmedIncr")->valueint; dataGlobal.curedCount=cJSON_GetObjectItem(global,"curedCount")->valueint; dataGlobal.curedIncr=cJSON_GetObjectItem(global,"curedIncr")->valueint; dataGlobal.deadCount=cJSON_GetObjectItem(global,"deadCount")->valueint; dataGlobal.deadIncr=cJSON_GetObjectItem(global,"deadIncr")->valueint; rt_kprintf(" **********globalncovdata********** "); rt_kprintf("%-23s:%8d,%-23s:%8d ","currentConfirmedCount",dataGlobal.currentConfirmedCount,"currentConfirmedIncr",dataGlobal.currentConfirmedIncr); rt_kprintf("%-23s:%8d,%-23s:%8d ","confirmedCount",dataGlobal.confirmedCount,"confirmedIncr",dataGlobal.confirmedIncr); rt_kprintf("%-23s:%8d,%-23s:%8d ","curedCount",dataGlobal.curedCount,"curedIncr",dataGlobal.curedIncr); rt_kprintf("%-23s:%8d,%-23s:%8d ","deadCount",dataGlobal.deadCount,"deadIncr",dataGlobal.deadIncr); }elsereturn1; /*毫秒級時間戳轉字符串*/ updateTime=(time_t)(cJSON_GetObjectItem(result,"updateTime")->valuedouble/1000); updateTime+=8*60*60;/*UTC8校正*/ time=localtime(&updateTime); /*格式化時間*/ strftime(dataChina.updateTime,20,"%m-%d%H:%M",time); rt_kprintf("update:%s ",dataChina.updateTime);/*06-2411:21*/ //數據在LCD顯示 //gui_show_ncov_data(dataChina,dataGlobal); }elsereturn1; }elsereturn1; rt_kprintf(" parsecomplete "); } else { rt_kprintf("JSONformaterror:%s ",cJSON_GetErrorPtr());//輸出json格式錯誤信息 return1; } cJSON_Delete(root); returnret; }

在數據接收完成之后,對JSON數據進行解析。

解析結果

7.疫情數據的顯示

數據解析出來之后,剩下的就簡單了,把上一篇文章中9341的驅動文件移植過來就好了。

液晶屏使用的是3.2寸 LCD,IL9341驅動芯片,320*240分辨率,16位并口。由于屏幕分辨率比較低,可顯示的內容有限,所以只是顯示了最基本的幾個疫情數據。為了減小程序大小,GUI只實現了基本的畫點,畫線函數,字符的顯示,采用的是部分字符取模,只對程序中用到的漢字和字符進行取模。為了增強可移植性,程序中并沒有使用外置SPI Flash存儲整個字庫。

由于RT-Thread Studio使用的HAL庫,所以LCD的GPIO初始化函數需要修改一下:

voidlcd_gpio_init(void) { GPIO_InitTypeDefGPIO_InitStructure; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_AFIO_CLK_ENABLE(); __HAL_AFIO_REMAP_SWJ_NOJTAG(); GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pull=GPIO_PULLUP; GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH; GPIO_InitStructure.Pin=GPIO_PIN_9|GPIO_PIN_8|GPIO_PIN_7|GPIO_PIN_6; HAL_GPIO_Init(GPIOC,&GPIO_InitStructure);//GPIOC GPIO_InitStructure.Pin=GPIO_PIN_8;//背光引腳PA8 HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIOC GPIO_InitStructure.Pin=GPIO_PIN_All; HAL_GPIO_Init(GPIOB,&GPIO_InitStructure); HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9|GPIO_PIN_8|GPIO_PIN_7|GPIO_PIN_6,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_All,GPIO_PIN_SET); }

延時函數換成:

rt_thread_mdelay(nms);

還有一點,在Keil中,文字編碼選擇GBK編碼,1個漢字占用2個字節,而RT-Thread Studio為UTF-8編碼,1個漢字占用3個字節,漢字顯示函數需要調整:

voidgui_show_chn(uint16_tx0,uint16_ty0,char*chn) { uint8_tidx=0; uint8_t*code[3];//UTF-8:國=E59BBD uint8_tsize=sizeof(FONT_16X16_TABLE)/sizeof(FONT_16X16_TABLE[0]); /*遍歷漢字,獲取索引*/ for(idx=0;idx

疫情數據顯示函數:

voidgui_show_ncov_data(structNCOV_DATAchina,structNCOV_DATAglobal) { uint8_ty0=20; lcd_clear(BLACK); gui_show_bar(); gui_drawLine(0,18,320,DIR_X,WHITE); gui_drawLine(0,38,320,DIR_X,WHITE); gui_drawLine(0,138,320,DIR_X,WHITE); gui_drawLine(0,158,320,DIR_X,WHITE); gui_drawLine(0,220,320,DIR_X,WHITE); /*"國內疫情"*/ gui_show_chn_string(128,y0,"國內疫情"); gui_show_line_data(40,"現存確診:",china.currentConfirmedCount,"較昨日:",china.currentConfirmedIncr); gui_show_line_data(60,"累計確診:",china.confirmedCount,"較昨日:",china.confirmedIncr); gui_show_line_data(80,"累計治愈:",china.curedCount,"較昨日:",china.curedIncr); gui_show_line_data(100,"現存重癥:",china.seriousCount,"較昨日:",china.seriousIncr); gui_show_line_data(120,"累計死亡:",china.deadCount,"較昨日:",china.deadIncr); /*全球疫情*/ gui_show_chn_string(128,140,"全球疫情"); gui_show_line_data(160,"現存確診:",global.currentConfirmedCount,"較昨日:",global.currentConfirmedIncr); gui_show_line_data(180,"累計治愈:",global.curedCount,"較昨日:",global.curedIncr); gui_show_line_data(200,"累計死亡:",global.deadCount,"較昨日:",global.deadIncr); gui_show_chn_string(160,222,"更新于:"); gui_show_F8X16_String(230,222,china.updateTime,GREEN); }

最終顯示效果

最終效果

開源地址

代碼已經開源,地址在文末,歡迎大家參與,豐富這個小項目的功能!

基于STM32+RT-Thread的疫情監控平臺
https://github.com/whik/rtt_2019_ncov

基于STM32F103的疫情監控平臺(裸機版)
https://github.com/whik/stm32_2019_ncov

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 物聯網
    +關注

    關注

    2927

    文章

    45860

    瀏覽量

    387893
  • 軟件包
    +關注

    關注

    0

    文章

    108

    瀏覽量

    11879
  • RT-Thread
    +關注

    關注

    32

    文章

    1369

    瀏覽量

    41506

原文標題:基于STM32+RT-Thread的新冠肺炎疫情監控平臺

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    中新社:RT-Thread攜“睿擎平臺”亮相工博會 | 媒體視角

    4月23日,成都國際工業博覽會拉開帷幕。中國新聞網專訪RT-Thread睿賽德,以“國產操作系統再亮劍,睿擎平臺開啟工業新時代”為題,報道了“睿擎工業開發平臺”在工博會上首發亮相。中國新聞網專訪
    的頭像 發表于 04-24 11:16 ?331次閱讀
    中新社:<b class='flag-5'>RT-Thread</b>攜“睿擎<b class='flag-5'>平臺</b>”亮相工博會 | 媒體視角

    使用RT-Thread Studio在程序進Hardfault時怎么方便的查看調用棧?

    使用RT-Thread Studio在程序進Hardfault時怎么方便的查看調用棧 使用MDK的時候可以方便的看調用堆棧,從而很快速的找到問題,使用RT-Thread Studio
    發表于 04-01 07:32

    請問使用RT-Thread Studio在程序進Hardfault時怎么方便查看調用棧?

    求助各位大神 使用RT-Thread Studio在程序進Hardfault時怎么方便的查看調用棧 使用MDK的時候可以方便的看調用堆棧,從而很快速的找到問題,使用RT-Thread Stud
    發表于 03-03 08:10

    如何將RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默認支持的IDE只有IAR 和 Keil, 那如何將RT-Thread移植到NXP MCUXPressoIDE上呢?本文內容比較簡單但稍有瑣碎,希望對有需要的小伙伴有所幫助。
    的頭像 發表于 02-13 10:37 ?1720次閱讀
    如何將<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上

    RT-Thread上CAN實踐

    開箱測試RT-Thread官方已完成了對英飛凌XMC7200EVK的移植,通過shell可以看到做好了uart3的console。本文將介紹如何進行RT-ThreadCan移植。接下來我們要完成CAN_FD的驅動移植,并正常啟動RT-T
    的頭像 發表于 11-13 01:03 ?1891次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實踐

    開源共生 商業共贏 | RT-Thread 2024開發者大會報名啟動!

    開發者大會將以“開源共生,商業共贏”為主題,將于2024年12月21日全天在上海臨港中心舉行。開源RT-Thread如何實現商業化?這一直是外界對RT-Thread
    的頭像 發表于 10-29 08:06 ?856次閱讀
    開源共生 商業共贏 | <b class='flag-5'>RT-Thread</b> 2024開發者大會報名啟動!

    rt-thread studio導入bsp失敗的原因?

    rt-thread studio導入bsp失敗,bsp:gd32470z-lckfb
    發表于 09-27 09:54

    rt-thread studio導入bsp失敗的原因?

    rt-thread studio導入bsp失敗,bsp:gd32470z-lckfb
    發表于 09-13 07:49

    rt-thread studio手動導入bsp失敗的原因?怎么處理?

    rt-thread studio 手動導入bsp 失敗。 版本: 2.2.8 構建ID: 202405200930 導入的bsp 是直接從rt-thread 代碼倉庫下載的
    發表于 09-13 06:45

    如何在RT-thread studio的裸機例程上移植freertos?

    如何在RT-thread studio的裸機例程上移植freertos
    發表于 09-13 06:32

    2024 RT-Thread全球巡回 線下培訓火熱來襲!

    親愛的RT-Thread社區成員們:我們非常高興地宣布,2024年RT-Thread全球開發者線下培訓即將拉開帷幕!24年全球巡回培訓將覆蓋超10座城市及國家,為開發者提供一個深入學習RT-Thread嵌入式開發的絕佳機會。
    的頭像 發表于 08-07 08:35 ?2411次閱讀
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓火熱來襲!

    RT-Thread Studio每次重開后構建都無法運行程序怎么解決?

    RT-Thread Studio每次重開后構建都 無法運行程序 “make”:Launching failed 只要新建一個項目之后就又可以了 但退出之后又不行了 已經設置了路徑 make是能在任意位置運行的,重啟過RT-Threa
    發表于 07-18 07:33

    RT-Thread Studio導入keil MDK工程失敗的原因?怎么解決?

    RT-Thread Studio導入keil MDK工程失敗
    發表于 07-15 06:56

    RT-Thread 新里程碑達成——GitHub Star 破萬!

    RT-Thread實時操作系統開源項目在GitHub上的star數量突破一萬!截止發文,RT-Thread作為實時操作系統在業界Star數量排名第一!倉庫地址:https://github.com
    的頭像 發表于 07-04 08:35 ?696次閱讀
    <b class='flag-5'>RT-Thread</b> 新里程碑達成——GitHub Star 破萬!

    【ch32v307_RTT】1、使用RT-Thread studio新建工程

    【前言】 ch32v307有成熟的RT-Thread 支持,使用RT-Thread studio可以快速的建立工程,我將分享系列文章,這一篇是如何快速建立工程。 【前題】 安裝好RT-Thre
    發表于 06-29 18:25