chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

基于STM32+ESP8266+華為云IoT設(shè)計(jì)的健康管理系統(tǒng)并完成應(yīng)用側(cè)開(kāi)發(fā)

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-07-11 09:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、前言

近幾年隨著科技的進(jìn)步和智能化浪潮的到來(lái),智能穿戴設(shè)備也在飛速火爆發(fā)展,各種健康智能手環(huán),智能手表、智能跑鞋、智能眼鏡紛紛上市,并出現(xiàn)了很多針對(duì)個(gè)人家庭的健康管理設(shè)備。比如: 智能血壓計(jì)、智能心率檢測(cè)、脂肪秤、智能體重秤等等,都帶上了智能、健康各種標(biāo)簽。

可穿戴設(shè)備,即直接穿在身上,或是整合到用戶的衣服或配件的一種便攜式設(shè)備。可穿戴設(shè)備不僅僅是一種硬件設(shè)備,更是通過(guò)軟件支持以及數(shù)據(jù)交互、云端交互來(lái)實(shí)現(xiàn)強(qiáng)大的功能,可穿戴設(shè)備將會(huì)對(duì)生活、感知帶來(lái)很大的轉(zhuǎn)變。

這篇文章就利用STM32加上各種外設(shè)傳感器配合華為云IOT物聯(lián)網(wǎng)平臺(tái)設(shè)計(jì)一個(gè)健康管理設(shè)備,通過(guò)ESP8266+MQTT協(xié)議將數(shù)據(jù)傳輸導(dǎo)致華為云物聯(lián)網(wǎng)平臺(tái),并通過(guò)華為云的應(yīng)用側(cè)完成應(yīng)用層軟件開(kāi)發(fā);設(shè)計(jì)本項(xiàng)目的目的就是,上手體驗(yàn)華為云物聯(lián)網(wǎng)平臺(tái),并探究一下智能設(shè)備的實(shí)現(xiàn)原理。

當(dāng)前設(shè)計(jì)的監(jiān)控管理設(shè)備支持的功能有: (1)人體溫度測(cè)量 (2)運(yùn)動(dòng)監(jiān)測(cè)、計(jì)步功能 (3)睡眠監(jiān)測(cè) (4)心率測(cè)量

STM32采集這些傳感器數(shù)據(jù)之后,進(jìn)行處理,在本地OLED顯示屏上完成顯示;再通過(guò)ESP8266將數(shù)據(jù)傳遞到華為云物聯(lián)網(wǎng)平臺(tái),關(guān)聯(lián)數(shù)據(jù)可視化大屏完成數(shù)據(jù)展示。

下面是示波器測(cè)量的心率顯示

image-20220113113247970

設(shè)備運(yùn)行效果:

image-20220113105130355

image-20220113170207055

二、硬件介紹

2.1 主控芯片

主控芯片采用STM32F103C8T6,它一款基于ARM Cortex-M 內(nèi)核STM32系列的32位的微控制器,程序存儲(chǔ)器容量是64KB,RAM空間是20K,工作電壓2V~3.6V,運(yùn)行速度72MHZ。

image-20220113113146484

2.2 體溫測(cè)量

人體溫度測(cè)量,采用非接觸式紅外測(cè)溫芯片GY-MCU90615,工作電壓 3-5v 功耗小,體積小。其工作原理, 是通過(guò)單片機(jī)讀取紅外溫度度數(shù)據(jù),串口(TTL 電平)通信方式輸出。串口的波特率有 9600bps 與 115200bps有連續(xù)輸出與詢問(wèn)輸出兩種方式,可適應(yīng)不同的工作環(huán)境,與所有的單片機(jī)及電腦連接。

image-20220113105156144

2.3 心率測(cè)量

心率測(cè)量,采用PulseSensor傳感器,這是一款用于脈搏心率測(cè)量的光電反射式模擬傳感器,通過(guò)模擬輸出口可將采集到的模擬信號(hào)傳輸給 STM32單片機(jī)用來(lái)轉(zhuǎn)換為數(shù)字信號(hào),再通過(guò)單片機(jī)簡(jiǎn)單計(jì)算后就可以得到心率數(shù)值。

image-20220113105210621

2.4 計(jì)步、睡眠監(jiān)測(cè)功能

計(jì)步模塊,睡眠監(jiān)測(cè),運(yùn)動(dòng)監(jiān)測(cè)功能采用MUP6050陀螺儀實(shí)現(xiàn),這是一款高性能三軸加速度+三軸陀螺儀的六軸傳感器,該模塊采用InvenSense 公司的 MPU6050 芯片作為核心, 該芯片內(nèi)部整合了3軸陀螺儀和3軸加速度傳感器,并可利用自帶的數(shù)字運(yùn)動(dòng)處理器硬件加速引擎,通過(guò)主 IIC 接口,向應(yīng)用端輸出姿態(tài)解算后的數(shù)據(jù)。有了DMP,可以使用 InvenSense 公司提供的運(yùn)動(dòng)處理資料庫(kù),非常方便的實(shí)現(xiàn)姿態(tài)解算,降低了運(yùn)動(dòng)處理運(yùn)算對(duì)操作系統(tǒng)的負(fù)荷,同時(shí)大大降低了開(kāi)發(fā)難度。 MPU6050 模塊具有:體積小、自帶 DMP、 自帶溫度傳感器、 支持 IIC 從機(jī)地址設(shè)置和中斷、兼容 3.3V/5V 系統(tǒng)、使用方便等特點(diǎn)。

