吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一種基于云平臺(tái)+APP+設(shè)備端的身體參數(shù)測(cè)試系統(tǒng)

lPCU_elecfans ? 來源:未知 ? 作者:李倩 ? 2018-08-11 11:30 ? 次閱讀

【背景描述】

隨著生活質(zhì)量的提高和生活節(jié)奏的加快,人們愈加需要關(guān)注自己的健康狀況,本項(xiàng)目意在設(shè)計(jì)一種基于云平臺(tái)+APP+設(shè)備端的身體參數(shù)測(cè)試系統(tǒng),利用脈搏傳感器紅外傳感器、微弱信號(hào)檢測(cè)電路等實(shí)現(xiàn)人體參數(shù)的采集,數(shù)據(jù)通過無線網(wǎng)或其他方式上傳云端存儲(chǔ),并提供網(wǎng)頁端交互界面,為用戶構(gòu)建一種人體參數(shù)管理平臺(tái)。

所用物料及實(shí)物圖

主控:STM32F103

編譯環(huán)境:MDK4.7

RT-Thread版本:2.0.0

【硬件設(shè)計(jì)】

1.MCU系統(tǒng)電路

本系統(tǒng)采用STM32103C8T6,其作為主控芯片一方面對(duì)傳感器數(shù)據(jù)進(jìn)行采集,另一方面將數(shù)據(jù)通過算法進(jìn)行處理,并轉(zhuǎn)發(fā)到云服務(wù)器,因此在電路設(shè)計(jì)時(shí)將兩個(gè)ADC接口接入傳感器。對(duì)于STM32系統(tǒng),其必要組成部分還包括了啟動(dòng)模式選擇電路、晶振復(fù)位電路等,在設(shè)計(jì)時(shí)還我另外加入了指示燈與按鍵作為備用。STM32系統(tǒng)電路如圖4所示。STM32的供電電壓以及心率、溫度傳感器的電壓都是3.3V,因此如果采用5V電壓供電則還需要進(jìn)行電壓轉(zhuǎn)換,本系統(tǒng)采用了LDO穩(wěn)壓器LM1117將5V轉(zhuǎn)為3.3V。對(duì)于電源和開關(guān)的部分,系統(tǒng)采用MICO USB接口進(jìn)行供電和下載程序,該部分電路如圖所示。

STM32系統(tǒng)電路

電源開關(guān)電路

2.USB轉(zhuǎn)串口電路

利用USB作為系統(tǒng)程序下載接口,需要對(duì)其電平進(jìn)行轉(zhuǎn)換才能與STM32的串口進(jìn)行通信,本系統(tǒng)采用了CP2102作為轉(zhuǎn)換芯片,CP2102集成度高,內(nèi)置USB2.0全速功能控制器、USB收發(fā)器、晶體振蕩器、EEPROM及異步串行數(shù)據(jù)總線(UART),支持調(diào)制解調(diào)器全功能信號(hào),無需任何外部的USB器件。CP2102與其他USB-UART轉(zhuǎn)接電路的工作原理類似,通過驅(qū)動(dòng)程序?qū)C的USB口虛擬成COM口以達(dá)到擴(kuò)展的目的。該部分的電路設(shè)計(jì)圖如圖所示。

USB轉(zhuǎn)串口電路

3.體溫傳感器電路

體溫傳感器利用熱敏電阻與溫度的特性曲線測(cè)量體溫,采集的信號(hào)經(jīng)過兩級(jí)濾波和放大后傳入STM32,溫度測(cè)量的范圍是30℃—44℃,采用3.3V電壓供電時(shí)其溫度對(duì)應(yīng)的采集電壓范圍是2.127—1.193V。體溫傳感器的電路如圖所示。

體溫傳感器電路

4.心率傳感器電路

