文章目錄
- 一、前言
- 1.1 項目介紹
- 【1】項目開發背景
- 【2】設計實現的功能
- 【3】項目硬件模塊組成
- 【4】設計意義
- 【5】市面上同類產品研究現狀
- 【6】摘要
- 1.2 設計思路
- 1.3 系統功能總結
- 1.4 開發工具的選擇
- 【1】設備端開發
- 【2】上位機開發
- 1.5 模塊的技術詳情介紹
- 1.6 框架圖
- 框架圖說明:
- 二、代碼設計思路
- 1. **溫度傳感器 (DHT11)**
- 2. **人體檢測傳感器 (海凌科24G毫米波雷達模塊 LD2402)**
- 3. **蜂鳴器 (高電平觸發)**
- 4. **GSM模塊 (Air780e)**
- 5. **按鍵模塊**
- 6. **電源管理 (12V直流電源模塊)**
- 7. **主控制流程**
- 8. **液晶顯示 (OLED 顯示屏)**
- 三、短信發送
- 1. **air780e.h**
- 2. **air780e.c**
- 說明:
- 四、STM32主代碼
一、前言
1.1 項目介紹
【1】項目開發背景
隨著社會經濟的不斷發展和人們生活水平的提高,汽車已經成為許多家庭日常出行的重要交通工具。尤其是對于有小孩的家庭,家長們往往會在駕駛過程中把兒童留在車內,尤其是在高溫天氣下,車內溫度迅速上升可能會對兒童的身體健康構成嚴重威脅。由于兒童的身體調節能力較差,長時間暴露在車內高溫環境下可能引發中暑、脫水等危險,甚至會造成生命威脅。因此,設計一個針對汽車兒童安全的預警系統顯得尤為重要。
傳統的安全措施主要依賴家長的記憶與判斷,但是隨著日常生活節奏的加快,家長可能會忘記車內的兒童,或者誤判車內環境。針對這一問題,基于單片機的汽車兒童安全預警系統應運而生。該系統結合溫度傳感器和人體檢測傳感器,能夠實時監測車內的溫度,并判斷車內是否有兒童存在。一旦車內溫度超過設定閾值,并且傳感器檢測到有兒童在車內時,系統將通過蜂鳴器報警并通過GSM模塊發送短信提醒車主,確保家長及時注意到孩子的安全問題。
該項目不僅僅關注技術實現,還將考慮到人機交互的易用性,用戶能夠根據實際需求調整溫度閾值,同時可以手動關閉報警系統。此外,系統還設置了短信發送的間隔時間,避免了重復報警的情況,保證了系統的穩定性和可靠性。整體來看,該系統的開發旨在通過智能化手段提高兒童在車內的安全性,減少因疏忽造成的安全事故,充分體現了現代智能硬件技術在提升生活質量中的重要作用。
測試模型
【2】設計實現的功能
- 實時監控車內溫度,并判斷是否超過設定的高溫閾值。
- 人體檢測傳感器檢測車內是否有兒童,并與溫度數據結合判斷是否觸發報警。
- 系統當檢測到高溫且有兒童時,通過蜂鳴器報警。
- 系統通過GSM模塊向車主發送警報短信,提醒車主車內有兒童且溫度過高。
- 用戶可以通過系統設置溫度閾值,以自定義報警條件。
- 用戶可以手動關閉報警,并確保在非報警狀態下,系統不會繼續觸發。
- 系統設置間隔時間,避免GSM模塊持續發送短信,防止頻繁報警。
【3】項目硬件模塊組成
- STM32單片機 (STM32F103RCT6):負責整個系統的控制與邏輯判斷。
- 溫度傳感器 (DHT11):實時檢測車內溫度,并與設定的閾值進行比較。
- 人體檢測傳感器 (海凌科的24G毫米波雷達模塊 LD2402):檢測車內是否有兒童存在。
- 蜂鳴器 (高電平觸發):報警裝置,用于溫度過高且有兒童時發出聲音提示。
- GSM模塊 (Air780e):負責發送短信報警至車主手機。
- 按鍵模塊:用于手動關閉報警。
- 電源模塊 (12V直流電源):為系統提供穩定電源。
- 液晶顯示屏 (0.96寸OLED):用于顯示當前溫度與報警狀態,提供人機交互界面。
【4】設計意義
本項目的設計意義在于提高汽車安全性,特別是對于有兒童的家庭。在高溫天氣條件下,將兒童遺忘在車內可能會導致嚴重的安全事故,甚至危及生命。車內溫度迅速上升,兒童在車內的耐受能力較差,可能引發中暑、脫水等危險。設計一個針對這一問題的預警系統,可以有效減少此類安全隱患,確保兒童在車內的安全。
傳統的汽車安全預警系統主要集中在車主駕駛過程中可能發生的事故預警,而忽視了車內兒童的安全問題。通過引入溫度傳感器和人體檢測傳感器的組合,能夠實時監控車內溫度并判斷是否有兒童存在,極大提升了系統的智能化和準確性。該系統在實際應用中,不僅可以減少家長因疏忽造成的安全事故,還能在溫度過高時及時發出警報,提醒家長采取措施,避免危險發生。
此外,該系統通過GSM模塊發送短信報警,確保家長即便不在車旁也能夠及時收到提醒。這種遠程提醒功能進一步提升了系統的實用性和安全性。用戶還可以根據需求設置溫度閾值和手動關閉報警,使系統更加靈活和適應不同場景。總的來說,項目的設計意義不僅在于解決現實生活中的安全隱患,還能提升社會對兒童安全問題的重視,推動智能硬件技術在日常生活中的廣泛應用。
【5】市面上同類產品研究現狀
- Safety 1st Car Seat Alarm(美國)
- 功能方案:通過壓力傳感器(安裝在座椅下方)檢測兒童重量,配合藍牙連接手機APP。若家長離開車輛超出安全距離(>10米),APP觸發警報。
- 局限性:依賴手機藍牙信號,無溫度監測功能,需額外手動關閉報警。
- 市場反饋:亞馬遜評分4.1/5(售價$29.99),用戶抱怨誤報率高(如放置重物觸發)。
- Cybex Sirona S i-Size安全座椅 + SensorSafe技術
- 功能方案:集成在安全座椅卡扣中的傳感器,通過藍牙連接車載系統。若兒童被遺忘且車輛熄火,車內喇叭鳴響,并通過手機APP推送通知。
- 創新點:無需額外設備,直接整合至座椅結構。
- 痛點:僅檢測卡扣狀態,無法識別高溫風險(需用戶選配溫度模塊,額外$45)。
- Volvo汽車原廠系統(歐盟標配)
- 功能方案:通過車內毫米波雷達(60GHz頻段)探測生命體征(呼吸動作),結合空調溫控數據。若檢測到活體且溫度>35°C,自動鳴笛+閃燈,并通過Volvo On Call服務推送短信至車主。
- 優勢:原廠深度集成,誤報率<1%。
- 局限:僅支持2020年后新款車型,無法后裝加配。
- Munchkin Brica Baby Alert(便攜式方案)
- 功能方案:后裝懸掛式設備,結合超聲波傳感器(檢測兒童移動)和溫度探頭(-10°C~60°C)。觸發報警后通過內置SIM卡發送短信至3個預設號碼。
- 缺陷:需年付$60服務費(SIM卡流量),高溫報警閾值固定(38°C不可調)。
- 國內電商方案(淘寶/京東常見款)
- 典型配置:
- 主控:ESP8266(低成本WiFi方案)
- 傳感器:熱釋電紅外(PIR) + DS18B20溫度探頭
- 報警方式:本地蜂鳴器 + 微信小程序推送
- 問題:
- PIR傳感器易受陽光干擾(夏季誤報率>30%)
- 無主動關閉功能,依賴斷電重啟
- 網絡依賴性強(地下車庫失效)
- 典型配置:
【6】摘要
隨著汽車的普及,兒童在車內的安全問題逐漸成為社會關注的焦點。高溫天氣下,兒童長時間被遺忘在車內,車內溫度迅速上升可能導致中暑、脫水等危險,嚴重時甚至威脅生命。為了解決這一問題,本項目設計了一種基于單片機的汽車兒童安全預警系統。該系統通過溫度傳感器實時監測車內溫度,通過人體檢測傳感器判斷車內是否有兒童。一旦車內溫度超過設定的閾值且有兒童存在,系統將觸發蜂鳴器報警并通過GSM模塊向車主發送短信提醒。用戶可以根據需求設置溫度閾值,并具有手動關閉報警的功能。此外,系統通過設置短信發送間隔,避免了頻繁報警的情況。該項目的實現有效提高了兒童在車內的安全性,減少了因家長疏忽導致的危險事故,具有重要的社會意義和應用價值。
關鍵字
汽車安全、兒童預警系統、溫度傳感器、人體檢測傳感器、GSM模塊、蜂鳴器、實時監測、安全報警
1.2 設計思路
本項目的設計思路主要圍繞著通過傳感器的實時數據監控,結合預警機制來確保兒童在車內的安全。首先,系統通過溫度傳感器實時監測車內溫度。當車內溫度超過設定的高溫閾值時,系統會觸發預警機制,保障車內人員的安全。為了避免誤報和錯誤判斷,系統還引入了人體檢測傳感器,這使得系統能夠判斷車內是否有兒童存在,避免在沒有兒童的情況下誤觸發報警。
當車內的溫度達到設定閾值且檢測到有兒童時,系統會通過蜂鳴器發出警報提示車主,提醒其注意車內情況。此外,為了加強遠程警示功能,系統通過GSM模塊向車主發送短信,及時告知車主車內的危險狀況。為了防止短信過于頻繁,系統設計了短信發送間隔,使得GSM模塊只在需要時才發送短信,而不會重復報警。
為了提高系統的靈活性和適應性,用戶可以根據實際需要調整溫度閾值,并在必要時手動關閉報警系統。此外,系統具備溫度顯示功能,通過液晶顯示屏實時反饋當前車內的溫度信息,使得用戶能夠方便地查看和設置溫度閾值。總體設計思路注重系統的智能化、人性化,并確保能夠在車主不在車旁時及時提供安全預警,減少因疏忽造成的安全隱患。
1.3 系統功能總結
功能模塊 | 描述 |
---|---|
溫度監測 | 通過溫度傳感器實時監測車內溫度,并與設定的高溫閾值進行比較。 |
人體檢測 | 通過人體檢測傳感器判斷車內是否有兒童存在,以避免誤報。 |
報警觸發 | 當車內溫度超過設定閾值且檢測到兒童時,系統通過蜂鳴器發出聲音報警。 |
短信報警 | 通過GSM模塊向車主發送短信,提醒車主車內有兒童且溫度過高。 |
溫度閾值設置 | 允許用戶設置溫度閾值,自定義觸發報警的條件。 |
報警關閉功能 | 用戶可手動關閉報警,確保在非報警狀態下系統不會繼續觸發。 |
短信發送間隔設置 | 設置短信發送的間隔時間,避免GSM模塊頻繁發送短信,減少重復報警。 |
溫度顯示 | 使用液晶顯示屏顯示車內的實時溫度與報警狀態,提供用戶友好的界面。 |
1.4 開發工具的選擇
【1】設備端開發
硬件設備端的開發主要依賴于C語言,利用該語言直接操作硬件寄存器,確保系統運行的高效性和低延遲。C語言在嵌入式開發中具有廣泛的應用,它能夠直接訪問硬件,滿足對資源消耗和響應速度的嚴格要求。為了編寫高效、穩定的代碼,開發工具選擇了Keil uVision 5作為主要的開發環境。Keil是一個專業的嵌入式開發工具,廣泛應用于基于ARM架構的微控制器(如STM32)開發。Keil提供了完善的調試、編譯和仿真支持,能夠幫助在軟件開發過程中高效地進行調試、單步執行以及斷點設置,確保開發的穩定性和高效性。
STM32F103RCT6是項目中使用的主控芯片,它基于ARM Cortex-M3架構,擁有強大的計算能力和豐富的外設接口。在硬件編程中,寄存器級編程是常用的方式,這要求開發者對芯片的硬件寄存器有深入的理解。在Keil環境中,通過STM32的寄存器直接控制GPIO、ADC、I2C、SPI等硬件接口,以滿足各個硬件模塊(如傳感器、執行器、顯示屏等)與主控芯片的交互。使用寄存器編程能夠提供更高效、精確的控制,避免了外部庫的開銷,同時也能深入調控硬件特性,提升系統性能。
【2】上位機開發
本項目的上位機開發基于Qt 5框架,使用**C++**作為主要編程語言。Qt是一個跨平臺的應用開發框架,廣泛用于開發GUI應用程序。Qt提供了豐富的GUI組件和工具,能夠高效地實現圖形界面的設計與開發。C++則作為Qt的底層語言,具有高效的性能和良好的控制力,非常適合用于處理設備與系統之間的數據交互、通信協議的實現和復雜的計算任務。在項目中,Qt被用于開發Windows平臺的桌面應用程序以及Android平臺的手機APP。Qt框架的跨平臺特性使得開發者能夠使用同一套代碼在不同操作系統上進行構建和部署,大大提高了開發效率。
為了方便開發和調試,上位機的開發采用了Qt Creator作為主要的集成開發環境(IDE)。Qt Creator是一款由Qt官方提供的開發工具,專為Qt應用程序開發設計,支持C++、QML和JavaScript等語言。Qt Creator提供了豐富的功能,如代碼編輯、調試、構建、版本控制集成等,能夠顯著提升開發者的生產力。在本項目中,Qt Creator為開發者提供了自動化構建、界面設計工具(如Qt Designer)和調試工具(如QDebug和QML調試工具),使得開發過程更加高效和流暢。
上位機與硬件設備端的通信采用了基于TCP/IP協議的數據傳輸方式。為了實現這一功能,Qt提供了豐富的網絡編程支持,尤其是QTcpSocket和QTcpServer類,使得上位機能夠輕松地與硬件設備建立TCP連接,進行數據收發。上位機通過WIFI連接ESP8266-WIFI模塊,ESP8266模塊創建TCP服務器,上位機應用則作為客戶端連接到服務器,進行實時的數據傳輸與控制命令的下發。
為了滿足不同用戶的需求,本項目需要支持Windows平臺的桌面應用和Android平臺的移動APP。Qt的跨平臺特性使得開發人員能夠在一個代碼庫下完成多平臺應用的開發和移植。開發者僅需要編寫一次應用邏輯和用戶界面,就可以通過Qt的跨平臺構建工具生成Windows和Android兩個平臺的可執行文件。此外,Qt提供了豐富的文檔和社區支持,幫助開發者解決平臺差異和兼容性問題,確保應用在不同平臺上都能穩定運行。
總體而言,上位機開發環境采用了Qt 5框架和C++語言,結合Qt Creator集成開發環境,提供了一個高效、穩定、跨平臺的開發工具鏈。通過Qt強大的GUI設計、網絡通信、多線程支持以及數據庫管理功能,開發者能夠輕松實現與硬件設備的交互、控制設備、處理傳感器數據,并為用戶提供直觀、流暢的操作體驗。
1.5 模塊的技術詳情介紹
- STM32單片機 (STM32F103RCT6)
- 功能:負責整個系統的控制與邏輯判斷,協調各個模塊的工作。
- 特點:高性能、低功耗、豐富的外設接口,適合嵌入式系統應用。
- 溫度傳感器 (DHT11)
- 功能:實時檢測車內的溫度,并將溫度數據傳送給STM32單片機,供系統判斷是否超過設定的閾值。
- 特點:簡單易用、價格低廉、測量范圍適中,適用于低成本系統。
- 人體檢測傳感器 (海凌科24G毫米波雷達模塊 LD2402)
- 功能:檢測車內是否有兒童或成人存在,判斷是否需要觸發報警。
- 特點:非接觸式檢測,適應性強,不受光線或遮擋物影響,能夠精準探測人體活動。
- 蜂鳴器 (高電平觸發)
- 功能:當滿足報警條件時,發出響亮的聲音,提醒車主車內的安全隱患。
- 特點:聲音響亮、易于驅動,能夠在高噪音環境下有效提醒。
- GSM模塊 (Air780e)
- 功能:通過短信方式將報警信息發送至車主手機,提醒車主車內的危險情況。
- 特點:支持全球網絡,適合遠程通訊,具有短信發送功能,穩定可靠。
- 按鍵模塊
- 功能:用于手動關閉報警,確保在非報警狀態下系統不會繼續觸發。
- 特點:簡單直觀,便于操作,提升系統的靈活性。
- 電源模塊 (12V直流電源)
- 功能:為系統提供穩定的電力供應,確保所有模塊能夠正常工作。
- 特點:穩定高效,能夠滿足系統的電力需求。
- 液晶顯示屏 (0.96寸OLED)
- 功能:實時顯示車內的溫度和報警狀態,提供用戶友好的界面,方便設置與監控。
- 特點:小巧、清晰、低功耗,適合嵌入式系統,能夠顯示詳細的信息。
1.6 框架圖
graph TDA[單片機控制系統] --> B[溫度傳感器模塊]A --> C[紅外傳感器模塊]A --> D[GSM通信模塊]A --> E[蜂鳴器報警模塊]A --> F[閾值設置與報警控制]B --> G[實時監測車內溫度]C --> H[檢測兒童座椅區域人體存在]F --> I[設置高溫閾值]F --> J[自動關閉報警條件]F --> K[手動關閉報警功能]G & H --> L{高溫+人體同時存在?}L -->|是| M[觸發報警系統]M --> E[啟動蜂鳴器聲音警報]M --> N[GSM模塊發送短信]N --> O[設置短信發送間隔時間]classDef module fill:#f9f,stroke:#333,stroke-width:2px;classDef decision fill:#f96,stroke:#333,stroke-width:2px;classDef action fill:#6f9,stroke:#333,stroke-width:2px;class A,B,C,D,E,F module;class L decision;class G,H,M,N,E,O action;
框架圖說明:
- 核心控制系統:單片機作為中央處理器
- 輸入檢測層:
- 溫度傳感器實時監測車內溫度
- 紅外傳感器專用于兒童座椅區域人體檢測
- 智能判斷模塊:
- 雙條件判斷邏輯(高溫+人體同時存在)
- 可設置高溫閾值
- 報警執行層:
- 蜂鳴器本地聲音警報
- GSM模塊短信通知功能
- 控制功能:
- 不滿足條件時自動關閉報警
- 支持手動關閉報警
- 短信發送間隔時間控制
二、代碼設計思路
當前項目使用的相關軟件工具、模塊源碼已經上傳到網盤:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
以下是項目中各個模塊的代碼示例,涵蓋了溫度傳感器、人體檢測傳感器、蜂鳴器、GSM模塊、按鍵模塊、電源管理等模塊。
1. 溫度傳感器 (DHT11)
#include "DHT11.h"#define DHT11_PIN GPIO_PIN_0 // 設置連接DHT11的引腳// 讀取溫濕度數據
void DHT11_Read_Data(uint8_t *temperature, uint8_t *humidity) {uint8_t data[5] = {0}; // 存儲溫濕度數據DHT11_Init(); // 初始化DHT11傳感器DHT11_Read(data); // 讀取數據*humidity = data[0]; // 濕度*temperature = data[2]; // 溫度
}
2. 人體檢測傳感器 (海凌科24G毫米波雷達模塊 LD2402)
#include "LD2402.h"#define RADAR_PIN GPIO_PIN_1 // 設置連接雷達模塊的引腳// 檢測車內是否有兒童
uint8_t Detect_Human() {uint8_t status = LD2402_Get_Status(); // 獲取雷達模塊的狀態if (status == 1) {return 1; // 檢測到人體} else {return 0; // 未檢測到人體}
}
3. 蜂鳴器 (高電平觸發)
#define BUZZER_PIN GPIO_PIN_2 // 設置連接蜂鳴器的引腳// 激活蜂鳴器報警
void Buzzer_Alarm() {HAL_GPIO_WritePin(GPIOB, BUZZER_PIN, GPIO_PIN_SET); // 設置蜂鳴器引腳為高電平HAL_Delay(1000); // 蜂鳴器響1秒HAL_GPIO_WritePin(GPIOB, BUZZER_PIN, GPIO_PIN_RESET); // 關閉蜂鳴器
}
4. GSM模塊 (Air780e)
#include "gsm.h"#define GSM_PIN GPIO_PIN_3 // 設置GSM模塊的引腳// 發送報警短信
void GSM_Send_SMS(char *phone_number, char *message) {UART_Send_Command("AT+CMGF=1\r"); // 設置短信格式為文本模式UART_Send_Command("AT+CMGS=\""); UART_Send_Command(phone_number); UART_Send_Command("\"\r");UART_Send_Command(message); // 發送短信內容UART_Send_Command("\x1A"); // 發送結束符
}
5. 按鍵模塊
#define BUTTON_PIN GPIO_PIN_4 // 設置按鍵模塊的引腳// 檢查按鍵是否被按下
uint8_t Check_Button() {if (HAL_GPIO_ReadPin(GPIOB, BUTTON_PIN) == GPIO_PIN_SET) {return 1; // 按鍵被按下} else {return 0; // 按鍵未被按下}
}
6. 電源管理 (12V直流電源模塊)
// 電源管理不涉及復雜的代碼邏輯,主要通過電源模塊供電給STM32單片機和其他模塊。
// 電源模塊與系統其他模塊的連接通常通過穩定的電源適配器來實現。
7. 主控制流程
#include "main.h"
#include "DHT11.h"
#include "LD2402.h"
#include "gsm.h"
#include "button.h"
#include "buzzer.h"uint8_t temperature, humidity;
uint8_t human_detected;int main(void) {HAL_Init(); // 初始化HAL庫SystemClock_Config(); // 配置時鐘while (1) {// 獲取溫度數據DHT11_Read_Data(&temperature, &humidity);// 獲取人體檢測狀態human_detected = Detect_Human();// 如果溫度過高且檢測到人體,觸發報警if (temperature > 30 && human_detected) {Buzzer_Alarm(); // 蜂鳴器報警GSM_Send_SMS("+1234567890", "警報:車內溫度過高且有兒童,請檢查!"); // 發送短信提醒// 防止重復發送短信HAL_Delay(10000); // 間隔10秒}// 檢查是否按下手動關閉按鈕if (Check_Button()) {Buzzer_Alarm(); // 關閉報警}HAL_Delay(1000); // 延時1秒}
}
8. 液晶顯示 (OLED 顯示屏)
#include "oled.h"// 顯示溫度信息
void Display_Temperature(uint8_t temperature) {OLED_Clear();OLED_ShowString(0, 0, "Temperature:");OLED_ShowNum(0, 2, temperature, 3);OLED_ShowString(0, 4, "C");
}
這些代碼為各個硬件模塊提供了基礎的操作示例,并通過主控制流程進行協調。
三、短信發送
1. air780e.h
#ifndef __AIR780E_H
#define __AIR780E_H#include "stm32f1xx.h"// 函數聲明
void AIR780E_Init(void);
void AIR780E_Send_Command(char *cmd);
void AIR780E_Send_SMS(char *phone_number, char *message);
void UART3_IRQHandler(void);#endif /* __AIR780E_H */
2. air780e.c
#include "air780e.h"
#include "string.h"
#include "stm32f1xx_hal.h"// 串口3配置
#define AIR780E_UART huart3
#define AIR780E_RX_PIN GPIO_PIN_11
#define AIR780E_TX_PIN GPIO_PIN_10
#define AIR780E_GPIO_PORT GPIOB
#define AIR780E_BAUDRATE 9600// 初始化Air780E GSM模塊
void AIR780E_Init(void) {// 啟用UART3時鐘__HAL_RCC_USART3_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();// 配置TX和RX引腳GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = AIR780E_TX_PIN;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(AIR780E_GPIO_PORT, &GPIO_InitStruct);GPIO_InitStruct.Pin = AIR780E_RX_PIN;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;HAL_GPIO_Init(AIR780E_GPIO_PORT, &GPIO_InitStruct);// 配置UART3UART_HandleTypeDef huart3;huart3.Instance = USART3;huart3.Init.BaudRate = AIR780E_BAUDRATE;huart3.Init.WordLength = UART_WORDLENGTH_8B;huart3.Init.StopBits = UART_STOPBITS_1;huart3.Init.Parity = UART_PARITY_NONE;huart3.Init.Mode = UART_MODE_TX_RX;huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart3.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart3);// 啟用串口3的中斷HAL_NVIC_EnableIRQ(USART3_IRQn);
}// 發送AT指令
void AIR780E_Send_Command(char *cmd) {uint16_t length = strlen(cmd);for (uint16_t i = 0; i < length; i++) {// 發送每個字符while (!(USART3->SR & USART_SR_TXE)); // 等待TX緩沖區空USART3->DR = cmd[i]; // 發送字符}while (!(USART3->SR & USART_SR_TC)); // 等待傳輸完成
}// 發送短信
void AIR780E_Send_SMS(char *phone_number, char *message) {char cmd[128];// 設置短信格式為文本模式AIR780E_Send_Command("AT+CMGF=1\r\n");HAL_Delay(100);// 設置接收號碼sprintf(cmd, "AT+CMGS=\"%s\"\r\n", phone_number);AIR780E_Send_Command(cmd);HAL_Delay(100);// 發送短信內容AIR780E_Send_Command(message);HAL_Delay(100);// 發送Ctrl+Z結束短信AIR780E_Send_Command("\x1A"); // Ctrl+ZHAL_Delay(100);
}// 串口3中斷處理函數
void UART3_IRQHandler(void) {if (USART3->SR & USART_SR_RXNE) { // 檢查接收緩沖區是否有數據char received_char = (USART3->DR & 0xFF); // 讀取接收到的數據// 根據需要處理接收到的數據}
}
說明:
- air780e.h:
- 頭文件中聲明了
AIR780E_Init()
初始化函數,AIR780E_Send_Command()
發送 AT 指令的函數,以及AIR780E_Send_SMS()
發送短信的函數。 - 串口中斷處理函數
UART3_IRQHandler()
用于處理串口3的接收中斷。
- 頭文件中聲明了
- air780e.c:
- AIR780E_Init():配置串口3,設置正確的波特率、數據位、停止位和校驗位。
- AIR780E_Send_Command():發送AT指令,通過串口3逐字符發送數據。
- AIR780E_Send_SMS():設置GSM模塊為短信模式,發送短信內容,并通過
Ctrl+Z
(即0x1A
)結束短信內容。 - UART3_IRQHandler():這個中斷服務程序檢查串口3的接收數據寄存器。如果接收到數據,將執行相應處理。
四、STM32主代碼
以下是main.c
代碼示例,結合了溫度傳感器、人體檢測傳感器、蜂鳴器、GSM模塊、按鍵模塊、電源管理以及液晶顯示等模塊。代碼實現了汽車兒童安全預警系統的基本功能。
#include "stm32f1xx_hal.h"
#include "DHT11.h"
#include "LD2402.h"
#include "gsm.h"
#include "button.h"
#include "buzzer.h"
#include "oled.h"#define TEMPERATURE_THRESHOLD 30 // 設定溫度閾值 30°Cuint8_t temperature, humidity;
uint8_t human_detected;
uint32_t last_sms_time = 0; // 上次發送短信的時間void SystemClock_Config(void);
void GPIO_Init(void);
void UART_Init(void);
void Delay(uint32_t delay);// 初始化系統
int main(void) {HAL_Init(); // 初始化HAL庫SystemClock_Config(); // 配置時鐘GPIO_Init(); // 初始化GPIOUART_Init(); // 初始化UARTOLED_Init(); // 初始化OLED顯示屏while (1) {// 獲取溫度數據DHT11_Read_Data(&temperature, &humidity);// 顯示當前溫度信息Display_Temperature(temperature);// 獲取人體檢測狀態human_detected = Detect_Human();// 如果溫度過高且檢測到人體,觸發報警if (temperature > TEMPERATURE_THRESHOLD && human_detected) {Buzzer_Alarm(); // 蜂鳴器報警// 檢查是否已達到發送短信的間隔時間if (HAL_GetTick() - last_sms_time > 10000) { // 每10秒發送一次短信GSM_Send_SMS("+1234567890", "警報:車內溫度過高且有兒童,請檢查!");last_sms_time = HAL_GetTick(); // 更新最后發送短信的時間}}// 檢查是否按下手動關閉按鈕if (Check_Button()) {Buzzer_Alarm(); // 手動關閉報警}}
}// 系統時鐘配置
void SystemClock_Config(void) {// 配置系統時鐘,這部分根據實際硬件平臺設置
}// GPIO初始化
void GPIO_Init(void) {__HAL_RCC_GPIOB_CLK_ENABLE(); // 啟用GPIOB時鐘GPIO_InitTypeDef GPIO_InitStruct = {0};// 配置蜂鳴器引腳GPIO_InitStruct.Pin = GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);// 配置按鍵引腳GPIO_InitStruct.Pin = GPIO_PIN_4;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}// UART初始化
void UART_Init(void) {__HAL_RCC_USART1_CLK_ENABLE(); // 啟用USART1時鐘UART_HandleTypeDef huart1;huart1.Instance = USART1;huart1.Init.BaudRate = 9600;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart1);
}// 延時函數
void Delay(uint32_t delay) {HAL_Delay(delay);
}// 獲取當前時間
uint32_t HAL_GetTick(void) {return HAL_GetTick();
}
- 初始化與系統配置:
HAL_Init()
用于初始化硬件抽象層(HAL),SystemClock_Config()
配置時鐘,GPIO_Init()
配置GPIO引腳,UART_Init()
初始化UART以與GSM模塊通信。 - 溫度監測與顯示:通過
DHT11_Read_Data()
獲取溫度數據,并使用Display_Temperature()
將其顯示在OLED屏上。 - 人體檢測:通過
Detect_Human()
使用雷達模塊檢查車內是否有兒童或其他人。 - 報警觸發:當溫度超過設定的閾值(30°C),且人體檢測到兒童時,通過蜂鳴器觸發報警,并通過GSM模塊向車主發送短信。
- 手動關閉報警:通過
Check_Button()
檢查按鍵輸入,若按下按鈕,系統關閉報警。 - 短信發送間隔:使用
HAL_GetTick()
和last_sms_time
變量,確保短信不會頻繁發送,每10秒鐘才發送一次。