image-20220113105326453

(5)本地?cái)?shù)據(jù)顯示用的OLED顯示屏采用0.96寸的SPI接口顯示屏,分辨率為 128*64,主要是在本地顯示采集的數(shù)據(jù),時(shí)間等信息。

image-20220113105602232

(6)上網(wǎng)的模塊采用ESP8266,ESP8266是物聯(lián)網(wǎng)領(lǐng)域常見(jiàn)無(wú)線網(wǎng)卡芯片,支持AT指令,支持串口協(xié)議控制,只需要幾個(gè)簡(jiǎn)單的AT指令就可以完成網(wǎng)絡(luò)連接,數(shù)據(jù)傳輸。當(dāng)前項(xiàng)目里,就是通過(guò)ESP8266將采集的數(shù)據(jù)傳遞到華為云IOT平臺(tái),實(shí)現(xiàn)數(shù)據(jù)展示。

image-20220113105659834

三、創(chuàng)建IOT產(chǎn)品、上云測(cè)試

3.1 創(chuàng)建產(chǎn)品

官網(wǎng)地址: https://www.huaweicloud.com/s/JeeJqeiBlOe9kSU

選擇IOTDA進(jìn)入,選擇免費(fèi)試用。

image-20220113111627259

image-20220113111713754

在產(chǎn)品頁(yè)面,選擇右上角創(chuàng)建產(chǎn)品。

image-20220113111757856

根據(jù)提示,填入對(duì)應(yīng)參數(shù)。

image-20220113112005762

創(chuàng)建好之后,查看產(chǎn)品詳情,進(jìn)入屬性配置頁(yè)面。

image-20220113112059026

選擇自定義模型。

image-20220113112129287

添加服務(wù)。

image-20220113112224296

接下來(lái)就添加屬性,屬性就是傳感器上傳的數(shù)據(jù)類型,需要展示的數(shù)據(jù);根據(jù)自己傳感器的數(shù)量、類型自己設(shè)置即可。

添加心率傳感器數(shù)據(jù)屬性。

image-20220113112431629

添加體溫傳感器數(shù)據(jù)屬性。

image-20220113112528866

添加計(jì)步功能的數(shù)據(jù)屬性。

image-20220113112657761

創(chuàng)建成功:

image-20220113112841104

3.2 注冊(cè)設(shè)備

打開(kāi)設(shè)備頁(yè)面,點(diǎn)擊右上角注冊(cè)設(shè)備按鈕,根據(jù)提示和產(chǎn)品的信息填入;創(chuàng)建完保存得到的信息。

image-20220113113532461

點(diǎn)擊確定之后,創(chuàng)建成功效果如下;目前設(shè)備還未激活,需要設(shè)備登錄一次服務(wù)器即可激活;接下來(lái)就是如何登錄了。

image-20220113113713819

3.3 設(shè)備上云測(cè)試

完成產(chǎn)品、設(shè)備創(chuàng)建之后,接下來(lái)采用MQTT客戶端模擬設(shè)備,測(cè)試是否可以正常上華為云。

連接協(xié)議使用MQTT協(xié)議,MQTT協(xié)議登錄服務(wù)器,就像QQ登錄一樣,需要輸入賬號(hào)、密碼等一些信息;下面先利用華為云的小工具完成這些數(shù)據(jù)的創(chuàng)建。

華為云提供的MQTT賬戶信息生成在線小工具: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

前面兩行填入的數(shù)據(jù),在創(chuàng)建設(shè)備成功時(shí)提示下載的文件里有,照著填寫(xiě)即可。

image-20220113114545591

我的設(shè)備生成的數(shù)據(jù)如下:

ClientId   61df9a6bc7fb24029b0c160d_1126626497_0_0_2022011303
 Username   61df9a6bc7fb24029b0c160d_1126626497
 Password   20618c172eb24418e0910804889c7d2074a5847e9e7205a41a8bf5adeec399f9

華為云IOT平臺(tái)的MQTT服務(wù)器地址信息如下:

端口: 1883
 域名: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
 IP地址: 121.36.42.100

華為云IOT平臺(tái)MQTT協(xié)議訂閱主題的格式:

格式: $oc/devices/{device_id}/sys/messages/down
 //訂閱主題: 平臺(tái)下發(fā)消息給設(shè)備
 $oc/devices/61df9a6bc7fb24029b0c160d_1126626497/sys/messages/down

華為云IOT平臺(tái)MQTT協(xié)議上報(bào)主題的格式:

格式: $oc/devices/{device_id}/sys/properties/report
 //設(shè)備上報(bào)主題請(qǐng)求
 $oc/devices/61df9a6bc7fb24029b0c160d_1126626497/sys/properties/report
 ?
 ?
 //上報(bào)的數(shù)據(jù)格式如下
 {"services": [{"service_id": "healthy","properties":{"HeartRate":127}},{"service_id": "healthy","properties":{"motion":2000}},{"service_id": "healthy","properties":{"temperature":36.2}}]}

打開(kāi)MQTT客戶端,填入對(duì)應(yīng)數(shù)據(jù),連接華為云物聯(lián)網(wǎng)平臺(tái):

如需使用和我一樣的同款軟件,打開(kāi)百度搜索MQTT客戶端_v2.4(協(xié)議3.1.1).exe 即可找到下載地址。