心率傳感器采用了Pulse Sensor傳感器,其算法開源、使用簡(jiǎn)便、成本低廉。它的原理是采用光電容積法,通過測(cè)量人體脈搏透光率來測(cè)量心跳,光電容積脈搏波描記法(PhotoPlethysmoGraphy,PPG)是借光電手段在活體組織中檢測(cè)血液容積變化的一種無創(chuàng)檢測(cè)方法。當(dāng)一定波長(zhǎng)的光束照射到指端皮膚表面時(shí)光束將通過透射或反射方式傳送到光電接收器,在此過程中由于受到指端皮膚肌肉和血液的吸收衰減作用檢測(cè)器檢測(cè)到的光強(qiáng)度將減弱,其中皮膚肌肉組織等對(duì)光的吸收在整個(gè)血液循環(huán)中是保持恒定不變的,而皮膚內(nèi)的血液容積在心臟作用下呈搏動(dòng)性變化,當(dāng)心臟收縮時(shí)外周血容量最多,光吸收量也最大,檢測(cè)到的光強(qiáng)度最小;而在心臟舒張時(shí)正好相反。檢測(cè)到的光強(qiáng)度最大使光接收器接收到的光強(qiáng)度隨之呈脈動(dòng)性變化,將此光強(qiáng)度變化信號(hào)轉(zhuǎn)換成電信號(hào)便可獲得容積脈搏血流的變化。該傳感器采用峰值波長(zhǎng)515nm的綠光LED結(jié)合光感都565nm的光感器APDS-9008來采集心率參數(shù),由于脈搏信號(hào)頻率較低,信號(hào)幅度很小,容易受到各種干擾,因此需要進(jìn)行濾波和放大。在傳感器后級(jí)采用了低通濾波器運(yùn)算放大器MCP-6001來濾波和放大信號(hào)。心率傳感器的電路如圖所示。

心率傳感器電路

5.WiFi模塊

WiFi模塊采用了ESP8266模塊,當(dāng)使用該模塊時(shí)需要設(shè)計(jì)其外部電路,包括電源電路、復(fù)位電路、模式選擇電路等部分,設(shè)計(jì)完成的電路圖如圖所示。

WiFi模塊電路

【軟件設(shè)計(jì)】

1.主芯片程序設(shè)計(jì)

STM32的程序設(shè)計(jì)基于RT-Thread行開發(fā)。系統(tǒng)初始化之外,在主程序中,完成如下功能:

通過內(nèi)部AD接口對(duì)傳感器的AD數(shù)據(jù)進(jìn)行采集;

將數(shù)據(jù)通過算法進(jìn)行處理;

將處理好的數(shù)據(jù)打包提供WiFi模塊發(fā)送給服務(wù)器;

喂狗。

按照以上4點(diǎn)功能進(jìn)行設(shè)計(jì),程序工作流程圖如圖所示。

主程序流程圖

2.心率采集算法

心率采集算法的目標(biāo)是找到瞬間心跳的連續(xù)時(shí)刻,并測(cè)量?jī)烧咧g的時(shí)間間隔(IBI)。通過遵循PPG波形的可預(yù)測(cè)的形狀和模式,我們能夠做到這一點(diǎn)。當(dāng)心臟將血液泵入人體時(shí),每次搏動(dòng)都會(huì)有一個(gè)脈沖波(有點(diǎn)像沖擊波)沿著所有的動(dòng)脈傳到脈搏傳感器附著的毛細(xì)血管組織的末端。實(shí)際的血液循環(huán)比脈搏波傳播慢得多。

從下圖所示的PPG上的T點(diǎn)開始跟蹤事件。當(dāng)脈搏波在傳感器下方通過時(shí),信號(hào)值迅速上升,然后信號(hào)回落到正常點(diǎn)。有時(shí)候,雙向切口(向下尖峰)比其他更明顯,但通常信號(hào)在下一個(gè)脈沖波沖洗之前穩(wěn)定到背景噪聲。由于波浪是重復(fù)的和可預(yù)測(cè)的,可以選擇幾乎任何可識(shí)別的特征作為參考點(diǎn),比如峰值,并通過在每個(gè)峰值之間的時(shí)間計(jì)算心率。然而,這可能會(huì)從二分的切口中錯(cuò)誤地讀取,并且對(duì)基線噪聲可能也是不準(zhǔn)確的。理想情況下,想要找到心臟跳動(dòng)的瞬間時(shí)刻需要準(zhǔn)確的BPM計(jì)算,心率變異性(HRV)研究和脈搏傳遞時(shí)間(PTT)測(cè)量。

心跳PPG波形

對(duì)于心跳的計(jì)算,本算法在信號(hào)在快速上升過程中跨越波幅的50%的瞬間進(jìn)行測(cè)量。BPM是從前10次IBI時(shí)間的平均值的每一個(gè)節(jié)拍中導(dǎo)出的。首先,要有足夠高分辨率的正常采樣率來獲得每個(gè)節(jié)拍之間的時(shí)間的可靠測(cè)量。為此,我在STM32上使用了一個(gè)8位定時(shí)器,以便每隔一毫秒就會(huì)拋出一個(gè)中斷。這樣有了500Hz的采樣率,以及2mS的節(jié)拍分辨率。接下來,需要跟蹤PPG波的最高值和最低值,以獲得精確的振幅測(cè)量值。變量P和T分別代表峰值和谷值。閾值變量初始化為512(模擬量范圍的中間值),并在運(yùn)行時(shí)間內(nèi)變化,以跟蹤振幅50%處的點(diǎn),我們將在后面看到。在T更新之前必須經(jīng)過3/5 IBI的時(shí)間段,以避免來自二分類缺口的噪音和錯(cuò)誤讀數(shù)。隨后, 抓取一個(gè)大變量runningTotal來收集IBIs,然后將rate []的內(nèi)容轉(zhuǎn)移并添加到runnungTotal中。最早的IBI(11次前)不在位置0,而更新的IBI被置于位置9,接著對(duì)數(shù)組進(jìn)行平均并計(jì)算BPM。最后要做的是設(shè)置QS標(biāo)志。如果2.5秒內(nèi)沒有節(jié)拍事件,則用于查找心跳的變量將重新初始化為啟動(dòng)值。

