一、前言
1.1 項目介紹
【1】項目功能介紹
隨著社會的進步和科技的發(fā)展,兒童安全問題日益引起廣泛關(guān)注。在日常生活中,尤其是在上學(xué)放學(xué)途中、戶外活動時,兒童走失事件時有發(fā)生,給家庭和社會帶來了極大的困擾和擔(dān)憂。隨著學(xué)業(yè)負擔(dān)的增加,學(xué)生時常會因為忘記攜帶所需書籍而影響學(xué)習(xí)。如何利用現(xiàn)代技術(shù)手段提高兒童安全保障水平,并輔助他們培養(yǎng)良好的學(xué)習(xí)習(xí)慣,成為了一個待解決的社會需求。
基于此背景,當(dāng)前設(shè)計并實現(xiàn)一款基于STM32F103RCT6微控制器為核心的兒童智能安全防護書包,顯得尤為必要與實際。這款書包集成了先進的定位技術(shù)和無線通信模塊,能夠?qū)崟r追蹤并發(fā)送兒童的位置信息給家長,確保在緊急情況下快速響應(yīng) (發(fā)送短信的時候,直接通過GPS經(jīng)緯度拼接百度地圖的HTTP請求鏈接,家長收到短信可以直接打開鏈接,在網(wǎng)頁查看百度地圖上顯示的具體位置,可以直接通過百度地圖導(dǎo)航過去)。同時,具備智能化功能,如課程表錄入存儲與提醒系統(tǒng),利用EEPROM(例如AT24C02)進行數(shù)據(jù)持久化存儲,并通過RFID-RC522射頻識別模塊自動檢測所攜帶書籍是否齊全,避免孩子因疏忽遺漏課本而耽誤學(xué)習(xí)。
智能書包還配備了直觀易讀的1.44寸LCD顯示屏,用于顯示當(dāng)前位置信息、當(dāng)日課表以及未帶書籍的提醒。當(dāng)檢測到缺少某本書籍時,蜂鳴器模塊會發(fā)出聲音警報,從而強化提醒效果,幫助學(xué)生養(yǎng)成有序整理個人物品的習(xí)慣。
這款基于STM32的兒童智能安全防護書包是一個集成物聯(lián)網(wǎng)技術(shù)、GPS定位、無線通信和智能感知于一體的創(chuàng)新產(chǎn)品,提升兒童的安全防護等級,加強家校互動,促進學(xué)生自我管理能力的培養(yǎng),充分體現(xiàn)了科技服務(wù)于生活、服務(wù)于教育的理念。
【2】設(shè)計實現(xiàn)的功能
(1)實時定位與緊急求助功能:
- 通過集成GPS模塊,該智能書包能夠?qū)崟r獲取并更新兒童的位置信息,并通過無線通信(GSM短信模塊如Air724UG 4G)將位置數(shù)據(jù)發(fā)送給家長。當(dāng)兒童在陌生環(huán)境中迷路或者遇到緊急情況時,只需按下求救按鈕,系統(tǒng)立即向預(yù)設(shè)的家長手機發(fā)送包含當(dāng)前位置信息的短信,方便家長迅速找到孩子。
(2)課程表管理與提醒功能:
- 設(shè)計有課程表錄入存儲模塊,利用EEPROM芯片AT24C02進行非易失性數(shù)據(jù)存儲,家長或?qū)W生可以預(yù)先將每日課程表輸入到系統(tǒng)中。
- 每天早上,書包會根據(jù)存儲的課程表自動檢查當(dāng)天所需的書籍是否已放入書包內(nèi)。通過射頻識別RFID-RC522模塊讀取貼在書籍上的標(biāo)簽信息,若發(fā)現(xiàn)缺少某科書籍,則蜂鳴器會發(fā)出聲音警報,同時LCD顯示屏也會顯示相應(yīng)的提示信息,確保學(xué)生不會忘記攜帶必要的學(xué)習(xí)資料。
(3)可視化信息展示:
- 配備了1.44寸LCD顯示屏,可實時顯示當(dāng)前地理位置信息、時間以及當(dāng)日的課程表內(nèi)容,使得學(xué)生和家長可以直觀地查看重要信息。
這款基于STM32的兒童智能安全防護書包實現(xiàn)了兒童安全監(jiān)護和學(xué)業(yè)輔助兩大核心功能,既有助于保障孩子的安全出行,又能培養(yǎng)他們的自我管理和規(guī)劃能力,體現(xiàn)了科技產(chǎn)品在教育領(lǐng)域的深度應(yīng)用價值。
【3】項目硬件模塊組成
(1)主控芯片:
- STM32F103RCT6微控制器作為整個系統(tǒng)的“大腦”,負責(zé)控制和協(xié)調(diào)各個功能模塊的運作,處理GPS定位數(shù)據(jù)、GSM短信通信、RFID識別信息等,并通過程序邏輯實現(xiàn)課程表管理、提醒以及數(shù)據(jù)顯示等功能。
(2)定位模塊:
- GPS模塊,用于實時獲取并更新兒童所在位置信息,確保家長可以隨時查看孩子的位置狀態(tài)。
(3)無線通信模塊:
- Air724UG 4G GSM短信模塊,提供遠程通信能力,當(dāng)發(fā)生緊急情況時,兒童可通過書包上的求救按鈕觸發(fā)發(fā)送帶有位置信息的短信至預(yù)設(shè)的家長手機。
(4)存儲模塊:
- AT24C02 EEPROM芯片,用作非易失性存儲器,存儲孩子的課程表信息,即使在斷電情況下也能保存數(shù)據(jù)不丟失。
(5)射頻識別模塊:
- RFID-RC522模塊,配合貼在書籍上的RFID標(biāo)簽,檢測書包內(nèi)是否攜帶齊全當(dāng)日所需的書籍資料,如果發(fā)現(xiàn)缺少書籍,會觸發(fā)報警提示。
(6)報警提示模塊:
- 高電平觸發(fā)的蜂鳴器模塊,在檢測到未帶書籍或其它異常情況時,通過發(fā)出聲音警報來提醒學(xué)生。
(7)顯示模塊:
- 采用1.44寸LCD顯示屏,實時展示當(dāng)前位置、時間、當(dāng)天課表及未帶書籍等重要信息,方便用戶直觀了解當(dāng)前狀況。
【3】功能總結(jié)
基于STM32的兒童智能安全防護書包設(shè)計
(1)定位模塊:定位模塊實時獲取兒童位置信息,能夠家長在放學(xué)時找到兒童位置,或者丟失時及時查找兒童的位置。
(2)GSM短信模塊:兒童如果意識到自己走丟,就可以按下求救按鈕發(fā)送位置短信給家長,進而使家長盡快找到兒童位置
(3)課程表錄入存儲模塊:將每天的課程表錄入系統(tǒng),以便提醒學(xué)生第二天要帶什么書籍。(eeprom)
(4)射頻識別模塊:將每一科的書籍貼上標(biāo)簽再與系統(tǒng)中的課表進行對比,如果檢測到當(dāng)天某一科書本沒有帶,蜂鳴器會響,呼吸燈會亮。(RFID)
(5)顯示模塊:LCD屏顯示實時位置課表信息以及提示沒有帶的書籍。
硬件選型:
(1)主控芯片采用STM32F103RCT6
(2)定位模塊采用: GPS模塊
(3)短信發(fā)送模塊采用 Air724UG 4G
(4)存儲模塊采用AT24C02
(5)射頻識別模塊采用RFID-RC522
(6)報警提示采用高電平觸發(fā)的蜂鳴器模塊
(7)顯示屏采用1.44寸LCD顯示屏
1.2 設(shè)計思路
(1)需求分析階段:
- 對目標(biāo)用戶群體(兒童與家長)的需求進行深入研究和理解,確定主要功能點:兒童安全定位、緊急求助、課程表管理與提醒、書籍?dāng)y帶檢測等。
(2)系統(tǒng)架構(gòu)設(shè)計:
- 根據(jù)需求,選擇STM32F103RCT6作為主控芯片,因其具有強大的處理能力、豐富的外設(shè)接口及低功耗特性,能夠滿足項目所需的復(fù)雜計算任務(wù)和多模塊協(xié)調(diào)工作。
(3)功能模塊劃分:
- 定位模塊設(shè)計采用GPS接收器,實時獲取并解析位置信息。
- 無線通信模塊選用4G GSM短信模塊Air724UG,實現(xiàn)實時位置信息的遠程發(fā)送和接收緊急求助信號。
- 數(shù)據(jù)存儲模塊使用EEPROM AT24C02,確保課程表數(shù)據(jù)的安全可靠存儲。
- 為實現(xiàn)書籍?dāng)y帶檢測,利用RFID-RC522射頻識別模塊,結(jié)合預(yù)置在書籍上的RFID標(biāo)簽,自動識別書包內(nèi)書籍是否齊全。
- 報警提示模塊通過高電平觸發(fā)的蜂鳴器來發(fā)出聲音警告,提醒學(xué)生遺漏書籍。
- 顯示模塊配備1.44寸LCD顯示屏,直觀展示位置信息、課程表以及未帶書籍的提醒。
(4)軟硬件協(xié)同設(shè)計:
- 硬件方面,合理布局各模塊,優(yōu)化電源管理,確保設(shè)備穩(wěn)定運行;軟件方面,編寫高效的嵌入式程序,實現(xiàn)對各個硬件模塊的控制和交互,包括GPS數(shù)據(jù)解析、GSM通信協(xié)議棧開發(fā)、RFID讀取與比對算法、數(shù)據(jù)顯示邏輯等。
(5)人機交互設(shè)計:
- 設(shè)計簡潔易用的界面和操作流程,如一鍵求救按鈕、清晰的課程表顯示、直觀的報警提示等,便于兒童和家長快速理解和操作。
1.3 系統(tǒng)功能總結(jié)
功能模塊 | 功能描述 |
---|---|
定位模塊(GPS) | 實時獲取并更新兒童地理位置信息,通過無線通信模塊發(fā)送至家長設(shè)備,以便家長隨時掌握孩子位置動態(tài)。 |
短信通信模塊(GSM) | 兒童在緊急情況下按下求救按鈕,系統(tǒng)通過4G GSM模塊向預(yù)設(shè)的家長手機號碼發(fā)送包含定位信息的短信進行求助。 |
課程表管理模塊(EEPROM) | 學(xué)生或家長可以錄入每日課程表至系統(tǒng)中,利用AT24C02 EEPROM芯片存儲數(shù)據(jù),確保斷電后仍能保留課程信息。 |
書籍檢測模塊(RFID) | 通過RFID-RC522射頻識別模塊讀取書本上的標(biāo)簽信息,自動比對與當(dāng)日課表要求的書籍是否齊全,如有遺漏則觸發(fā)報警提示。 |
報警提示模塊(蜂鳴器) | 當(dāng)檢測到學(xué)生未攜帶某科書籍或發(fā)生其他異常情況時,高電平觸發(fā)的蜂鳴器會發(fā)出聲音警告提醒學(xué)生。 |
顯示模塊(LCD顯示屏) | 配備1.44寸LCD顯示屏實時顯示當(dāng)前位置、時間、當(dāng)天課程表以及未帶書籍的提示信息,方便學(xué)生查看和確認。 |
1.4 開發(fā)工具的選擇
STM32的編程語言選擇C語言,C語言執(zhí)行效率高,大學(xué)里主學(xué)的C語言,C語言編譯出來的可執(zhí)行文件最接近于機器碼,匯編語言執(zhí)行效率最高,但是匯編的移植性比較差,目前在一些操作系統(tǒng)內(nèi)核里還有一些低配的單片機使用的較多,平常的單片機編程還是以C語言為主。C語言的執(zhí)行效率僅次于匯編,語法理解簡單、代碼通用性強,也支持跨平臺,在嵌入式底層、單片機編程里用的非常多,當(dāng)前的設(shè)計就是采用C語言開發(fā)。
開發(fā)工具選擇Keil,keil是一家世界領(lǐng)先的嵌入式微控制器軟件開發(fā)商,在2015年,keil被ARM公司收購。因為當(dāng)前芯片選擇的是STM32F103系列,STMF103是屬于ARM公司的芯片構(gòu)架、Cortex-M3內(nèi)核系列的芯片,所以使用Kile來開發(fā)STM32是有先天優(yōu)勢的,而keil在各大高校使用的也非常多,很多教科書里都是以keil來教學(xué),開發(fā)51單片機、STM32單片機等等。目前作為MCU芯片開發(fā)的軟件也不只是keil一家獨大,IAR在MCU微處理器開發(fā)領(lǐng)域里也使用的非常多,IAR擴展性更強,也支持STM32開發(fā),也支持其他芯片,比如:CC2530,51單片機的開發(fā)。從軟件的使用上來講,IAR比keil更加簡潔,功能相對少一些。如果之前使用過keil,而且使用頻率較多,已經(jīng)習(xí)慣再使用IAR是有點不適應(yīng)界面的。
二、代碼設(shè)計
2.1 GPS解析代碼
基于STM32 HAL庫進行GPS NMEA協(xié)議數(shù)據(jù)解析的代碼
#include "stm32f1xx_hal.h"
#include <string.h>
#include <stdio.h>
// GPS 數(shù)據(jù)結(jié)構(gòu)體定義
typedef struct {
char GPGGA[100]; // 用于存儲GPGGA語句
double latitude; // 緯度
double longitude; // 經(jīng)度
float UTC_time[7]; // UTC時間
int fix_quality; // 定位質(zhì)量
float hdop; // 水平精度因子
} GPS_Data_TypeDef;
// 全局變量聲明
GPS_Data_TypeDef GPS_Data;
// 串口接收緩沖區(qū)
uint8_t RxBuffer[256];
// GPS NMEA數(shù)據(jù)處理函數(shù)
void ProcessGPSData(void) {
static uint8_t index = 0;
// 從串口接收到的數(shù)據(jù)中查找特定的NMEA語句,例如GPGGA
if (strstr((char*)RxBuffer, "$GPGGA")) {
// 分割NMEA語句獲取所需字段
char *token;
token = strtok((char*)RxBuffer, ",");
while(token != NULL) {
// 解析各字段
if (/* 判斷當(dāng)前token是否為緯度 */) {
GPS_Data.latitude = atof(token);
// 考慮南北緯轉(zhuǎn)換及格式化
} else if (/* 判斷當(dāng)前token是否為經(jīng)度 */) {
GPS_Data.longitude = atof(token);
// 考慮東西經(jīng)轉(zhuǎn)換及格式化
} else if (/* 判斷當(dāng)前token是否為UTC時間 */) {
// 處理時間信息
}
token = strtok(NULL, ",");
}
// 清空接收緩沖區(qū)以便下次接收新的數(shù)據(jù)
memset(RxBuffer, 0, sizeof(RxBuffer));
index = 0;
}
}
// 串口中斷服務(wù)函數(shù)
void USART1_IRQHandler(void) {
static uint8_t UART_Rx_STA = 0;
uint8_t temp=0;
if ((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart1, UART_IT_RXNE) != RESET)) {
temp = huart1.Instance->RDR & 0xff; // 讀取接收到的數(shù)據(jù)
// 將接收到的數(shù)據(jù)添加到緩沖區(qū),并檢查是否有完整的NMEA句子結(jié)束符'rn'
if (temp == 'n') { // 根據(jù)實際使用情況可能需要同時檢測'r'和'n'
RxBuffer[index++] = temp; // 添加換行符
RxBuffer[index] = '?'; // 字符串結(jié)束符
ProcessGPSData(); // 調(diào)用解析函數(shù)
} else if (index < (sizeof(RxBuffer)-1)) {
RxBuffer[index++] = temp;
}
}
}
int main(void) {
// 初始化系統(tǒng)時鐘和USART1
MX_GPIO_Init();
MX_USART1_UART_Init();
// 開啟串口中斷
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
while (1) {
// 主循環(huán)
// ...
}
}
2.2 AT24C02存儲代碼
#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_i2c.h"
#define EEPROM_ADDRESS 0xA0 // AT24C02的I2C地址
I2C_HandleTypeDef hi2c1;
void SystemClock_Config(void);
void I2C_Init() {
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c1);
}
void EEPROM_Write(uint16_t addr, uint8_t data) {
HAL_I2C_Mem_Write(&hi2c1, EEPROM_ADDRESS, addr, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY);
}
uint8_t EEPROM_Read(uint16_t addr) {
uint8_t data;
HAL_I2C_Mem_Read(&hi2c1, EEPROM_ADDRESS, addr, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY);
return data;
}
int main(void) {
HAL_Init();
SystemClock_Config();
I2C_Init();
uint16_t address = 0x00;
uint8_t data_to_write = 0x55;
uint8_t data_read;
// 寫入數(shù)據(jù)到EEPROM
EEPROM_Write(address, data_to_write);
// 從EEPROM讀取數(shù)據(jù)
data_read = EEPROM_Read(address);
// 檢查讀取的數(shù)據(jù)
if (data_read == data_to_write) {
// 讀取成功
} else {
// 讀取失敗
}
while (1) {
}
}
2.3 RFID-RC522代碼
STM32與RFID-RC522的交互涉及到很多步驟,包括初始化RFID模塊、檢測卡片、讀取卡片信息、以及將這些信息存儲起來。
#include "stm32f10x.h"
#include "SPI.h"
#include "RFID.h"
#include "usart.h" // 如果你使用了串口打印,可以包含這個頭文件
#define SS_PIN PA4 // 根據(jù)你的連接修改這個引腳
#define RST_PIN PA3 // RFID模塊的復(fù)位引腳
RFID rfid(SS_PIN, RST_PIN); // 創(chuàng)建RFID對象
uint8_t uid[5]; // 用于存儲卡片的UID
int main(void)
{
SystemInit(); // 初始化系統(tǒng)
usart_init(115200); // 初始化串口,用于調(diào)試
SPI_Init(); // 初始化SPI接口
rfid.PCD_Init(); // 初始化RFID模塊
while (1)
{
if (rfid.PICC_IsNewCardPresent()) // 檢測是否有新卡片
{
rfid.PICC_ReadCardSerial(); // 讀取卡片UID
for (uint8_t i = 0; i < rfid.uid.size; i++) // 將UID存儲到uid數(shù)組中
{
uid[i] = rfid.uid.uidByte[i];
}
// 可以在這里添加代碼將uid存儲到EEPROM、Flash或其他存儲介質(zhì)中
// 也可以通過串口打印UID進行調(diào)試
printf("Card UID: ");
for (uint8_t i = 0; i < rfid.uid.size; i++)
{
printf("%02X ", uid[i]);
}
printf("rn");
}
HAL_Delay(100); // 延時一段時間,避免過度占用CPU
}
}
2.4 Air724UG 4G代碼
使用STM32的HAL庫和USART外設(shè)(串口)與Air724UG 4G模塊進行通信。通過UART_SendString()
函數(shù)可以發(fā)送字符串到串口,通過GSM_SendCommand()
函數(shù)可以向4G模塊發(fā)送AT指令。
在main()
函數(shù)中,設(shè)置短信格式為文本模式,設(shè)置短信接收方號碼,發(fā)送短信內(nèi)容。
#include "stm32f1xx_hal.h"
#include <string.h>
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
// UART發(fā)送完成回調(diào)函數(shù)
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
// UART接收完成回調(diào)函數(shù)
}
void UART_SendString(const char *str) {
HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), HAL_MAX_DELAY);
}
void GSM_SendCommand(const char *cmd) {
UART_SendString(cmd);
UART_SendString("rn");
HAL_Delay(100); // 等待響應(yīng)
}
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
char phone_number[] = "13800138000";
char message[] = "Hello, this is a test message from STM32!";
// 初始化Air724UG 4G模塊
GSM_SendCommand("AT+CMGF=1"); // 設(shè)置短信格式為文本模式
GSM_SendCommand("AT+CMGS="+86"); // 設(shè)置短信接收方號碼
GSM_SendCommand(phone_number);
GSM_SendCommand(""");
// 發(fā)送短信內(nèi)容
GSM_SendCommand(message);
HAL_UART_Transmit(&huart1, (uint8_t)26, 1, HAL_MAX_DELAY); // 發(fā)送Ctrl+Z結(jié)束符
while (1) {
}
}
void SystemClock_Config(void) {
// 系統(tǒng)時鐘配置
}
static void MX_USART1_UART_Init(void) {
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);
}
三、總結(jié)
基于STM32的兒童智能安全防護書包設(shè)計通過先進的技術(shù)手段,為兒童的安全提供全方位的保障。本項目融合了GPS定位、GSM短信通信、EEPROM存儲、RFID射頻識別以及LCD顯示等多項功能,力求在兒童的日常生活和學(xué)習(xí)中提供便捷與安全。
通過GPS模塊,書包能夠?qū)崟r追蹤兒童的位置,讓家長隨時了解孩子的行蹤,確保在關(guān)鍵時刻能夠迅速找到孩子。而GSM短信模塊則為兒童提供了一個緊急求助的途徑,一旦孩子意識到自己走丟或有其他緊急情況,只需按下求救按鈕,即可將位置信息以短信的形式發(fā)送給家長,從而迅速獲得幫助。
在學(xué)習(xí)方面,本項目通過EEPROM存儲模塊實現(xiàn)了課程表的錄入與存儲功能。兒童或家長可以將每天的課程表錄入系統(tǒng),書包便會在需要時提醒孩子攜帶相應(yīng)的書籍。而RFID射頻識別模塊則負責(zé)檢測書包內(nèi)是否已攜帶當(dāng)天所需的各科書本。如果檢測到某一科書本缺失,書包上的蜂鳴器會發(fā)出警報聲,呼吸燈也會亮起,以提醒孩子及時補充。
此外,本項目還采用了一塊1.44寸的LCD顯示屏,用于實時顯示兒童的位置信息、課表內(nèi)容以及未攜帶書籍的提示信息。這使得兒童在使用書包的過程中能夠隨時了解自己的位置和當(dāng)天的學(xué)習(xí)任務(wù),為他們的安全和學(xué)習(xí)提供了雙重保障。