image-20220113115522655

登錄成功后,查看華為云頁(yè)面,可以看到設(shè)備已經(jīng)在線,并且上傳的數(shù)據(jù)已經(jīng)展示出來(lái)。

image-20220113115641873

四、應(yīng)用側(cè)軟件開(kāi)發(fā)

4.1 功能介紹

為了更方便的展示設(shè)備數(shù)據(jù),與設(shè)備完成交互,還需要開(kāi)發(fā)一個(gè)配套的上位機(jī),官方提供了應(yīng)用側(cè)開(kāi)發(fā)的API接口、SDK接口,為了方便通用一點(diǎn),我這里采用了API接口完成數(shù)據(jù)交互,上位機(jī)軟件采用QT開(kāi)發(fā)。

幫助文檔地址: https://support.huaweicloud.com/usermanual-iothub/iot_01_0045.html

image-20220113142020653

4.2 查詢?cè)O(shè)備屬性接口

設(shè)備屬性就是設(shè)備上傳的傳感器狀態(tài)數(shù)據(jù)信息,應(yīng)用側(cè)提供了API接口,可以主動(dòng)向設(shè)備端下發(fā)請(qǐng)求指令;設(shè)備端收到指令之后需要按照約定的數(shù)據(jù)格式上報(bào)數(shù)據(jù);所以,要實(shí)現(xiàn)應(yīng)用層與設(shè)備端的數(shù)據(jù)交互,需要應(yīng)用層與設(shè)備端配合才能完成。

下面分別介紹應(yīng)用測(cè)和設(shè)備測(cè)的實(shí)現(xiàn)流程。

(1)應(yīng)用層下發(fā)的指令

幫助文檔地址: https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html

接口的在線調(diào)試地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=IoTDA&api=ListProperties

如果請(qǐng)求參數(shù)和返回值不清楚,寫(xiě)代碼前,先使用在線調(diào)試接口體驗(yàn)一下,驗(yàn)證數(shù)據(jù)交互是否OK。

image-20220113143843235

請(qǐng)求參數(shù)里比較總要的兩個(gè)必填參數(shù),是設(shè)備ID和服務(wù)ID,這兩個(gè)參數(shù)在第3章節(jié)就介紹過(guò)如何獲取了,在產(chǎn)品頁(yè)面創(chuàng)建自定義屬性時(shí)可以看到服務(wù)ID。

image-20220113144010538

請(qǐng)求接口總結(jié):

請(qǐng)求方法 GET
 URI地址  /v5/iot/{project_id}/devices/{device_id}/properties
 傳輸協(xié)議 HTTPS
 ?
 拼接好的地址: 
 https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/0e5957be8a00f53c2fa7c0045e4d8fbf/devices/61df9a6bc7fb24029b0c160d_1126626497/properties?service_id=1126626497
 ?
 其中的project_id和device_id需要根據(jù)自己的設(shè)備信息修改。
 ?
 ?
 請(qǐng)求頭:
 {
  "User-Agent": "API Explorer",
  "X-Auth-Token": "******",   這個(gè)是鑒權(quán)用的token
  "Content-Type": "application/json"
 }
 ?
 ?
 響應(yīng)體(設(shè)備上傳的數(shù)據(jù))
 {
  "response": {
   "services": [
    {
     "service_id": "healthy",
     "properties": {
      "HeartRate": 127
     }
    },
    {
     "service_id": "healthy",
     "properties": {
      "motion": 2000
     }
    },
    {
     "service_id": "healthy",
     "properties": {
      "temperature": 36.2
     }
    }
   ]
  }
 }

請(qǐng)求頭里需要填X-Subject-Token參數(shù),這個(gè)參數(shù)只要是訪問(wèn)任何華為云都需要填,獲取具體的流程可以看這里。https://bbs.huaweicloud.com/blogs/317759 翻到第3小節(jié)。

(2)設(shè)備上傳數(shù)據(jù)

應(yīng)用層向設(shè)備端請(qǐng)求查詢?cè)O(shè)備屬性時(shí),設(shè)備端會(huì)收到如下的消息:

$oc/devices/61df9a6bc7fb24029b0c160d_1126626497/sys/properties/get/request_id=336bcb57-0e0a-44d0-90f7-31386cb54a3c{"service_id":"1126626497"}

這個(gè)消息里有一個(gè)主要參數(shù)request_id請(qǐng)求ID,設(shè)備端需要解析出這個(gè)參數(shù),給應(yīng)用層響應(yīng)數(shù)據(jù)時(shí),需要帶上這個(gè)ID。

這個(gè)請(qǐng)求屬性詳細(xì)幫助文檔看這里: https://support.huaweicloud.com/api-iothub/iot_06_v5_3011.html

image-20220113145229538

設(shè)備響應(yīng)的數(shù)據(jù)格式:

主題格式: $oc/devices/{device_id}/sys/properties/get/response/request_id={request_id}
 ?
 示    例:
 $oc/devices/61df9a6bc7fb24029b0c160d_1126626497/sys/properties/get/response/request_id=336bcb57-0e0a-44d0-90f7-31386cb54a3c
 ?
 響應(yīng)的數(shù)據(jù)格式:
 {"services": [{"service_id": "healthy","properties":{"HeartRate":127}},{"service_id": "healthy","properties":{"motion":2000}},{"service_id": "healthy","properties":{"temperature":36.2}}]}