通過使用定時(shí)器中斷,我們的節(jié)拍查找算法在后臺(tái)運(yùn)行,并自動(dòng)更新變量值。整體的算法流程圖如圖所示

3.服務(wù)器軟件與網(wǎng)頁設(shè)計(jì)

服務(wù)器端采用阿里云提供的云服務(wù)器,其數(shù)據(jù)傳輸協(xié)議是MQTT協(xié)議,測(cè)量采集端作為MQTT的設(shè)備端,云服務(wù)器作為MQTT的服務(wù)端,接收的數(shù)據(jù)存入SQL并通過網(wǎng)頁展示,MQTT協(xié)議數(shù)據(jù)傳輸流程如圖所示。

MQTT數(shù)據(jù)傳輸流程圖

設(shè)計(jì)完成的網(wǎng)頁如圖

4.APP軟件設(shè)計(jì)

移動(dòng)終端APP第一次打開后進(jìn)行手動(dòng)配網(wǎng),當(dāng)搜索到指定的WIFI信號(hào)時(shí)進(jìn)行連接,隨后對(duì)TCP端口進(jìn)行監(jiān)聽,對(duì)接受的數(shù)據(jù)包進(jìn)行解析,隨后將數(shù)據(jù)顯示在屏幕上。設(shè)計(jì)完成的APP如下圖。

5.上位機(jī)軟件設(shè)計(jì)

上位機(jī)軟件基于JAVA進(jìn)行設(shè)計(jì),通過端口接收測(cè)量終端傳輸?shù)臄?shù)據(jù)包,并進(jìn)行解析,通過圖形形象地展示出心率的實(shí)時(shí)狀態(tài),其工作界面如圖所示。

【RTT使用簡(jiǎn)介】

本部分簡(jiǎn)單介紹了本系統(tǒng)中使用OLED和WIFI模塊所涉及的SPI和串口通信在RTT中的使用過程,對(duì)函數(shù)的調(diào)用過程、關(guān)鍵函數(shù)的使用、設(shè)備驅(qū)動(dòng)的調(diào)用分別進(jìn)行了一些介紹。

1.OLED

OLED與芯片的通過SPI協(xié)議通信,設(shè)備驅(qū)動(dòng)使用流程大致如下:

(1)定義設(shè)備對(duì)象,調(diào)用 rt_spi_bus_attach_device() 掛載設(shè)備到SPI總線

rt_err_t rt_spi_bus_attach_device(struct rt_spi_device *device, const char *name, const char *bus_name, void *user_data)

此函數(shù)用于掛載一個(gè)SPI設(shè)備到指定的SPI總線,向內(nèi)核注冊(cè)SPI設(shè)備,并將user_data保存到SPI設(shè)備device里。

b. SPI總線命名原則為spix, SPI設(shè)備命名原則為spixy,本項(xiàng)目的spi10 表示掛載在在 spi1設(shè)備。a. 首先需要定義好SPI設(shè)備對(duì)象device

c. SPI總線名稱可以在msh shell輸入list_device 命令查看,確定SPI設(shè)備要掛載的SPI總線。

d. user_data一般為SPI設(shè)備的CS引腳指針,進(jìn)行數(shù)據(jù)傳輸時(shí)SPI控制器會(huì)操作此引腳進(jìn)行片選。

本項(xiàng)目的底層驅(qū)動(dòng) drv_ssd1306.c 中 rt_hw_ssd1306_config() 掛載ssd1306設(shè)備到SPI總線源碼如下:

