衡阳派盒市场营销有限公司

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

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

3天內不再提示

基于STM32+微波雷達設計的非接觸式睡眠監控系統

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2024-10-12 14:13 ? 次閱讀

一、前言

1.1 項目介紹

項目設計里用到的全部工具軟件都可以在這里下載

[https://pan.quark.cn/s/145a9b3f7f53]

【1】項目開發背景

隨著現代生活節奏的加快,人們對于健康管理的需求日益增長,尤其是對于睡眠健康的關注度顯著提升。良好的睡眠質量不僅關系到個人的精神狀態,更直接影響著工作和學習效率乃至整體生活質量。然而,快節奏的生活壓力、不規律的生活作息等因素導致越來越多的人遭受睡眠障礙的困擾。傳統的睡眠監測方式通常需要佩戴設備或接觸式傳感器,這可能會干擾到用戶的自然睡眠狀態,從而影響監測結果的準確性。因此,開發一種非接觸式的睡眠監測系統,成為了提高睡眠質量研究的重要方向之一。

非接觸式睡眠監測技術的發展,得益于近年來毫米波雷達技術的進步。毫米波雷達具有高精度、強穿透力的特點,可以在不直接接觸人體的情況下,精準地捕捉到人體微動,如呼吸和心跳等細微動作。這種技術的應用,不僅可以避免傳統監測手段可能帶來的不適感,還能在用戶不知情的狀態下進行連續監測,保證了數據的真實性和有效性。與此同時,物聯網技術的發展使得數據的遠程傳輸與分析成為可能,進一步推動了智能健康監測系統的普及。

本項目正是基于這樣的背景下展開的。它利用了60GHz毫米波雷達技術,結合高性能的STM32微控制器,設計了一套完整的非接觸式睡眠監控系統。該系統不僅能準確地獲取用戶的睡眠信息,還能通過Wi-Fi連接云端,讓用戶可以通過手機應用程序隨時查看自己的睡眠報告。此外,系統還具備異常生理指標報警功能,能夠在第一時間提醒用戶注意健康狀況,為用戶提供了一個全方位、智能化的健康管理方案。通過這一創新性的解決方案,期望能夠幫助更多人改善睡眠質量,提升生活質量。

image-20240910171618588

image-20240910171632403

image-20240910171602544

設備安裝角度:

image-20240910164203002

【2】設計實現的功能

(1)人體存在感知與運動感知:通過使用60GHz頻段的毫米波雷達模塊,系統能夠感知房間內是否存在人體以及人體的微小運動,如呼吸和心跳的變化。

(2)睡眠狀態監測:系統能夠根據睡眠過程中身體的運動幅度變化和呼吸心率的變化,實時判斷目標的睡眠狀態,并在睡眠周期結束后提供一個綜合的睡眠評分。

(3)生理指標檢測:系統能夠檢測并記錄睡眠者的心率、呼吸頻率等重要生理指標,這些數據有助于分析睡眠質量。

(4)遠程數據上傳與查看:系統集成了Wi-Fi模塊,可以將監測到的睡眠數據上傳到華為云物聯網平臺,用戶可以通過智能手機應用程序遠程查看每天的睡眠質量報告和其他生理指標。

(5)異常情況報警:當檢測到的生理指標超出預設的安全閾值時,系統會觸發報警機制,及時通知用戶或監護人可能存在健康風險。

(6)本地數據顯示:系統配備了1.44寸SPI協議的TFT LCD顯示屏,用于實時顯示監測到的生理指標及環境相關信息,便于用戶即時查看。

(7)體溫檢測:通過集成MLX90614紅外體溫傳感器,系統能夠檢測人體體溫,并將其作為一項重要的生理參數納入睡眠質量評估體系中。

【3】項目硬件模塊組成

(1)主控單元:選用STM32F103RCT6微控制器作為核心處理單元,負責接收來自各傳感器的數據,并處理和控制系統的各項功能。

(2)毫米波雷達模塊:采用60GHz頻段的R60ABD1毫米波雷達模塊,用于非接觸式地檢測人體的存在、呼吸頻率和心率等生理信號

(3)無線通信模塊:集成ESP8266-Wi-Fi模塊,實現數據的無線傳輸功能,確保睡眠數據能夠實時上傳至華為云物聯網平臺。

(4)顯示模塊:采用1.44寸TFT LCD顯示屏,分辨率為128x128像素,通過SPI協議與主控單元通訊,用于顯示監測到的生理指標和環境信息。

(5)體溫檢測模塊:采用MLX90614紅外體溫傳感器,用于無接觸地測量人體體溫,提供額外的健康監測數據。

(6)電源管理模塊:采用外置的5V穩壓電壓,包括電源轉換電路和電池管理電路,確保整個系統能夠穩定運行,并為各個模塊提供所需電壓。

(7)報警模塊:設計蜂鳴器聲音形式的報警裝置,當系統檢測到異常生理指標時,能夠及時提醒用戶。

【4】需求總結

項目:基于STM32+微波雷達設計的非接觸式睡眠監控系統
?
1. 可以實現 人體存在感知、人體運動感知、根據睡眠過程中的身體運動幅度變化和呼吸心率變化,對目標的睡眠狀態、呼吸心跳頻率進行實時判斷,在一段睡眠過程結束后輸出睡眠評分呼吸、能夠檢測心率、睡眠時長、睡眠質量等生理指標
(此功能采用60GHz頻段的毫波雷達來實現)
2. 可以實現能將數據通過
    ESP8266-WIFI上傳到華為云物聯網云平臺、設計手機APP可以遠程查看每天的睡眠質量、生理指標、環境相關信息。
3. 可以實現當檢測到的生理指標數據超過閾值時,系統發出報警提醒。 
4. 可以實現能在本地LCD顯示屏顯示監測到的生理指標、環境相關信息。
5. 支持檢測人體體溫。
?
    
硬件選型:
主控芯片選擇 STM32F103RCT6
LCD顯示屏采用1.44寸 SPI協議的 TFT顯示屏,分辨率是128x128。
人體體溫檢測采用MLX90614紅外體溫傳感器。
人體的呼吸、心率、采用60G毫米波 生物感知雷達R60ABD1模塊來實現檢測。呼吸睡眠雷達基于毫米波雷達體制實現人體生物存在感知及人體運動感知,持續記錄人體存在情況,根據睡眠
過程中的身體運動幅度變化和呼吸心率變化,對目標的睡眠狀態、呼吸心跳頻率進行實時判斷,在一段睡眠過程結
束后輸出睡眠評分,根據相關睡眠參數的輸出結合到健康康養的應用上。

1.2 設計思路

設計思路源于對現代人睡眠健康需求的關注以及對現有睡眠監測技術局限性的思考。在設計之初,注意到傳統的睡眠監測手段往往依賴于接觸式的穿戴設備,這種方式雖然能夠提供較為精確的數據,但卻有可能影響用戶的自然睡眠狀態。因此,設計目標是創造一個非侵入式的睡眠監控系統,能夠讓用戶在自然的睡眠環境中得到準確而有效的監測。

為了實現這一目標,選擇了60GHz頻段的毫米波雷達技術作為主要的監測手段。毫米波雷達具有非接觸、高分辨率和強穿透性等特點,非常適合用來監測人體微弱的生理信號,如呼吸和心跳。通過算法優化,能夠從雷達回波中提取出穩定的呼吸和心跳信號,并據此評估睡眠質量和生理指標。

考慮到用戶體驗的重要性,決定將系統與互聯網技術相結合,通過ESP8266-Wi-Fi模塊將睡眠數據上傳至云端,方便用戶通過智能手機應用程序隨時隨地查看自己的睡眠報告。同時,為了應對突發狀況,設計了閾值報警機制,當檢測到異常生理指標時,系統能夠立即向用戶發出警告,以確保用戶的安全。

硬件選型方面,選擇了性能穩定且廣泛使用的STM32F103RCT6作為主控芯片,以確保系統的可靠性和可擴展性。為了直觀展示數據,選用了1.44寸的TFT LCD顯示屏,它可以清晰地顯示監測到的各項生理指標和環境信息。此外,還加入了MLX90614紅外體溫傳感器,以便系統能夠監測用戶的體溫變化,進一步完善健康監測功能。

總體的設計思路是在不干擾用戶正常生活的情況下,利用先進的毫米波雷達技術和物聯網平臺,創建一個能夠全天候監測睡眠狀態、生理指標,并及時反饋給用戶的智能系統。這樣不僅能夠幫助用戶更好地了解自己的睡眠質量,還能在出現異常時提供及時的幫助,從而提升整體的生活品質。

1.3 系統功能總結

功能類別描述
人體存在感知利用60GHz毫米波雷達檢測房間內是否有人存在。
運動感知感知人體的微小運動,如呼吸和心跳。
睡眠狀態監測根據身體運動幅度變化和呼吸心率變化實時判斷睡眠狀態。
生理指標檢測記錄并分析心率、呼吸頻率等重要生理指標。
遠程數據上傳通過ESP8266-Wi-Fi模塊將監測數據上傳至華為云物聯網平臺。
移動端查看用戶可以通過手機應用程序遠程查看睡眠質量報告和其他生理指標。
異常報警當檢測到的生理指標超過設定閾值時,系統會發出報警提醒。
本地數據顯示通過1.44寸TFT LCD顯示屏實時顯示監測到的生理指標和環境信息。
體溫檢測使用MLX90614紅外體溫傳感器檢測人體體溫,并將其納入健康監測數據中。

1.4 開發工具的選擇

【1】設備端開發

STM32的編程語言選擇C語言,C語言執行效率高,大學里主學的C語言,C語言編譯出來的可執行文件最接近于機器碼,匯編語言執行效率最高,但是匯編的移植性比較差,目前在一些操作系統內核里還有一些低配的單片機使用的較多,平常的單片機編程還是以C語言為主。C語言的執行效率僅次于匯編,語法理解簡單、代碼通用性強,也支持跨平臺,在嵌入式底層、單片機編程里用的非常多,當前的設計就是采用C語言開發。

開發工具選擇Keil,keil是一家世界領先的嵌入式微控制器軟件開發商,在2015年,keil被ARM公司收購。因為當前芯片選擇的是STM32F103系列,STMF103是屬于ARM公司的芯片構架、Cortex-M3內核系列的芯片,所以使用Kile來開發STM32是有先天優勢的,而keil在各大高校使用的也非常多,很多教科書里都是以keil來教學,開發51單片機、STM32單片機等等。目前作為MCU芯片開發的軟件也不只是keil一家獨大,IAR在MCU微處理器開發領域里也使用的非常多,IAR擴展性更強,也支持STM32開發,也支持其他芯片,比如:CC2530,51單片機的開發。從軟件的使用上來講,IAR比keil更加簡潔,功能相對少一些。如果之前使用過keil,而且使用頻率較多,已經習慣再使用IAR是有點不適應界面的。

image-20221210225339928

【2】上位機開發

上位機的開發選擇Qt框架,編程語言采用C++;Qt是一個1991年由Qt Company開發的跨平臺C++圖形用戶界面應用程序開發框架。它既可以開發GUI程序,也可用于開發非GUI程序,比如控制臺工具和服務器。Qt是面向對象的框架,使用特殊的代碼生成擴展(稱為元對象編譯器(Meta Object Compiler, moc))以及一些宏,Qt很容易擴展,并且允許真正地組件編程。Qt能輕松創建具有原生C++性能的連接設備、用戶界面(UI)和應用程序。它功能強大且結構緊湊,擁有直觀的工具和庫。

image-20230218001243591

image-20230218001219105

1.5 模塊的技術詳情介紹

【1】ESP8266-WIFI模塊

ESP8266是一款廣受歡迎的低成本、低功耗的Wi-Fi模塊,廣泛應用于物聯網(IoT)領域。它由樂鑫科技(Espressif Systems)開發,最初作為一款簡單易用的無線模塊推向市場,但因其強大的功能和靈活性迅速獲得了開發者們的青睞。ESP8266內置了Tensilica L106超低功耗32位微處理器,主頻最高可達160MHz,并且擁有512KB的SRAM,這使得它不僅能夠作為一個簡單的Wi-Fi模塊使用,還可以作為獨立的微控制器來執行復雜的任務。

ESP8266模塊支持IEEE 802.11 b/g/n標準,能夠工作在2.4GHz頻段上。它具有多種工作模式,包括Station模式(客戶端)、Access Point模式(熱點)以及Station+AP模式(同時作為客戶端和熱點)。這意味著它可以連接到現有的Wi-Fi網絡,也可以自己創建一個Wi-Fi熱點供其他設備連接,極大地增加了其在不同應用場景中的適用性。

對于開發者而言,ESP8266的一個重要優勢在于其豐富的開發資源和支持。樂鑫科技提供了詳細的開發文檔,包括硬件接口說明、固件升級指南和API參考手冊等。此外,ESP8266還支持多種編程語言,如C/C++和Lua,同時還有成熟的開發框架如Arduino IDE的支持,使得開發者能夠快速上手,并利用各種庫函數簡化開發流程。

ESP8266的低功耗特性也是一大亮點,它提供了多種省電模式,可以根據實際應用需求調整工作狀態,以延長電池壽命。這對于那些依賴電池供電的物聯網設備來說尤為重要。

ESP8266憑借其出色的性價比、強大的功能、易于開發的特性以及廣泛的社區支持,已經成為許多DIY項目、智能家居設備和小型物聯網應用的理想選擇。無論是作為獨立的微控制器還是作為Wi-Fi模塊,ESP8266都能夠滿足大多數物聯網項目的需求。

【2】MLX90614紅外體溫傳感器

MLX90614紅外體溫傳感器是由Melexis公司生產的一款高性能、非接觸式溫度測量傳感器。這款傳感器集成了紅外溫度測量功能與環境溫度測量功能于一體,適用于需要快速、準確測量物體表面溫度的應用場合。由于其非接觸式的特點,MLX90614特別適合用于醫療領域,如監測人體體溫,以及其他工業或商業用途,例如食品溫度檢測、設備過熱保護等。

MLX90614的工作原理基于紅外輻射理論。所有物體都會發射紅外輻射,其強度與物體的溫度成正比。MLX90614通過檢測目標物體發射的紅外輻射能量,并結合傳感器所在環境的溫度,計算出目標物體的表面溫度。這款傳感器具有較高的靈敏度,能夠檢測到非常微小的溫度變化,并且具有較好的響應速度。

從硬件角度來看,MLX90614采用了SMD(Surface Mount Device)封裝,使其易于集成到各種設備中。它具有數字I2C接口,可以方便地與微控制器或其他數字系統進行通信。此外,MLX90614還提供了不同的視場角版本,允許用戶根據具體的應用需求選擇最適合的角度,從而獲得最準確的測量結果。

在使用MLX90614時,需要注意幾個關鍵參數。首先是距離系數(Distance-to-Spot Size Ratio),即傳感器與目標之間的距離與目標面積直徑之比。這個參數決定了傳感器的有效測量區域大小。其次是傳感器的溫度測量范圍,一般為-70°C至+380°C,足以覆蓋大部分日常應用。此外,MLX90614還具備較高的測溫精度,通常在±0.5°C左右,這使得它在醫療和工業應用中具有很高的實用性。

對于開發人員來說,MLX90614的另一個優點是其易于集成。Melexis提供了詳盡的技術文檔和支持,包括電路設計指南、編程示例等資源,使得開發者能夠快速地將MLX90614集成到他們的產品中。此外,市面上也有許多現成的開發板和庫文件,可以幫助開發者簡化開發流程,加速產品的上市時間。

綜上所述,MLX90614紅外體溫傳感器以其高精度、非接觸式測量的特點,在多個行業中得到了廣泛應用,尤其是在需要快速、準確溫度讀數的場合。

【3】微波雷達模塊

生物感知雷達R60ABD1模塊是一款基于60GHz毫米波雷達技術的產品,專為人體呼吸心率感知及睡眠評估而設計。它采用FMCW(調頻連續波)雷達體制,能夠針對特定場合內的人員進行呼吸心率頻率的輸出,并結合長時間的睡眠姿態體動采集,及時上報人員的睡眠狀態和歷史記錄。模塊的一發三收天線形式使得它適合于置頂安裝模式,能夠精準掃描人體全身的動作層析,實現人體動靜態時的睡眠探測和不同姿態下的呼吸心率采集。

該模塊的工作原理基于雷達天線發射電磁波信號,并接收目標反射回來的回波信號。通過雷達處理器解析不同接收天線回波信號的波形參量之間的相位差和能量變化,從而反饋目標運動的微動能量變化、距離、方向和速度等信息。這使得R60ABD1模塊能夠探測目標的運動狀態和胸腔呼吸起伏的頻次狀態。在雷達探測范圍內,即便是輕微的手部晃動或呼吸引起的胸腔起伏等微小運動,也能夠被模塊捕捉到。

R60ABD1模塊具有多種功能,包括運動檢測、呼吸探測、呼吸心率頻率采集等功能。模塊能夠檢測到諸如走動或小幅度手晃動等運動,并觸發有人狀態的指示。當人處于靜止狀態時,模塊也能檢測到由呼吸引起的胸腔起伏,并維持有人狀態的輸出。更重要的是,它能統計呼吸心跳引起的胸腔起伏,并輸出每分鐘的呼吸心跳數值。這些功能使得該模塊在全屋智能、智能家電、區域人員探測和睡眠看護等領域有著廣泛的應用前景。

該模塊的電氣特性包括工作電壓在4.6V至6V之間,典型工作電流為93mA,工作溫度范圍從-20°C至+60°C,存儲溫度范圍則從-40°C至+105°C。其RF性能方面,工作頻率位于61GHz至61.5GHz區間,發射功率不超過6dBm。天線增益為4dBi,水平和垂直波束寬度均為20°(-3dB點)。

R60ABD1模塊提供了標準的UART通信接口,并支持涂鴉協議,便于與其他設備集成。模塊尺寸小巧,體積僅為35mm×31mm×7.5mm,并配有雙排插針接口,接口間距為2.0mm。這些接口包括電源輸入、地、串口接收和發送端、以及多個可定義的通用I/O引腳。其中,部分引腳可用于輸出有人/無人狀態、活躍/靜止狀態、體征參數等信息。

此外,模塊還支持多種參數設置,如人體存在開關、呼吸探測開關、心跳探測開關、睡眠探測開關以及探測模式切換開關(實時探測/睡眠模式)。這些設置使得模塊可以根據不同應用場景的需求進行靈活配置。在安裝方面,R60ABD1模塊推薦傾斜安裝,并且平行于掃描面的距離不超過1.5米。特別是用于睡眠呼吸心跳探測時,雷達應安裝在床頭正上方1米的高度,向下傾斜45°對著床中間,確保雷達與人體胸腔的距離在1.5米范圍內,以確保雷達正常進行探測。

1.6 微波雷達安裝說明

生物感知雷達R60ABD1模塊的安裝需要遵循特定的指導原則以確保其最佳性能。首先,雷達模塊應該朝向為絲印標識的方向進行安裝,這意味著在安裝時需要確保雷達的正面朝向正確。為了達到理想的探測效果,R60ABD1雷達模塊建議采用傾斜安裝的方式,傾斜角度應在30到45度之間。這種安裝方式有助于雷達的波束覆蓋到所需的探測區域,并且可以減少因環境因素引起的誤報。

在確定雷達的具體安裝位置時,建議將雷達安裝在床頭正上方大約1米的高度處,這樣可以確保雷達的主要波束能夠覆蓋到床的中心區域。這樣做是為了確保雷達可以有效地探測到床上人的呼吸和心跳活動,同時也能夠監測到人體的其他微動。安裝高度的選擇也是基于雷達波束覆蓋范圍的考慮,以確保人體存在檢測的最大距離為約2.5米,而人體呼吸頻率檢測的最大距離約為1.5米。

除了正確的安裝位置和角度外,還需要注意避免雷達前方出現明顯的金屬或電解質遮擋物。這是因為毫米波雷達的探測機制依賴于雷達波的反射,如果存在金屬或電解質遮擋物,則可能會影響雷達波的反射路徑,從而影響到雷達的探測準確性。因此,在安裝雷達時,應確保雷達前方沒有諸如金屬窗簾條、風扇、空調電機等潛在的干擾源。

在實際安裝過程中,還應當注意雷達模塊的安裝高度和角度會影響到其探測效果。為了使雷達的主波束能夠覆蓋到整個睡眠區域,雷達的安裝高度應該保持在與床面的高度差在0.9米左右,誤差不超過0.2米。同時,雷達模塊的安裝需要保證其前方沒有明顯的遮擋物,尤其是金屬材質的物體,因為這些物體可能會反射雷達波,造成干擾。

為了確保雷達能夠正常工作,安裝完成后還需注意雷達模塊的供電穩定性。雷達模塊對電源品質有一定的要求,需要無門限毛刺或紋波現象,并且需要有效屏蔽來自附近設備的電源噪聲。為了保證模塊內部VCO電路的正常工作,雷達模塊需要+5V到+6V的供電,且電壓紋波不能超過100mV。外部電源還需要提供足夠的電流輸出能力和瞬態響應能力,以防止由于電源不穩定導致的探測距離縮短或誤報率增加等問題。

1.7 微波雷達的完整功能概述(快速上手)

R60ABD1呼吸睡眠雷達模組是一款基于60GHz毫米波雷達技術設計的非接觸式生物感知設備,主要用于人體存在感知及運動感知。它能夠根據睡眠過程中身體運動幅度變化和呼吸心率變化,實時判斷目標的睡眠狀態、呼吸心跳頻率,并在睡眠結束后輸出睡眠評分。該模組的探測功能不受溫度、濕度、噪聲氣流、塵埃、光照和人體完全靜止等因素的影響,適合安裝在室內頂部使用。

模組具備多種功能,包括有人/無人狀態檢測、人體靜止/活躍狀態切換檢測、人體距離主動上報、體動幅度參數輸出、人體方位上報、心跳數值及波形輸出、呼吸數值及波形輸出、入床/離床狀態判斷、睡眠狀態(清醒/淺睡/深睡)識別、清醒/淺睡/深睡時長統計、睡眠質量評分、睡眠異常上報、異常掙扎上報、無人計時上報以及睡眠質量評級上報等。這些功能通過不同的數據點(DP)以特定的時間間隔或狀態變化時上報。

為了確保雷達的準確探測,模組的安裝需要遵循一定的規范。雷達應該安裝在床頭正上方1米的高度,向下傾斜30至45度,以確保主波束能夠覆蓋到睡眠區域。此外,雷達前方不應有明顯的金屬或電解質遮擋物,以免影響探測效果。在安裝過程中,還需確認雷達探測范圍內是否存在干擾源,如空調、風扇等,并盡可能移除這些干擾源。

模組的引腳包括電源輸入、地、串口接收與發送端、以及若干備用擴展引腳。其中,部分引腳可以根據用戶需求重新定義功能。為了便于用戶操作,在官方的文檔還介紹了如何準備必要的工具,如TTL串口工具、杜邦線、PC電腦、串口助手終端和Radar-EVB demo板,并給出了上電及工作的數據上報規則和睡眠模式檢測邏輯。

在官方的文檔最后提供了主要功能測試指引,包括睡眠質量狀態判斷測試、入離床狀態判斷測試、離床狀態判斷測試、呼吸頻率測試以及心跳頻率測試等。每項測試都有明確的操作步驟和判定標準,以幫助用戶驗證模組的功能是否正常。此外,官方的文檔還對體動幅度參數的輸出進行了詳細說明,并附帶了相關的測試表格格式,便于用戶記錄和分析測試結果。

二、微波雷達調試過程

2.1 接線說明

image-20240126145448206

2.2 安裝說明

image-20240126145600771

傾斜安裝: * 確保雷達探測準確性,建議安裝在床頭上方,以 45°斜向下安裝! R60ABD1-呼吸睡眠雷達傾斜安裝,傾斜角度為 30~45°,安裝在床頭上方,雷達安裝高度建議為高于床面 0.8-1m;保證雷達主波束覆蓋探測區域;雷達前面無明顯(金屬/電解質)遮擋物及覆蓋物。受雷達安裝高度及雷達波束范圍影響,在該安裝模式下,人體存在檢測最大距離 L3 ≈ 2.5 米;睡眠檢測最大距離 L2 ≈ 2.5 米;人體呼吸頻率檢測最大距離 L1 ≈ 1.5 米。

image-20240126145701021

image-20240126150859704

2.3 連接電腦調試

將60G毫米波雷達模塊與電腦連接,調試模塊是否正常可以運行,60G毫米波雷達模塊默認的波特率是115200

GND-----GND
VCC-----VCC
TX------RX
RX------TX

image-20240126211201418

image-20240126211215514

串口調試助手返回的數據:

image-20240126212034175

睡眠雷達上位機:

image-20240126212151180

image-20240126212338673

三、華為云服務器部署與上位機APP開發

這里直接看視頻,可以了解的更加清楚。

(1)華為云物聯網開發(一)設備上云: [https://www.bilibili.com/video/BV1Md4y1v7m5]

(2)華為云物聯網云平臺對應的上位機開發步驟: [https://www.bilibili.com/video/BV1mr421c75S]

四、STM32代碼開發(微波雷達模塊數據處理)

4.1 微波雷達數據處理(頭文件)

#ifndef _DATAHANDLE_H
#define _DATAHANDLE_H
?
#include "stdint.h"
?
/* 定義包頭及指令信息 */
//幀頭
#define HEADER1 0x53
#define HEADER2 0x59
//控制字
#define CMD_TICK 0x01               //心跳包
#define CMD_PRODUCT_INFO 0x02       //產品信息
#define CMD_OTA 0x03                // OTA升級
#define CMD_WORK_STATE 0x05         //工作狀態
#define CMD_RADAR_DETECT_RANGE 0x07 //雷達探測范圍
#define CMD_BODY_EXIST_DETECT 0x80  //人體存在檢測
#define CMD_BREATH_DETECT 0x81      //呼吸檢測
#define CMD_SLEEP_DETECT 0x84       //睡眠檢測
#define CMD_HEART_DETECT 0x85       //心率檢測
//幀尾
#define END1 0x54
#define END2 0x43
?
/* 枚舉讀取數據報文的狀態 */
typedef enum
{
    IDLE,
    SEEN_HEADER1,
    SEEN_HEADER2,
    SEEN_CONTROL,
    SEEN_COMMAND,
    SEEN_LENGTH,
    SEEN_DATA,
    SEEN_SUM,
    SEEN_END1,
    SEEN_END2
} rx_datagram_state_t;
?
/* 枚舉控制模式 */
typedef enum
{
    MODE_IDLE,
    MODE_SEND_TICK,
    MODE_SEND_PRODUCT_INFO,
    MODE_SEND_OTA,
    MODE_SEND_WORK_STATE,
    MODE_SEND_RADAR_DETECT_RANGE,
    MODE_SEND_BODY_EXIST_DETECT,
    MODE_SEND_BREATH_DETECT,
    MODE_SEND_SLEEP_DETECT,
    MODE_SEND_HEART_DETECT
} control_mode_t;
?
/*******************************************************************************/
//人體存在功能
typedef struct
{
    uint8_t body_exist_flag;   //有人無人檢測標志
    uint8_t work_state;        //運動狀態
    uint8_t body_move_param;   //體動參數
    uint16_t body_distance;    //人體距離
    uint8_t body_direction[3]; //人體方位
} body_exist_detect_t;
?
//呼吸檢測功能
typedef struct
{
    uint8_t breath_detect_switch; //開關呼吸功能
    uint8_t breath_detect_state;  //呼吸檢測狀態
    uint8_t breath_detect_value;  //呼吸檢測值
    uint8_t breath_wave_data[5];  //呼吸波形
} breath_detect_t;
?
//睡眠評分
typedef struct
{
    uint8_t sleep_detail_exist; //睡眠詳細狀態
    uint8_t sleep_detail_state; //睡眠詳細評分
?
    uint8_t sleep_detail_score;            //睡眠評分
    uint16_t sleep_detail_time;            //睡眠時間
    uint8_t sleep_detail_awake;            //清醒時長占比
    uint8_t sleep_detail_light;            //淺睡時長占比
    uint8_t sleep_detail_deep;             //深睡時長占比
    uint8_t sleep_detail_away;             //離床時長占比
    uint8_t sleep_detail_away_times;       //離床次數
    uint8_t sleep_detail_turn_over_times;  //翻身次數
    uint8_t sleep_detail_avg_breath;       //平均呼吸
    uint8_t sleep_detail_avg_heart;        //平均心率
    uint8_t sleep_detail_breath_stoptimes; //呼吸停頓次數
    uint8_t sleep_detail_turn_over_L;      //大動作次數
    uint8_t sleep_detail_turn_over_S;      //小動作次數
} sleep_detail_t;
?
//睡眠檢測功能
typedef struct
{
    uint8_t sleep_detect_switch; //開關睡眠功能
    uint8_t sleep_bed_state;     //入床/離床狀態
    uint8_t sleep_detect_state;  //睡眠檢測狀態
?
    uint8_t sleep_wake_hour;  //清醒時間
    uint8_t sleep_light_hour; //淺睡時長
    uint8_t sleep_deep_hour;  //深睡時長
?
    uint8_t sleep_score;                 //睡眠質量評分
    sleep_detail_t sleep_score_detail;   //睡眠質量評分詳情
    sleep_detail_t sleep_score_detail_1; //睡眠質量評分詳情1
    uint8_t sleep_score_detail_err;      //睡眠質量評分詳情2
} sleep_detect_t;
?
//心率檢測功能
typedef struct
{
    uint8_t heart_detect_switch; //開關心率功能
    uint8_t heart_detect_value;  //心率檢測值
    uint8_t heart_wave_data[5];  //心率波形
} heart_detect_t;
?
//數據變化標志
typedef struct
{
    unsigned data_change_body_exist : 1;
    unsigned data_change_breath : 1;
    unsigned data_change_sleep : 1;
    unsigned data_change_heart : 1;
} data_change_t;
?
void ProcessRx(uint8_t *buff,uint8_t size);
// void ProcessRx(void);
?
?
extern body_exist_detect_t body_exist_detect;
extern breath_detect_t breath_detect;
extern sleep_detect_t sleep_detect;
extern heart_detect_t heart_detect;
?
#endif
?

4.2 微波雷達數據處理(源文件)

#include "datahandle.h"
#include "debug.h"
body_exist_detect_t body_exist_detect = {0};
breath_detect_t breath_detect = {0};
sleep_detect_t sleep_detect = {0};
heart_detect_t heart_detect = {0};
data_change_t data_change = {0};
?
/* 定義數據包接收狀態的變量,并初始化為空閑狀態 */
rx_datagram_state_t rx_datagram_state = IDLE;
control_mode_t control_mode = MODE_IDLE;
?
/* 協議數據處理函數 */
void ProcessRx(uint8_t *buff, uint8_t size)
{
    /****************************************************************************/
    uint8_t receivedbyte, rx_sum, command;
    //數據存儲數組
    uint8_t rx_data[10];
?
    uint16_t rx_dategram_len;
    while (size)
    {
        switch (rx_datagram_state)
        {
        case IDLE: //在空閑時,判斷是否讀取幀頭1
        {
            receivedbyte = *buff;
            if (HEADER1 == receivedbyte)
            {
                // printf("HEADER1:%xn", *buff);
                rx_sum = 0;
                rx_sum += receivedbyte;
                rx_datagram_state = SEEN_HEADER1;
                buff++;
            }
            break;
        }
        case SEEN_HEADER1: //讀取第一幀之后,判斷是否讀取幀頭2
        {
            receivedbyte = *buff;
            if (HEADER2 == receivedbyte)
            {
                // printf("HEADER2:%xn", *buff);
                rx_sum += receivedbyte;
                rx_datagram_state = SEEN_HEADER2;
                buff++;
            }
            break;
        }
?
        case SEEN_HEADER2: //讀取第二幀后,根據控制字判斷數據模式
        {
            uint8_t ctrl_mode = *buff; //控制字
            rx_sum += ctrl_mode;
?
            if (ctrl_mode == CMD_TICK)
                control_mode = MODE_SEND_TICK;
            else if (ctrl_mode == CMD_PRODUCT_INFO)
                control_mode = MODE_SEND_PRODUCT_INFO;
            else if (ctrl_mode == CMD_OTA)
                control_mode = MODE_SEND_OTA;
            else if (ctrl_mode == CMD_WORK_STATE)
                control_mode = MODE_SEND_WORK_STATE;
            else if (ctrl_mode == CMD_RADAR_DETECT_RANGE)
                control_mode = MODE_SEND_RADAR_DETECT_RANGE;
            else if (ctrl_mode == CMD_BODY_EXIST_DETECT)
                control_mode = MODE_SEND_BODY_EXIST_DETECT;
            else if (ctrl_mode == CMD_BREATH_DETECT)
                control_mode = MODE_SEND_BREATH_DETECT;
            else if (ctrl_mode == CMD_SLEEP_DETECT)
                control_mode = MODE_SEND_SLEEP_DETECT;
            else if (ctrl_mode == CMD_HEART_DETECT)
                control_mode = MODE_SEND_HEART_DETECT;
            else
                control_mode = MODE_IDLE;
?
            rx_datagram_state = SEEN_CONTROL;
            // printf("SEEN_CONTROL:%xn", ctrl_mode);
            buff++;
        }
        break;
?
        case SEEN_CONTROL: //讀取控制字后,判斷命令字
        {
            command = *buff; //命令字
            rx_sum += command;
            rx_datagram_state = SEEN_COMMAND;
            // printf("SEEN_COMMAND:%xn", command);
            buff++;
        }
        break;
?
        case SEEN_COMMAND: //讀取命令字后,識別數據長度
        {
            uint8_t len_temp[2];
            len_temp[0] = *buff;
            rx_sum += len_temp[0];
?
            buff++;
            len_temp[1] = *buff;
            rx_sum += len_temp[1];
?
            rx_dategram_len = (len_temp[0] < < 8) | len_temp[1];
            rx_datagram_state = SEEN_LENGTH;
            // printf("SEEN_LENGTH:%xn", rx_dategram_len);
            buff++;
        }
        break;
?
        case SEEN_LENGTH: //讀取數據長度后,保存數據
        {
            if (size < (int)rx_dategram_len) //判斷數據包是否完整
            {
                rx_datagram_state = IDLE;
                return;
            }
            uint8_t readlen = rx_dategram_len; //數據包長度
            uint8_t tmp[rx_dategram_len];      //數據包緩存
            uint8_t *ptmp = tmp;               //數據包緩存指針
            while (readlen--)
            {
                receivedbyte = *buff;
                *ptmp++ = receivedbyte; //將數據存入緩存
                rx_sum += receivedbyte; //校驗和
            }
            // TODO 使用上面操作,可以直接操作rx_data指針,不用拷貝數據到rx_data數組中
            for (uint8_t i = 0; i < rx_dategram_len; i++) //將數據存儲到數組中
            {
                rx_data[i] = tmp[i];
            }
?
            rx_datagram_state = SEEN_DATA;
            buff++;
        }
        break;
?
        case SEEN_DATA: //讀取數據后,判斷校驗和,根據數據、控制字、命令字讀取狀態
        {
            uint8_t getsum = *buff;
?
            //判斷校驗和是否正確
            if (getsum != rx_sum)
            {
                rx_datagram_state = IDLE;
                return;
            }
            else
            {
                //判斷控制字模式
                switch (control_mode)
                {
                case MODE_SEND_TICK: //心跳包
                {
                    printf("MODE_SEND_TICKn");
                }
                break;
?
                case MODE_SEND_PRODUCT_INFO: //產品信息
                {
                    printf("MODE_SEND_PRODUCT_INFOn");
                }
                break;
?
                case MODE_SEND_OTA: // OTA升級
                {
                    printf("MODE_SEND_OTAn");
                }
                break;
?
                case MODE_SEND_WORK_STATE: //工作狀態
                {
                    printf("MODE_SEND_WORK_STATEn");
                }
                break;
?
                case MODE_SEND_RADAR_DETECT_RANGE: //雷達檢測范圍
                {
                    printf("MODE_SEND_RADAR_DETECT_RANGEn");
                }
                break;
?
                case MODE_SEND_BODY_EXIST_DETECT: //人體存在檢測
                {
                    data_change.data_change_body_exist = 1;
                    switch (command)
                    {
                    case 1:
                    { //檢測人體存在
                        body_exist_detect.body_exist_flag = (0 != rx_data[0]) ? 1 : 0;
                        printf("Body Exist flag State:%dn", body_exist_detect.body_exist_flag);
                    }
                    break;
?
                    case 2:
                    { //運動狀態
                        body_exist_detect.work_state = rx_data[0];
                        printf("Move State:%dn", body_exist_detect.work_state);
                    }
                    break;
?
                    case 3:
                    { //運動值
                        body_exist_detect.body_move_param = rx_data[0];
                        printf("Body Move Value:%dn", body_exist_detect.body_move_param);
                    }
                    break;
?
                    case 4:
                    { //人體距離
                        body_exist_detect.body_distance = (rx_data[0] < < 8) | rx_data[1];
                        printf("Body Distance:%dn", body_exist_detect.body_distance);
                    }
                    break;
?
                    case 5:
                    { //人體方位
                        body_exist_detect.body_direction[0] = (rx_data[0] < < 8) | rx_data[1];
                        body_exist_detect.body_direction[1] = (rx_data[2] < < 8) | rx_data[3];
                        body_exist_detect.body_direction[2] = (rx_data[4] < < 8) | rx_data[5];
                    }
                    break;
                    }
                }
                break;
?
                case MODE_SEND_BREATH_DETECT: //呼吸檢測
                {
                    data_change.data_change_breath = 1;
                    switch (command)
                    {
                    case 1:
                    {
                        //呼吸檢測狀態
                        breath_detect.breath_detect_state = rx_data[0];
                        printf("Breath State:%dn", breath_detect.breath_detect_state);
                    }
                    break;
?
                    case 2:
                    {
                        //呼吸值
                        breath_detect.breath_detect_value = rx_data[0];
                        printf("Breath Value:%dn", breath_detect.breath_detect_value);
                    }
                    }
                }
                break;
?
                case MODE_SEND_SLEEP_DETECT: //睡眠檢測
                {
                    data_change.data_change_sleep = 1;
                    //判斷命令字
                    switch (command)
                    {
                    case 1:
                    { //入床/離床狀態
                        sleep_detect.sleep_bed_state = rx_data[0];
                        printf("Sleep1 State:%dn", sleep_detect.sleep_bed_state);
                    }
                    break;
?
                    case 2:
                    { //睡眠狀態
                        sleep_detect.sleep_detect_state = rx_data[0];
                        printf("Sleep State:%dn", sleep_detect.sleep_detect_state);
                    }
                    break;
?
                    case 3:
                    { //清醒時長
                        sleep_detect.sleep_wake_hour = (rx_data[0] < < 8) | rx_data[1];
                        printf("Sleep Wake Hours:%dn", sleep_detect.sleep_wake_hour);
                    }
                    break;
?
                    case 4:
                    { //淺睡時長
                        sleep_detect.sleep_light_hour = (rx_data[0] < < 8) | rx_data[1];
                        printf("Sleep Light Hours:%dn", sleep_detect.sleep_light_hour);
                    }
                    break;
?
                    case 5:
                    { //深睡時長
                        sleep_detect.sleep_deep_hour = (rx_data[0] < < 8) | rx_data[1];
                        printf("Sleep Deep Hours:%dn", sleep_detect.sleep_deep_hour);
                    }
                    break;
?
                    case 0x06:
                    { //睡眠質量評分
                        sleep_detect.sleep_score = rx_data[0];
                        printf("Sleep Score:%dn", sleep_detect.sleep_score);
                    }
                    break;
?
                    case 0x0c:
                    { //睡眠檢測結果
                        sleep_detect.sleep_score_detail.sleep_detail_exist = rx_data[0];
                        sleep_detect.sleep_score_detail.sleep_detail_state = rx_data[1];
                        sleep_detect.sleep_score_detail.sleep_detail_avg_breath = rx_data[2];
                        sleep_detect.sleep_score_detail.sleep_detail_avg_heart = rx_data[3];
                        sleep_detect.sleep_score_detail.sleep_detail_turn_over_times = rx_data[4];
                        sleep_detect.sleep_score_detail.sleep_detail_turn_over_L = rx_data[5];
                        sleep_detect.sleep_score_detail.sleep_detail_turn_over_S = rx_data[6];
                        sleep_detect.sleep_score_detail.sleep_detail_breath_stoptimes = rx_data[7];
                    }
                    break;
?
                    case 0x0d:
                    { //睡眠詳情
                        sleep_detect.sleep_score_detail_1.sleep_detail_score = rx_data[0];
                        sleep_detect.sleep_score_detail_1.sleep_detail_time = (rx_data[1] < < 8) | rx_data[2];
                        sleep_detect.sleep_score_detail_1.sleep_detail_awake = rx_data[3];
                        sleep_detect.sleep_score_detail_1.sleep_detail_light = rx_data[4];
                        sleep_detect.sleep_score_detail_1.sleep_detail_away = rx_data[5];
                        sleep_detect.sleep_score_detail_1.sleep_detail_away_times = rx_data[6];
                        sleep_detect.sleep_score_detail_1.sleep_detail_avg_breath = rx_data[7];
                        sleep_detect.sleep_score_detail_1.sleep_detail_avg_heart = rx_data[8];
                        sleep_detect.sleep_score_detail_1.sleep_detail_breath_stoptimes = rx_data[9];
                    }
                    break;
?
                    case 0x0e:
                    { //異常檢測
                        sleep_detect.sleep_score_detail_err = rx_data[0];
                    }
                    break;
                    }
                }
                break;
?
                case MODE_SEND_HEART_DETECT: //心率檢測
                {
                    data_change.data_change_heart = 1;
                    switch (command)
                    {
                    case 0:
                    { //開關心率檢測
                    }
                    break;
?
                    case 2:
                    { //心率值
                        heart_detect.heart_detect_value = rx_data[0];
                        printf("Heart rate Value:%dn", heart_detect.heart_detect_value);
                    }
                    break;
?
                    case 5:
                    { //心率波形
                        heart_detect.heart_wave_data[0] = rx_data[0];
                        heart_detect.heart_wave_data[1] = rx_data[1];
                        heart_detect.heart_wave_data[2] = rx_data[2];
                        heart_detect.heart_wave_data[3] = rx_data[3];
                        heart_detect.heart_wave_data[4] = rx_data[4];
                    }
                    break;
                    }
                }
                break;
?
                case MODE_IDLE: //空閑
                {
                }
                break;
                }
            }
            rx_datagram_state = SEEN_SUM;
            buff++;
        }
        break;
?
        case SEEN_SUM: //讀取校驗后,判斷幀尾1
        {
            rx_datagram_state = (END1 == *buff) ? SEEN_END1 : IDLE;
        }
        break;
?
        case SEEN_END1: //讀取幀尾1后,判斷幀尾2
        {
            rx_datagram_state = (END2 == *buff) ? SEEN_END2 : IDLE;
        }
        break;
?
        case SEEN_END2: //判斷幀尾2后,設置接收完成標志
        {
            //    rx_flag = 1;
            rx_datagram_state = IDLE;
        }
        break;
?
?
        default:
        {
            receivedbyte = 0;
            rx_datagram_state = IDLE;
            size = 0;
            break;
        }
        }
        size--;
    }
}

五、總結

本項目開發一種非接觸式的睡眠監控系統,該系統利用先進的60GHz毫米波雷達技術和STM32微控制器,實現了對人體在睡眠過程中的存在感知、運動感知以及生理指標如呼吸頻率、心率的實時監測。系統能夠自動評估睡眠質量,并在用戶睡眠周期結束時提供睡眠評分。為了確保用戶能夠在任何地點了解自己的睡眠狀況,系統集成了Wi-Fi模塊,可以將收集到的數據上傳至華為云物聯網平臺,并通過專門設計的移動應用程序供用戶遠程訪問。此外,系統還具備超閾值報警功能,當檢測到異常的生理指標時會發出警報提醒。本地1.44寸TFT LCD顯示屏用于實時顯示監測到的信息,包括生理指標和環境數據。為了全面監測用戶的健康狀況,系統還加入了MLX90614紅外體溫傳感器來檢測人體體溫。通過集成多種傳感器和技術,該項目為健康管理和智能家居應用提供了有力支持。

審核編輯 黃宇

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

    關注

    0

    文章

    77

    瀏覽量

    14298
  • 監控系統
    +關注

    關注

    21

    文章

    3940

    瀏覽量

    176825
  • STM32
    +關注

    關注

    2272

    文章

    10923

    瀏覽量

    357544
  • 微波雷達
    +關注

    關注

    4

    文章

    89

    瀏覽量

    21828
收藏 人收藏

    評論

    相關推薦

    請問LMT87屬于接觸溫度傳感器還是非接觸溫度傳感器?

    你好,我正在設計一款激光切割機上的監控設備,需要用到一個溫度傳感器。因為之前了解過LMT系列,但是不清楚它能否用在接觸的環境里,所以想咨詢一下。 工作環境大致這樣:激光穿過鏡片切
    發表于 01-01 08:18

    移動自動雷達波測流系統的工作原理及使用

    移動自動雷達波測流系統具有測量精度高、速度快、可全天候工作、接觸測量、易于安裝和維護等優點
    的頭像 發表于 11-08 16:16 ?297次閱讀
    移動<b class='flag-5'>式</b>自動<b class='flag-5'>雷達</b>波測流<b class='flag-5'>系統</b>的工作原理及使用

    定華雷達儀表學堂:雷達液位計在導波管中的測量

    在實際工況中,雷達液位計是非接觸的測量,一般來說,接觸的測量還是有不少優勢的,但是在一些特殊的工況中,
    的頭像 發表于 09-07 10:38 ?288次閱讀

    接觸測量傳感器有哪些特點

    接觸測量傳感器是一種利用電磁波、聲波、光學等接觸方式進行測量的傳感器。它具有以下特點: 高精度:
    的頭像 發表于 08-19 10:07 ?851次閱讀

    接觸溫度傳感器的優缺點有哪些

    接觸溫度傳感器,顧名思義,是一種無需與被測物體直接接觸即可測量溫度的傳感器。這種傳感器在工業、醫療、科研等領域有著廣泛的應用。本文將詳細介紹
    的頭像 發表于 06-19 14:37 ?1231次閱讀

    接觸溫度傳感器的定義、工作原理、類型、特點、應用和發展趨勢

    接觸溫度傳感器是一種無需與被測物體接觸即可測量溫度的傳感器。它具有測量速度快、精度高、使用方便、安全可靠等特點,廣泛應用于工業、醫療、科研等領域。本文將詳細介紹
    的頭像 發表于 06-19 14:34 ?3735次閱讀

    接觸溫度傳感器的特點是什么

    接觸溫度傳感器是一種無需與被測物體直接接觸即可測量溫度的傳感器。它具有許多優點,如測量速度快、精度高、不受環境影響等。以下是對
    的頭像 發表于 06-19 14:29 ?706次閱讀

    接觸溫度傳感器有哪些

    接觸溫度傳感器是一種無需接觸被測物體即可測量其溫度的傳感器。它們廣泛應用于工業、醫療、科研等領域。本文將詳細介紹
    的頭像 發表于 06-19 14:26 ?1700次閱讀

    接觸接觸測量相關性的方法

    接觸測量和接觸測量是兩種常見的測量方法,它們在工業生產、科學研究和日常生活中都有廣泛的應用。本文將詳細介紹這兩種測量方法的基本原理、特
    的頭像 發表于 06-14 09:24 ?1936次閱讀

    接觸位移傳感器有哪些類型

    接觸位移傳感器是一種無需與被測物體直接接觸即可測量其位移的傳感器。它們廣泛應用于工業自動化、機器人技術、精密測量等領域。本文將詳細介紹
    的頭像 發表于 06-14 09:22 ?2957次閱讀

    接觸液位傳感器的工作原理

    液位傳感器,作為工業自動化和過程控制中的重要組成部分,廣泛應用于各種液體測量和控制系統中。根據其工作原理和應用場景的不同,液位傳感器可以分為多種類型。其中,接觸液位傳感器以其獨特的
    的頭像 發表于 05-24 17:08 ?3145次閱讀

    ST60A3 USB2.0接觸連接套件與ST60A3 UART接觸連接套件有什么區別?

    ST60A3 USB2.0接觸連接套件與ST60A3 UART接觸連接套件有什么區別?做
    發表于 05-23 07:52

    生命體征監測雷達模組

    SW-UWB-M-A2X2 是一款工作于 UWB 頻段的超寬帶人體監測雷達模組,可以在設定區域內以極高的靈敏度接觸感應人體的存在,測量人體的呼吸和心率,長時間監測后可以生成
    發表于 03-06 09:51

    智能家居接觸技術已成為趨勢

    電子發燒友網報道(文/黃山明)當前,接觸技術已經成為智能家居中越來越普及和重要的技術手段。這一技術通過無線信號、電磁波感應、雷達探測等多種方式實現設備與用戶之間的交互或數據傳輸,不
    的頭像 發表于 03-04 07:48 ?3774次閱讀

    微波雷達液位計介紹與安裝

    RY-W-LDSWJ毫米波雷達是專門針對水位測距設計的,該模塊采用FMCW模式,接觸安裝設計,體積小巧,結構緊湊。精度高,功耗低,抗干擾能力強,適用于湖泊河流、山洪預警、蓄水池、污
    的頭像 發表于 02-29 21:08 ?446次閱讀
    <b class='flag-5'>微波</b><b class='flag-5'>雷達</b>液位計介紹與安裝
    成人百家乐官网的玩法技巧和规则 | 网上百家乐官网真实吗| 至尊百家乐官网年代| 黄金城百家乐官网手机用户| 百家乐牌路图表下| 广州百家乐赌场| 至尊百家乐停播| 大发888心水论坛| 百家乐官网三路秘诀| 百家乐如何写路| 大发888娱乐场备用| 博彩排名| 百家乐官网真人游戏攻略| 百家乐官网园百乐彩| 电子百家乐规则| 百家乐官网赌术揭秘| 百家乐官网园sun811| 百家乐赌博是否违法| 百家乐那个娱乐城信誉好| 太阳城网站| 波音百家乐官网现金网投注平台排名导航| 百家乐官网tt娱乐网| 百家乐怎么样玩| bet365最新地址| 百家乐官网娱乐网佣金| 百家乐赌的是心态吗| 甘泉县| 属狗与属猪能做生意吗| 大发888洗码| 作弊百家乐官网赌具| 无锡百家乐的玩法技巧和规则 | 百家乐官网庄89| 百家乐策略详解| 二八杠下载| 百家乐官网览| 新葡京百家乐官网现金| 百家乐趋势图怎么看| 大发888游乐城| 利澳百家乐官网娱乐城| 大发888娱乐场下载 df888ylc3403| 百家乐官网精神|