響應(yīng)的數(shù)據(jù)格式可以看這里的介紹: https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html

image-20220113144957661

4.3 在線API調(diào)試結(jié)合設(shè)備模擬

下面使用MQTT客戶端與在線API接口聯(lián)合模擬一下接口效果:

(1)先打開(kāi)調(diào)試頁(yè)面: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=IoTDA&api=ListProperties

然后填好設(shè)備DI和服務(wù)ID:

image-20220113145604854

(2)、打開(kāi)MQTT客戶端,登錄華為云物聯(lián)網(wǎng)平臺(tái)(也就是模擬設(shè)備上線):

image-20220113145709545

(3)、打開(kāi)在線API調(diào)試頁(yè)面,點(diǎn)擊調(diào)試: 點(diǎn)擊后可以看到頁(yè)面上已經(jīng)在等待客戶端的響應(yīng)了。

image-20220113145810872

(4)、MQTT客戶端響應(yīng)詳細(xì)

按照前面說(shuō)的響應(yīng)格式,拼接好接口,數(shù)據(jù)。然后發(fā)布主題。

image-20220113150012520

(5)、應(yīng)用層收到客戶端響應(yīng),調(diào)試成功

調(diào)試成功后,響應(yīng)體里收到的就是設(shè)備端上傳的設(shè)備屬性數(shù)據(jù)。

image-20220113150211946

4.4 應(yīng)用層核心代碼

/*
 功能: 獲取token
 */
 void Widget::GetToken()
 {
     //表示獲取token
     function_select=3;
 ?
     QString requestUrl;
     QNetworkRequest request;
 ?
     //設(shè)置請(qǐng)求地址
     QUrl url;
 ?
     //獲取token請(qǐng)求地址
     requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens")
                  .arg(SERVER_ID);
 ?
     //自己創(chuàng)建的TCP服務(wù)器,測(cè)試用
     //requestUrl="http://10.0.0.6:8080";
 ?
     //設(shè)置數(shù)據(jù)提交格式
     request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8"));
 ?
     //構(gòu)造請(qǐng)求
     url.setUrl(requestUrl);
 ?
     request.setUrl(url);
 ?
     QString text =QString("{"auth":{"identity":{"methods":["password"],"password":"
     "{"user":{"domain": {"
     ""name":"%1"},"name": "%2","password": "%3"}}},"
     ""scope":{"project":{"name":"%4"}}}}")
             .arg(MAIN_USER)
             .arg(IAM_USER)
             .arg(IAM_PASSWORD)
             .arg(SERVER_ID);
 ?
     //發(fā)送請(qǐng)求
     manager- >post(request, text.toUtf8());
 }
 ?
 //查詢?cè)O(shè)備屬性
 void Widget::Get_device_properties()
 {
     //表示獲取token
     function_select=0;
 ?
     QString requestUrl;
     QNetworkRequest request;
 ?
     //設(shè)置請(qǐng)求地址
     QUrl url;
 ?
     //獲取token請(qǐng)求地址
     requestUrl = QString("https://iotda.%1.myhuaweicloud.com/v5/iot/%2/devices/%3/properties?service_id=%4")
                  .arg(SERVER_ID)
             .arg(PROJECT_ID)
             .arg(device_id)
             .arg(service_id);
 ?
     //自己創(chuàng)建的TCP服務(wù)器,測(cè)試用
     //requestUrl="http://10.0.0.6:8080";
 ?
     //設(shè)置數(shù)據(jù)提交格式
     request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
 ?
     //設(shè)置token
     request.setRawHeader("X-Auth-Token",Token);
 ?
     //構(gòu)造請(qǐng)求
     url.setUrl(requestUrl);
 ?
     request.setUrl(url);
 ?
     //發(fā)送請(qǐng)求
     manager- >get(request);
 }

image-20220113164911187

五、設(shè)備底層開(kāi)發(fā)

篇幅有限,整個(gè)項(xiàng)目工程和上位機(jī)源碼可以在這里下載: https://download.csdn.net/download/xiaolong1126626497/81993720

下面列出STM32設(shè)備底層端的一些傳感器核心處理代碼。

5.1 心率采集計(jì)算算法