#define SPI_BUS_NAME "spi1" /* SPI總線名稱 */#define SPI_SSD1306_DEVICE_NAME "spi10" /* SPI設(shè)備名稱 */static struct rt_spi_device spi_dev_ssd1306; /* SPI設(shè)備ssd1306對(duì)象 */static struct stm32_hw_spi_cs spi_cs; /* SPI設(shè)備CS片選引腳 */static int rt_hw_ssd1306_config(void){ rt_err_t res; /* oled use PC8 as CS */ spi_cs.pin = CS_PIN; rt_pin_mode(spi_cs.pin, PIN_MODE_OUTPUT); /* 設(shè)置片選管腳模式為輸出 */res=rt_spi_bus_attach_device(&spi_dev_ssd1306,SPI_SSD1306_DEVICE_NAME, SPI_BUS_NAME, (void*)&spi_cs);if (res != RT_EOK){ OLED_TRACE("rt_spi_bus_attach_device! "); return res;}}

(2)調(diào)用 rt_spi_configure() 配置SPI總線模式。

掛載SPI設(shè)備到SPI總線后,為滿足不同設(shè)備的時(shí)鐘、數(shù)據(jù)寬度等要求,通常需要配置SPI模式、頻率參數(shù)SPI從設(shè)備的模式?jīng)Q定主設(shè)備的模式,所以SPI主設(shè)備的模式必須和從設(shè)備一樣兩者才能正常通訊。

rt_err_t rt_spi_configure(struct rt_spi_device *device, struct rt_spi_configuration

掛載SPI設(shè)備到SPI總線后必須使用此函數(shù)配置SPI設(shè)備的傳輸參數(shù)。此函數(shù)會(huì)保存cfg指向的模式參數(shù)到device里,當(dāng)device調(diào)用數(shù)據(jù)傳輸函數(shù)時(shí)都會(huì)使用此配置信息

本項(xiàng)目底層驅(qū)動(dòng) drv_ssd1306.c 中 rt_hw_ssd1306_config() 配置SPI傳輸參數(shù)源碼如下:

static int rt_hw_ssd1306_config(void){ /* config spi */ { struct rt_spi_configuration cfg; cfg.data_width = 8; cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; cfg.max_hz = 20 * 1000 *1000; /* 20M,SPI max 42MHz,ssd1306 4-wire spi */ rt_spi_configure(&spi_dev_ssd1306, &cfg); }

(3) 使用 rt_spi_transfer() 等相關(guān)數(shù)據(jù)傳輸接口傳輸數(shù)據(jù)。

SPI設(shè)備掛載到SPI總線并配置好相關(guān)SPI傳輸參數(shù)后就可以調(diào)用RT-Thread提供的一系列SPI設(shè)備驅(qū)動(dòng)數(shù)據(jù)傳輸函數(shù)。

struct rt_spi_message *rt_spi_transfer_message(struct rt_spi_device *device, struct rt_spi_message *message)

此函數(shù)可以傳輸一連串消息,用戶可以很靈活的設(shè)置message結(jié)構(gòu)體各參數(shù)的數(shù)值,從而可以很方便的控制數(shù)據(jù)傳輸方式。

發(fā)送指令和數(shù)據(jù)的函數(shù)源碼如下:

rt_err_t ssd1306_write_cmd(const rt_uint8_t cmd){ rt_size_t len; rt_pin_write(DC_PIN, PIN_LOW); /* 命令低電平 */ len = rt_spi_send(&spi_dev_ssd1306, &cmd, 1); if (len != 1) { OLED_TRACE("ssd1306_write_cmd error. %d ",len); return -RT_ERROR; } else { return RT_EOK; }}rt_err_t ssd1306_write_data(const rt_uint8_t data){ rt_size_t len; rt_pin_write(DC_PIN, PIN_HIGH); /* 數(shù)據(jù)高電平 */ len = rt_spi_send(&spi_dev_ssd1306, &data, 1); if (len != 1) { OLED_TRACE("ssd1306_write_data error. %d ",len); return -RT_ERROR; } else { return RT_EOK; }}

(4)通過設(shè)備驅(qū)動(dòng)的調(diào)用在OLED上顯示圖像和文字,首先需要確定信息在OLED上的行列起始地址,調(diào)用ssd1306_write_cmd() 向SSD1306發(fā)送指令,調(diào)用 ssd1306_write_data() 向SSD1306發(fā)送數(shù)據(jù),源代碼如下:

void set_column_address(rt_uint8_t start_address, rt_uint8_t end_address){ ssd1306_write_cmd(0x15); // Set Column Address ssd1306_write_data(start_address); // Default => 0x00 (Start Address) ssd1306_write_data(end_address); // Default => 0x7F (End Address)}void set_row_address(rt_uint8_t start_address, rt_uint8_t end_address){ ssd1306_write_cmd(0x75); // Set Row Address ssd1306_write_data(start_address); // Default => 0x00 (Start Address) ssd1306_write_data(end_address); // Default => 0x7F (End Address)}

2.串口

串口用來與WIFI 模塊ESP8266進(jìn)行通信,在串口的使用過程中,主要使用了以下幾個(gè)函數(shù)進(jìn)行初始化:

static void RCC_Configuration(void) static void GPIO_Configuration(void) static void NVIC_Configuration(struct stm32_uart *uart) void rt_hw_usart_init();

(1)在void rt_hw_usart_init();中對(duì)波特率、串口號(hào)、字長(zhǎng)等進(jìn)行設(shè)置。

實(shí)際的路徑調(diào)用過程如下。

startup.c main()

-→ startup.c rtthread_startup()

-→ board.c rt_hw_board_init()

-→ usart.c rt_hw_usart_init()

(2)為了設(shè)備納入到RTT的IO設(shè)備層中,需要為這個(gè)設(shè)備創(chuàng)建一個(gè)名為rt_device的數(shù)據(jù)結(jié)構(gòu)。

該數(shù)據(jù)結(jié)構(gòu)在rtdef.h中定義。需要一些函數(shù)來操作邏輯設(shè)備,這些函數(shù)在rt-thread/src/device.c文件中提供,它們是:

rt_err_t rt_device_register(rt_device_t dev, const char *name, rt_uint16_t flags)

將rt_device數(shù)據(jù)結(jié)構(gòu)加入到RTT的設(shè)備層中,這個(gè)過程稱為“注冊(cè)”。RTT的設(shè)備管理層會(huì)為這個(gè)數(shù)據(jù)結(jié)構(gòu)創(chuàng)建唯一的device_id。

rt_err_t rt_device_unregister(rt_device_t dev)

與注冊(cè)相反,自然是注銷了,將某個(gè)設(shè)備從RTT的設(shè)備驅(qū)動(dòng)層中移除。

rt_device_t rt_device_find(const char *name)

根據(jù)設(shè)備的字符串名查找某個(gè)設(shè)備。

rt_err_t rt_device_init(rt_device_t dev)

通過調(diào)用rt_device數(shù)據(jù)結(jié)構(gòu)中的init函數(shù)來初始設(shè)備。

rt_err_t rt_device_init_all(void)

初始化RTT設(shè)備管理層中的所有已注冊(cè)的設(shè)備

rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag)

通過調(diào)用rt_device數(shù)據(jù)結(jié)構(gòu)中的open函數(shù)來打開設(shè)備。

rt_err_t rt_device_close(rt_device_t dev)

通過調(diào)用rt_device數(shù)據(jù)結(jié)構(gòu)中的close函數(shù)來關(guān)閉設(shè)備。

rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)

通過調(diào)用rt_device數(shù)據(jù)結(jié)構(gòu)中的read函數(shù)來從設(shè)備上讀取數(shù)據(jù)。

rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)

通過調(diào)用rt_device數(shù)據(jù)結(jié)構(gòu)中的write函數(shù)來向設(shè)備寫入數(shù)據(jù)(比如設(shè)備是flash,SD卡等,nand or nor flash等等)。

(3)open,read等函數(shù)的編寫過程如下:

Ⅰ..init函數(shù)完成對(duì)設(shè)備數(shù)據(jù)結(jié)構(gòu)的初始化工作。

RTT的設(shè)備驅(qū)動(dòng)存在大量的預(yù)定義宏,它們?cè)趓tdef.h中定義。

static rt_err_t rt_serial_init (rt_device_t dev) { struct stm32_serial_device* uart = (struct stm32_serial_device*) dev->user_data; if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED)) { if (dev->flag & RT_DEVICE_FLAG_INT_RX) { rt_memset(uart->int_rx->rx_buffer, 0, sizeof(uart->int_rx->rx_buffer)); uart->int_rx->read_index = 0; uart->int_rx->save_index = 0; } /* Enable USART */ USART_Cmd(uart->uart_device, ENABLE); dev->flag |= RT_DEVICE_FLAG_ACTIVATED; } return RT_EOK; }

Ⅱ.open

因?yàn)樵趗sart.c中已經(jīng)初始usart設(shè)備,然后init中通過USART_Cmd語句后,串口就會(huì)開始工作。因此open函數(shù)設(shè)置為空即可

close同colse,之間置空即可

Ⅲ.read

static rt_size_t rt_serial_read (rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)

pos表示讀寫的位置,buffer是用于存儲(chǔ)讀取到數(shù)據(jù)的緩沖區(qū)。size為字節(jié)數(shù)目。對(duì)于USART這種串行的流設(shè)備來說,pos沒有意義,因此這里的pos沒有意義。 rt_device數(shù)據(jù)結(jié)構(gòu)dev的的 user_data域存放了(struct stm32_serial_device*)型指針。【待修改】如果采用INT_RX模式,即中斷接受模式,則主體代碼為