int BPM;                             // 用于保存脈沖速率
 int Signal;                          // 持有的原始數(shù)據(jù)
 int IBI = 600;                       
 unsigned char Pulse = false;    
 unsigned char QS = false;        
 int rate[10];                    
 unsigned long sampleCounter = 0; 
 unsigned long lastBeatTime = 0;  
 int P =512;                      
 int T = 512;                     
 int thresh = 512;               
 int amp = 100;                  
 unsigned char firstBeat = true;  
 unsigned char secondBeat = false;
 /*
     定時(shí)器2中斷服務(wù)函數(shù) 用于周期性采集心率值
 */
 void TIM2_IRQHandler(void)
 {
     uint16_t runningTotal=0;
     uint8_t i;
     uint16_t Num;
     
     if(TIM2- >SR&1< < 0)
     {
             //讀取到的值右移2位,12位-- >10位
         Signal = Get_AdcCHx_DATA(1) > >2;         
         sampleCounter += 2;                          
         Num = sampleCounter - lastBeatTime; 
 ?
         //發(fā)現(xiàn)脈沖波的波峰和波谷
         //  find the peak and trough of the pulse wave
         if(Signal < thresh && Num > (IBI/5)*3)
         {   
             if (Signal < T)
             {                                                   
                 T = Signal;  
             }
         }
 ?
         if(Signal > thresh && Signal > P)
         { 
             P = Signal; 
         }  
 ?
         //開(kāi)始尋找心跳
         //當(dāng)脈沖來(lái)臨的時(shí)候,signal的值會(huì)上升
         if (Num > 250)
         {                            
             if ( (Signal > thresh) && (Pulse == false) && (Num > (IBI/5)*3) )
             {        
                 Pulse = true;                         
                 //LED0(0); 
                 IBI = sampleCounter - lastBeatTime;       
                 lastBeatTime = sampleCounter;              
 ?
                 if(secondBeat)
                 {                       
                     secondBeat = false;             
                     for(i=0; i<=9; i++)
                     {               
                         rate[i] = IBI;              
                     }
                 }
 ?
                 if(firstBeat)
                 {                                               
                     firstBeat = false;                      
                     secondBeat = true;                      
                     return;                                 
                 }   
 ?
                 for(i=0; i<=8; i++)
                 {                                               
                     rate[i] = rate[i+1];                
                     runningTotal += rate[i];           
                 }
 ?
                 rate[9] = IBI;                       
                 runningTotal += rate[9];                
                 runningTotal /= 10;                     
                 BPM = 60000/runningTotal;               
                 QS = true;                            
             }                       
         }
 ?
         //脈沖開(kāi)始下降
         if (Signal < thresh && Pulse == true)
         {
             Pulse = false;                        
             amp = P - T;                          
             thresh = amp/2 + T;                    
             P = thresh;                         
             T = thresh;
         }
 ?
         //沒(méi)有檢測(cè)到脈沖,設(shè)置默認(rèn)值
         if (Num > 2500)
         {                       
             thresh = 512;                       
             P = 512;                              
             T = 512;                              
             lastBeatTime = sampleCounter;               
             firstBeat = true;                      
             secondBeat = false;                    
         }   
     }
     TIM2- >SR&=0x0; //清中斷標(biāo)志
 }

5.2 OLED關(guān)鍵代碼

//向SSD1106寫(xiě)入一個(gè)字節(jié)。
 //dat:要寫(xiě)入的數(shù)據(jù)/命令
 //cmd:數(shù)據(jù)/命令標(biāo)志 0,表示命令;1,表示數(shù)據(jù);
 void OLED_WR_Byte(u8 dat,u8 cmd)
 {   
     u8 i;             
     if(cmd)
       OLED_DC_Set();
     else 
       OLED_DC_Clr();          
     OLED_CS_Clr();
     for(i=0;i< 8;i++)
     {             
         OLED_SCLK_Clr();
         if(dat&0x80)
            OLED_SDIN_Set();
         else 
            OLED_SDIN_Clr();
         OLED_SCLK_Set();
         dat< <=1;   
     }                         
     OLED_CS_Set();
     OLED_DC_Set();        
 } 
 ?
 //設(shè)置坐標(biāo)的位置(x范圍: 0~127   ,   y的范圍:0~63)
 //注意: 8 行為一頁(yè),共 64 行即 8 頁(yè)
 void OLED_Set_Pos(unsigned char x, unsigned char y) 
 { 
     OLED_WR_Byte(0xb0+y,OLED_CMD);
     OLED_WR_Byte(((x&0xf0) > >4)|0x10,OLED_CMD);
     OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); 
 }

5.3 體溫采集換算