while (size) { rt_base_t level; /* disable interrupt */ level = rt_hw_interrupt_disable(); if (uart->int_rx->read_index != uart->int_rx->save_index) { /* read a character */ *ptr++ = uart->int_rx->rx_buffer[uart->int_rx->read_index]; size--; /* move to next position */ uart->int_rx->read_index ++; if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE) uart->int_rx->read_index = 0; } else { /* set error code */ err_code = -RT_EEMPTY; /* enable interrupt */ rt_hw_interrupt_enable(level); break; } /* enable interrupt */ rt_hw_interrupt_enable(level); }

Ⅳ.write

向串口寫入數(shù)據(jù),即發(fā)送數(shù)據(jù)。

/* polling mode */ if (dev->flag & RT_DEVICE_FLAG_STREAM) { /* stream mode */ while (size) { if (*ptr == ' ') { while (!(uart->uart_device->SR & USART_FLAG_TXE)); uart->uart_device->DR = ' '; /* interrupt mode Tx, does not support */ RT_ASSERT(0); } while (!(uart->uart_device->SR & USART_FLAG_TXE)); uart->uart_device->DR = (*ptr & 0x1FF); ++ptr; --size; } } else { /* write data directly */ while (size) { while (!(uart->uart_device->SR & USART_FLAG_TXE)); uart->uart_device->DR = (*ptr & 0x1FF); ++ptr; --size; } }

Ⅴ.control

static rt_err_t rt_serial_control (rt_device_t dev, rt_uint8_t cmd, void *args) { struct stm32_serial_device* uart; RT_ASSERT(dev != RT_NULL); uart = (struct stm32_serial_device*)dev->user_data; switch (cmd) { case RT_DEVICE_CTRL_SUSPEND: /* suspend device */ dev->flag |= RT_DEVICE_FLAG_SUSPENDED; USART_Cmd(uart->uart_device, DISABLE); break; case RT_DEVICE_CTRL_RESUME: /* resume device */ dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED; USART_Cmd(uart->uart_device, ENABLE); break; } return RT_EOK; }

Ⅶ.注冊(cè)USART的rt_device結(jié)構(gòu)

rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct stm32_serial_device *serial) { RT_ASSERT(device != RT_NULL); if ((flag & RT_DEVICE_FLAG_DMA_RX) || (flag & RT_DEVICE_FLAG_INT_TX)) { RT_ASSERT(0); } device->type = RT_Device_Class_Char; device->rx_indicate = RT_NULL; device->tx_complete = RT_NULL; device->init = rt_serial_init; device->open = rt_serial_open; device->close = rt_serial_close; device->read = rt_serial_read; device->write = rt_serial_write; device->control = rt_serial_control; device->user_data = serial; /* register a character device */ return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | flag); }

網(wǎng)頁界面

在登錄界面,用戶輸入自己的賬戶和密碼進(jìn)行登陸。

系統(tǒng)登陸界面

在數(shù)據(jù)查看面板,用戶可以查看實(shí)時(shí)心跳和體溫的測(cè)量數(shù)據(jù)與歷史數(shù)據(jù)的曲線圖。

數(shù)據(jù)查看界面

在個(gè)人信息界面,用戶可以更新自己的個(gè)人信息,并可以綁定家人,可以查看家庭成員的數(shù)據(jù)與定位。

個(gè)人信息界面

同時(shí)本系統(tǒng)也提供定位信息的查看,用戶可以在該界面找到使用者的定位信息。

地圖定位界面

在消息提示界面,用戶可以查看系統(tǒng)發(fā)送的消息,本系統(tǒng)具有健康預(yù)警的功能,對(duì)用戶健康數(shù)據(jù)進(jìn)行四個(gè)分級(jí)進(jìn)行提醒。

消息提示界面

上位機(jī)與APP

在上位機(jī)界面,用戶查看實(shí)時(shí)的測(cè)量曲線圖;在APP界面,用戶也可查看測(cè)量數(shù)據(jù)。

上位機(jī)界面

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17324

    瀏覽量

    352658
  • 溫度傳感器
    +關(guān)注

    關(guān)注

    48

    文章

    2975

    瀏覽量

    156391
  • 云平臺(tái)
    +關(guān)注

    關(guān)注

    1

    文章

    1327

    瀏覽量

    39145

原文標(biāo)題:一文解析人體健康監(jiān)測(cè)系統(tǒng)——周四RTOS專欄