u8 Receive_ok;
 u8 rebuf[20]={0};
 void RxTempInfo(void)
 {
      static uint8_t i=0;
     if(USART2- >SR&1< < 5)     //判斷接收標(biāo)志
     {
         rebuf[i++]=USART2- >DR;//讀取串口數(shù)據(jù),同時(shí)清接收標(biāo)志
         if(rebuf[0]!=0x5a)    //幀頭不對(duì)
             i=0;    
         if((i==2)&&(rebuf[1]!=0x5a))//幀頭不對(duì)
             i=0;
     
         if(i >3)//i等于4時(shí),已經(jīng)接收到數(shù)據(jù)量字節(jié)rebuf[3]
         {
             if(i!=(rebuf[3]+5))//判斷是否接收一幀數(shù)據(jù)完畢
                 return ;    
             switch(rebuf[2])   //接收完畢后處理
             {
                 case 0x45:
                     if(!Receive_ok)//當(dāng)數(shù)據(jù)處理完成后才接收新的數(shù)據(jù)
                     {
                          Receive_ok=1;//接收完成標(biāo)志
                     }
                     break;
                 case 0x15:break;
                 case 0x35:break;
             }
             i=0;//緩存清0
         }
     }
 }
 ?
 void GetTempInfo(void)
 {
     float TO=0,TA=0;
     u8 sum=0,i=0;
     for(sum=0,i=0;i< (rebuf[3]+4);i++)
     {
         sum+=rebuf[i];  
     }
     if(sum==rebuf[i])//校驗(yàn)和判斷
     {
         TO=(float)((rebuf[4]< < 8)|rebuf[5])/100;  //得到真實(shí)溫度
         TA=(float)((rebuf[6]< < 8)|rebuf[7])/100;  //得到真實(shí)溫度   
     }
     printf("TO: %f
",TO);
     printf("TA: %f
",TA);
 }

5.4 運(yùn)動(dòng)計(jì)步算法

/*******************************************************************************
 * LOCAL VARIABLES
 */
 //存放三軸數(shù)據(jù)  
 float oriValues[3] = {0};    
 //用于存放計(jì)算閾值的波峰波谷差值  
 float tempValue[VALUE_NUM] ={0};  
 int tempCount = 0;  
 //是否上升的標(biāo)志位  
 u8 isDirectionUp = FALSE;  
 //持續(xù)上升次數(shù)  
 int continueUpCount = 0;  
 //上一點(diǎn)的持續(xù)上升的次數(shù),為了記錄波峰的上升次數(shù)  
 int continueUpFormerCount = 0;  
 //上一點(diǎn)的狀態(tài),上升還是下降  
 u8 lastStatus = FALSE;  
 //波峰值  
 float peakOfWave = 0;  
 //波谷值  
 float valleyOfWave = 0;  
 //此次波峰的時(shí)間  
 long timeOfThisPeak = 0;  
 //上次波峰的時(shí)間  
 long timeOfLastPeak = 0;  
 //當(dāng)前的時(shí)間  
 long timeOfNow = 0;  
 //當(dāng)前傳感器的值  
 float gravityNew = 0;  
 //上次傳感器的值  
 float gravityOld = 0;  
 //動(dòng)態(tài)閾值需要?jiǎng)討B(tài)的數(shù)據(jù),這個(gè)值用于這些動(dòng)態(tài)數(shù)據(jù)的閾值  
 float initialValue = (float) 1.3;  
 //初始閾值  
 float ThreadValue = (float) 2.0;
 //三軸軸值
 accValue_t accValue;
 //行走信息:卡路里、里程、步數(shù)
 static sportsInfo_t sportsInfo;
 //計(jì)步緩存
 static u8 stepTempCount =0;
 ?
 ?
 /*******************************************************************************
 * 函數(shù)名:DetectorNewStep
 * 功能描述: 
 *         步伐更新:如果檢測(cè)到了波峰,并且符合時(shí)間差以及閾值的條件,則判定為1步       
 *         閥值更新:符合時(shí)間差條件,波峰波谷差值大于initialValue,則將該差值納入閾值的計(jì)算中       
 * 參數(shù)說(shuō)明:  
 輸入:
 values:經(jīng)過(guò)處理的G-sensor數(shù)據(jù)
 timeStamp_p:時(shí)間戳
 * 返回值說(shuō)明:
 * 修改記錄:sportsInfo_t *onSensorChanged(accValue_t *pAccValue,timeStamp_t *timeStamp_p,personInfo_t * personInfo)
 *******************************************************************************/
 sportsInfo_t *DetectorNewStep(float values,timeStamp_t *timeStamp_p,personInfo_t * personInfo) 
 {  
   static u32 time_old;
   personInfo_t *userInfo = personInfo;
   static u32 step_per_2_second;  //每?jī)擅胨叩牟綌?shù)
   float step_lenth,walk_speed,walk_distance,Calories;//步長(zhǎng)
   u32 time_now;
   timeStamp_t *time_p = timeStamp_p;
   if (gravityOld == 0) 
   {  
     gravityOld = values;  
   } 
   else 
   {  
     if (DetectorPeak(values, gravityOld))//檢測(cè)到波峰
     {  
       timeOfLastPeak = timeOfThisPeak;//更新上次波峰的時(shí)間  
       //將時(shí)間戳轉(zhuǎn)換為以毫秒ms為單位
       time_now = timeOfNow = ((time_p- >hour*60+time_p- >minute)*60+time_p- >second)*1000+time_p- >twentyMsCount*20; //獲取時(shí)間 ,并轉(zhuǎn)化為毫秒
       //如果檢測(cè)到了波峰,并且符合時(shí)間差以及閾值的條件,則判定為1步 
       if (  (timeOfNow - timeOfLastPeak >= 250 )//Jahol Fan 修改為300,防止輕微動(dòng)都也會(huì)檢測(cè)步子
           //&& (timeOfNow - timeOfLastPeak <= 2000)
           &&(peakOfWave - valleyOfWave >= ThreadValue)
             )
       {  
         timeOfThisPeak = timeOfNow; //更新此次波峰時(shí)間 
         
         
         stepTempCount++;//Jahol:加1為兩步
         step_per_2_second ++;
         //Jahol:這樣計(jì)算卡路里,不能濾除人為的誤操作,導(dǎo)致的結(jié)果是:里程和卡路里偏大
         if((time_now - time_old) >= 2000 )    //如果時(shí)間過(guò)了2秒
         {
 ?
           if( 1 == step_per_2_second )                 
           {
             step_lenth = userInfo- >height/5;
           }
           else if( 2 == step_per_2_second )
           {
             step_lenth = userInfo- >height/4;
           }
           else if( 3 == step_per_2_second )
           {
             step_lenth = userInfo- >height/3;
           }
           else if( 4 == step_per_2_second )
           {
             step_lenth = userInfo- >height/2;
           }
           else if(5 == step_per_2_second)             //Jahol:為了使計(jì)步準(zhǔn)確,設(shè)置上限值為5步,犧牲卡路里準(zhǔn)確性
           {
             step_lenth = userInfo- >height/1.2f;
           }
           else if( 7 == step_per_2_second )
           {
             step_lenth = userInfo- >height;
           }
           else if(step_per_2_second >= 8)               //      step_diff >8
           {
             step_lenth = userInfo- >height*1.2f;
           }
           else 
           {
             step_lenth = 0;
           }
           walk_speed = step_per_2_second*step_lenth/2;   //速度 ,單位:米/秒
           walk_distance  = step_per_2_second*step_lenth; //行走距離,單位:米
           Calories = 4.5f*walk_speed*(userInfo- >weight/2)/1800;  //Jahol:weight是以kg為單位
           sportsInfo.calories  += Calories;
           sportsInfo.distance  += walk_distance;        
           time_old = time_now;         //更新時(shí)間
           step_per_2_second = 0;
           
         }   
         else 
         {
           //do nothing
         }       
         /* 
         * 處理無(wú)效運(yùn)動(dòng): 
         * 1.連續(xù)記錄5才開(kāi)始計(jì)步 
         * 2.例如記錄的步用戶停住超過(guò)3秒,則前面的記錄失效,下次從頭開(kāi)始 
         * 3.連續(xù)4記錄了步用戶還在運(yùn)動(dòng),之前的數(shù)據(jù)才有效 
         * */                
         if ((stepTempCount< 5 )&&(timeOfNow - timeOfLastPeak >= 3000))          
         {
           stepTempCount = 0;
         }
         else if((stepTempCount >= 5)&&(timeOfNow - timeOfLastPeak <= 3000))
         {
           sportsInfo.stepCount += stepTempCount;          
           stepTempCount         = 0;                
         }
         else
         {
           //do nothing
         }
         
         
       }  
       //Jahol:更新閥值,問(wèn)題:閥值不會(huì)一直變大,不能變小?
       if (timeOfNow - timeOfLastPeak >= 250  
           && (peakOfWave - valleyOfWave >= initialValue)) 
       {  
         timeOfThisPeak = timeOfNow;  
         ThreadValue = Peak_Valley_Thread(peakOfWave - valleyOfWave);//更新閥值  
       }  
     }  
   }  
   gravityOld = values;  
   return &sportsInfo;
 }

審核編輯:湯梓紅

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

    關(guān)注

    2293

    文章

    11032

    瀏覽量

    364754
  • IIC
    IIC
    +關(guān)注

    關(guān)注

    11

    文章

    306

    瀏覽量

    39491
  • IOT
    IOT
    +關(guān)注

    關(guān)注

    187

    文章

    4304

    瀏覽量

    201775
  • ESP8266
    +關(guān)注

    關(guān)注

    51

    文章

    965

    瀏覽量

    47394
  • 華為云
    +關(guān)注

    關(guān)注

    3

    文章

    2771

    瀏覽量

    18302
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32+esp8266連接機(jī)智,上傳溫濕度數(shù)據(jù)控制繼電器開(kāi)關(guān)(平臺(tái)配置、代碼生成、代碼移植)

    代碼,通過(guò)手機(jī)APP進(jìn)行設(shè)備控制。元器件準(zhǔn)備在開(kāi)始之前,您需要準(zhǔn)備以下硬件元器件:1.STM32開(kāi)發(fā)板2.ESP8266Wi-Fi模塊3.溫濕度傳感器(如DHT1
    的頭像 發(fā)表于 07-15 18:54 ?31次閱讀
    <b class='flag-5'>STM32+esp8266</b>連接機(jī)智<b class='flag-5'>云</b>,上傳溫濕度數(shù)據(jù)<b class='flag-5'>并</b>控制繼電器開(kāi)關(guān)(平臺(tái)配置、代碼生成、代碼移植)

    基于STM32 HAL庫(kù)與標(biāo)準(zhǔn)庫(kù)的esp8266接入機(jī)智方案(二)

    在《基于STM32HAL庫(kù)與標(biāo)準(zhǔn)庫(kù)的esp8266接入機(jī)智方案(一)》中,我們?cè)敿?xì)介紹了硬件連接和機(jī)智客戶端的創(chuàng)建。本篇將重點(diǎn)講解如何下載代碼、分析下載的代碼,
    的頭像 發(fā)表于 05-28 18:02 ?468次閱讀
    基于<b class='flag-5'>STM32</b> HAL庫(kù)與標(biāo)準(zhǔn)庫(kù)的<b class='flag-5'>esp8266</b>接入機(jī)智<b class='flag-5'>云</b>方案(二)

    ESP8266燒錄與機(jī)智一鍵配網(wǎng)教程

    ESP8266模塊因其低成本和高性能,廣泛應(yīng)用于智能家居和工業(yè)自動(dòng)化等領(lǐng)域。機(jī)智平臺(tái)提供了一鍵配網(wǎng)功能,簡(jiǎn)化了設(shè)備的聯(lián)網(wǎng)過(guò)程。本教程將詳細(xì)介紹如何使用ESP8266進(jìn)行燒錄,通過(guò)機(jī)
    的頭像 發(fā)表于 05-24 11:04 ?452次閱讀
    <b class='flag-5'>ESP8266</b>燒錄與機(jī)智<b class='flag-5'>云</b>一鍵配網(wǎng)教程

    ESP8266 太空人動(dòng)畫(huà)的 OLED 顯示

    ESP8266 太空人動(dòng)畫(huà)的 OLED 顯示
    的頭像 發(fā)表于 10-08 15:06 ?706次閱讀
    <b class='flag-5'>ESP8266</b> 太空人動(dòng)畫(huà)的 OLED 顯示

    arduino(1)--ESP8266配置

    之后在打開(kāi)開(kāi)發(fā)管理器。 之后輸入esp8266,安裝對(duì)應(yīng)的庫(kù)文件,因?yàn)槲乙呀?jīng)安裝,故顯示為灰色,由于網(wǎng)絡(luò)原因,下載的時(shí)間可能比較久。 安裝完畢之后,選擇Generic ESP8266
    發(fā)表于 09-06 11:00

    STM32 ESP8266阿里鏈接源碼

    stm32F103C8T6 ESP8266 物聯(lián)網(wǎng)電表 登錄阿里
    發(fā)表于 08-29 14:21 ?9次下載

    esp32和esp8266代碼共用嗎

    作為兩款具有Wi-Fi功能的微控制器,因其低成本、易用性和靈活性而受到廣泛關(guān)注。然而,盡管它們?cè)谀承┓矫婢哂邢嗨菩?,但在硬件性能?b class='flag-5'>開(kāi)發(fā)環(huán)境和編程語(yǔ)言等方面仍存在一定差異。 二、ESP32與ESP8266簡(jiǎn)介
    的頭像 發(fā)表于 08-19 18:23 ?2336次閱讀

    esp8266esp32區(qū)別是什么

    以下是關(guān)于ESP8266ESP32的主要區(qū)別: 處理器和架構(gòu) : ESP8266 :使用一個(gè)Tensilica L106 80MHz的處理器,屬于Xtensa架構(gòu)。 ESP32 :使
    的頭像 發(fā)表于 08-19 18:16 ?7316次閱讀

    ESP8266需要燒錄固件庫(kù)嘛

    需要。ESP8266是一款非常流行的Wi-Fi模塊,廣泛應(yīng)用于物聯(lián)網(wǎng)項(xiàng)目中。它具有低成本、低功耗、易于編程等特點(diǎn),因此受到了許多開(kāi)發(fā)者的喜愛(ài)。在開(kāi)發(fā)ESP8266項(xiàng)目時(shí),燒錄固件庫(kù)是一
    的頭像 發(fā)表于 08-19 17:30 ?1872次閱讀

    esp8266不燒錄可以使用嗎

    ESP8266是一款非常流行的Wi-Fi模塊,廣泛應(yīng)用于物聯(lián)網(wǎng)項(xiàng)目中。然而,如果不進(jìn)行燒錄,ESP8266將無(wú)法正常工作。 1. ESP8266簡(jiǎn)介 ESP8266是一款由Espres
    的頭像 發(fā)表于 08-19 17:28 ?1677次閱讀

    esp8266wifi模塊怎么連接手機(jī)

    ESP8266 WiFi模塊連接手機(jī)主要可以通過(guò)兩種方式實(shí)現(xiàn): 通過(guò)路由器連接(STA模式)和直接作為熱點(diǎn)連接(AP模式) 。以下是兩種連接方式的步驟: 一、通過(guò)路由器連接(STA模式) 配置
    的頭像 發(fā)表于 08-19 17:27 ?7595次閱讀

    機(jī)智ESP8266開(kāi)發(fā)板RGB彩燈控件

    用戶帶來(lái)了全新的家居體驗(yàn)。無(wú)論是個(gè)性化的燈光設(shè)置,還是智能化的遠(yuǎn)程管理,這款產(chǎn)品都展現(xiàn)了其在智能家居領(lǐng)域的引領(lǐng)地位。機(jī)智esp8266開(kāi)發(fā)板RGB彩燈控件1、將
    的頭像 發(fā)表于 08-09 08:10 ?800次閱讀
    機(jī)智<b class='flag-5'>云</b><b class='flag-5'>ESP8266</b><b class='flag-5'>開(kāi)發(fā)</b>板RGB彩燈控件

    請(qǐng)問(wèn)ESP是否支持LiteOS+華為IOT+AT的方式?

    我們想使用ESP32 AT模式連接華為IOT平臺(tái),并且ESP32要運(yùn)行LiteOS,請(qǐng)問(wèn)現(xiàn)在ESP
    發(fā)表于 07-19 07:32

    STM32F103 + ESP8266與機(jī)智開(kāi)發(fā)常見(jiàn)問(wèn)題集錦:入門(mén)者必讀!

    關(guān)于ESP8266模塊的選擇針對(duì)初學(xué)者,強(qiáng)烈建議選擇帶有串口的ESP8266開(kāi)發(fā)板!這可以避免像我曾經(jīng)遇到的燒錄固件失敗等問(wèn)題。推薦直接購(gòu)買已預(yù)裝機(jī)智固件的模塊,或者帶有串口下載功能
    的頭像 發(fā)表于 07-18 08:11 ?995次閱讀
    <b class='flag-5'>STM32</b>F103 + <b class='flag-5'>ESP8266</b>與機(jī)智<b class='flag-5'>云</b><b class='flag-5'>開(kāi)發(fā)</b>常見(jiàn)問(wèn)題集錦:入門(mén)者必讀!

    如何在RT-Thread系統(tǒng)下用ESP8266連上EMQX的公用服務(wù)器完成數(shù)據(jù)收發(fā)?

    怎么在RT-Thread系統(tǒng)下用ESP8266連上EMQX的公用服務(wù)器完成數(shù)據(jù)收發(fā)?emmmmm,最好能提供一下構(gòu)建過(guò)程之類的
    發(fā)表于 07-16 08:30