文章出處:【微信號(hào):elecfans,微信公眾號(hào):電子發(fā)燒友網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【MiCOKit申請(qǐng)】基于手機(jī)APP客戶的溫室大棚參數(shù)監(jiān)控系統(tǒng)

    申請(qǐng)理由:近些年,我國的溫室大棚已經(jīng)形成規(guī)模化和產(chǎn)業(yè)化,大棚管理水平直接影響著作物的產(chǎn)量和質(zhì)量。本項(xiàng)目擬在采用溫室大棚環(huán)境參數(shù)調(diào)控系統(tǒng)的基礎(chǔ)上,設(shè)計(jì)一種手機(jī)APP客戶
    發(fā)表于 08-13 08:23

    【OK210申請(qǐng)】基于手機(jī)APP客戶的溫室大棚參數(shù)監(jiān)控系統(tǒng)

    申請(qǐng)理由:近些年,我國的溫室大棚已經(jīng)形成規(guī)模化和產(chǎn)業(yè)化,大棚管理水平直接影響著作物的產(chǎn)量和質(zhì)量。本項(xiàng)目擬在采用溫室大棚環(huán)境參數(shù)調(diào)控系統(tǒng)的基礎(chǔ)上,設(shè)計(jì)一種手機(jī)APP客戶
    發(fā)表于 08-13 08:26

    基于arduino +機(jī)智物聯(lián)網(wǎng)平臺(tái)的陽臺(tái)生態(tài)控制系統(tǒng)的設(shè)計(jì)

    平臺(tái)的遠(yuǎn)程環(huán)境控制系統(tǒng)系統(tǒng)通過傳感器實(shí)時(shí)采集溫度、濕度、光照等環(huán)境參數(shù),通過WIFI無線網(wǎng)絡(luò)上傳機(jī)智物聯(lián)網(wǎng)
    發(fā)表于 07-16 12:28

    基于機(jī)智IoT開發(fā)平臺(tái)的溫室番茄遠(yuǎn)程監(jiān)控系統(tǒng)

    亮度、控制排氣扇狀態(tài))。4,系統(tǒng)測(cè)試使用機(jī)智APP在機(jī)智平臺(tái)掃描二維碼綁定虛擬
    發(fā)表于 05-18 17:36

    基于機(jī)智的嵌入式系統(tǒng)應(yīng)用開發(fā)—空調(diào)遠(yuǎn)程智能控制系統(tǒng)

    摘要: 文章主要介紹了一種基于機(jī)智iot開發(fā)平臺(tái)的空調(diào)遠(yuǎn)程控制模塊的應(yīng)用開發(fā),模塊功能是通過智能手機(jī)的用戶界面遠(yuǎn)程控制空調(diào)的工作,包括工作條件的設(shè)置和溫度環(huán)境監(jiān)測(cè),開發(fā)內(nèi)容包含了硬件和軟件兩部分
    發(fā)表于 06-15 17:49

    設(shè)計(jì)一種基于平臺(tái)+APP+設(shè)備身體參數(shù)測(cè)試系統(tǒng)

    【背景描述】隨著生活質(zhì)量的提高和生活節(jié)奏的加快,人們愈加需要關(guān)注自己的健康狀況,本項(xiàng)目意在設(shè)計(jì)一種基于平臺(tái)+APP+設(shè)備
    發(fā)表于 08-06 07:53

    怎樣去設(shè)計(jì)一種基于平臺(tái)+APP+設(shè)備身體參數(shù)測(cè)試系統(tǒng)

    身體參數(shù)測(cè)試系統(tǒng)的硬件部分是由哪些部分組成的呢?怎樣去設(shè)計(jì)一種基于
    發(fā)表于 11-11 09:14

    基于機(jī)智AIoT開發(fā)平臺(tái)的智能倉庫

    必不可少的部分,從出現(xiàn)起每個(gè)倉庫系統(tǒng)都面臨著安全性和可靠性兩大難題[1]。倉庫作為一種貯存設(shè)施,其安全性直是人們最關(guān)注的部分。本設(shè)計(jì)創(chuàng)
    發(fā)表于 12-15 19:17

    基于STM32機(jī)智平臺(tái)控制設(shè)備開關(guān)的相關(guān)資料推薦

    簡(jiǎn)單粗暴 看就懂 拒絕花里胡哨先看視頻效果啦 基于STM32的機(jī)智平臺(tái)控制設(shè)備開關(guān)(物聯(lián)網(wǎng))功能簡(jiǎn)單說明設(shè)備開機(jī)直接聯(lián)網(wǎng)使用機(jī)智
    發(fā)表于 02-14 07:42

    LabView與ATECLOUD測(cè)試平臺(tái)哪個(gè)好?

    的所有工具,旨在幫助工程師和科學(xué)家解決問題、提高生產(chǎn)力和不斷創(chuàng)新。  ATECLOUD智能測(cè)試平臺(tái)由納米軟件Namisoft自主研發(fā),可用于儀器程控、電子元器件自動(dòng)測(cè)試
    發(fā)表于 04-07 17:18

    一種基于平臺(tái)的微電網(wǎng)光伏模塊數(shù)據(jù)采集裝置的設(shè)計(jì)

    摘要:隨著國家定下的碳中和目標(biāo)以及相關(guān)政策的推進(jìn),微電網(wǎng)項(xiàng)目的數(shù)量會(huì)持續(xù)增加,常規(guī)微電網(wǎng)中主要的發(fā)電組件是光伏發(fā)電平臺(tái),因此對(duì)于光伏發(fā)電平臺(tái)的運(yùn)行和維護(hù)的需求也會(huì)增加。機(jī)智開發(fā)者設(shè)計(jì)的一種
    發(fā)表于 06-02 20:15

    【IoT畢業(yè)設(shè)計(jì)】基于機(jī)智平臺(tái)的智能家居系統(tǒng)

    、可寫、報(bào)警、故障,每一種數(shù)據(jù)點(diǎn)對(duì)應(yīng)了不同的幾種數(shù)據(jù)類型,其類型見表2。表2機(jī)智平臺(tái)數(shù)據(jù)類型表系統(tǒng)對(duì)所有的功能創(chuàng)建了不同的數(shù)據(jù)點(diǎn)以完成手機(jī)
    發(fā)表于 06-07 12:33

    基于機(jī)智服務(wù)平臺(tái)的媒體設(shè)備控制系統(tǒng)

    相當(dāng)大優(yōu)勢(shì)的機(jī)智(Gizwits)物聯(lián)網(wǎng)平臺(tái),它為個(gè)人開發(fā)者提供了極大的便利條件,有助于加快開發(fā)速度,縮短開發(fā)周期。GAgent嵌入式固件GAgent是一種用于數(shù)據(jù)轉(zhuǎn)發(fā)的嵌入式固件
    發(fā)表于 07-31 20:47

    一種自動(dòng)測(cè)試系統(tǒng)軟件平臺(tái)的設(shè)計(jì)

    針對(duì)當(dāng)前自動(dòng)測(cè)試領(lǐng)域儀器無關(guān)化、通用化、模塊化、TPSs可移植等要求,借鑒國外相應(yīng)的理論和技術(shù),以及國內(nèi)的工程實(shí)踐經(jīng)驗(yàn),設(shè)計(jì)了一種自動(dòng)測(cè)試系統(tǒng)軟件
    發(fā)表于 03-02 14:25 ?17次下載

    心理醫(yī)生平臺(tái)及移動(dòng)App系統(tǒng)的分析與設(shè)計(jì)

    心理醫(yī)生平臺(tái)旨在整合醫(yī)院醫(yī)生資源,幫助心理醫(yī)生和患者之間建立有效就醫(yī)的信息平臺(tái),移動(dòng)app的應(yīng)用使得醫(yī)患雙方可以更加便捷的完成就醫(yī)過程。
    發(fā)表于 12-20 16:25 ?3次下載
    心理醫(yī)生<b class='flag-5'>云</b><b class='flag-5'>平臺(tái)</b>及移動(dòng)<b class='flag-5'>端</b><b class='flag-5'>App</b><b class='flag-5'>系統(tǒng)</b>的分析與設(shè)計(jì)
    大发888下载 df888| 悠游棋牌游戏| 爱拼百家乐的玩法技巧和规则| 优博百家乐yobo88| 24卦| 博彩百家乐官网最新优惠| 网上百家乐官网有人赢过吗| 百家乐官网有没有绝| 佛坪县| 色中色最新网址| 大赢家博彩网| 财神娱乐城打不开| 顶级赌场官方直营| 大发888是什么软件| 大发888假冒网站| 大发888游戏注册送98| 威尼斯人娱乐场官网h00| 免费百家乐计划工具| 百家乐赚水方法| 真人百家乐蓝盾娱乐平台| 百家乐六亿财富| 百家乐稳赢技法| 安桌百家乐游戏百家乐 | 澳门百家乐规例| 百家乐视频免费下载| 环球百家乐现金网| 百家乐视频交流| 百家乐重要心态| 阳宅24山吉凶方位| 做生意风水方向怎么看| 百家乐路纸表格| 百家乐中B是什么| 百家乐游戏机博彩正网| 克拉克百家乐试玩| 真人百家乐怎么对冲| 网络百家乐怎么作弊| 澳门百家乐公试打法| 噢门百家乐玩法| 百家乐桌布9人| 百家乐新送彩金| 曼哈顿百家乐的玩法技巧和规则|