基于STM32的儿童智能安全防护书包设计

一、前言

1.1 项目介绍

【1】项目功能介绍

随着社会的进步和科技的发展,儿童安全问题日益引起广泛关注。在日常生活中,尤其是在上学放学途中、户外活动时,儿童走失事件时有发生,给家庭和社会带来了极大的困扰和担忧。随着学业负担的增加,学生时常会因为忘记携带所需书籍而影响学习。如何利用现代技术手段提高儿童安全保障水平,并辅助他们培养良好的学习习惯,成为了一个待解决的社会需求。

基于此背景,当前设计并实现一款基于STM32F103RCT6微控制器为核心的儿童智能安全防护书包,显得尤为必要与实际。这款书包集成了先进的定位技术和无线通信模块,能够实时追踪并发送儿童的位置信息给家长,确保在紧急情况下快速响应 (发送短信的时候,直接通过GPS经纬度拼接百度地图的HTTP请求链接,家长收到短信可以直接打开链接,在网页查看百度地图上显示的具体位置,可以直接通过百度地图导航过去)。同时,具备智能化功能,如课程表录入存储与提醒系统,利用EEPROM(例如AT24C02)进行数据持久化存储,并通过RFID-RC522射频识别模块自动检测所携带书籍是否齐全,避免孩子因疏忽遗漏课本而耽误学习。

智能书包还配备了直观易读的1.44寸LCD显示屏,用于显示当前位置信息、当日课表以及未带书籍的提醒。当检测到缺少某本书籍时,蜂鸣器模块会发出声音警报,从而强化提醒效果,帮助学生养成有序整理个人物品的习惯。

这款基于STM32的儿童智能安全防护书包是一个集成物联网技术、GPS定位、无线通信和智能感知于一体的创新产品,提升儿童的安全防护等级,加强家校互动,促进学生自我管理能力的培养,充分体现了科技服务于生活、服务于教育的理念。

【2】设计实现的功能

(1)实时定位与紧急求助功能

  • 通过集成GPS模块,该智能书包能够实时获取并更新儿童的位置信息,并通过无线通信(GSM短信模块如Air724UG 4G)将位置数据发送给家长。当儿童在陌生环境中迷路或者遇到紧急情况时,只需按下求救按钮,系统立即向预设的家长手机发送包含当前位置信息的短信,方便家长迅速找到孩子。

(2)课程表管理与提醒功能

  • 设计有课程表录入存储模块,利用EEPROM芯片AT24C02进行非易失性数据存储,家长或学生可以预先将每日课程表输入到系统中。
  • 每天早上,书包会根据存储的课程表自动检查当天所需的书籍是否已放入书包内。通过射频识别RFID-RC522模块读取贴在书籍上的标签信息,若发现缺少某科书籍,则蜂鸣器会发出声音警报,同时LCD显示屏也会显示相应的提示信息,确保学生不会忘记携带必要的学习资料。

(3)可视化信息展示

  • 配备了1.44寸LCD显示屏,可实时显示当前地理位置信息、时间以及当日的课程表内容,使得学生和家长可以直观地查看重要信息。

这款基于STM32的儿童智能安全防护书包实现了儿童安全监护和学业辅助两大核心功能,既有助于保障孩子的安全出行,又能培养他们的自我管理和规划能力,体现了科技产品在教育领域的深度应用价值。

【3】项目硬件模块组成

(1)主控芯片

  • STM32F103RCT6微控制器作为整个系统的"大脑",负责控制和协调各个功能模块的运作,处理GPS定位数据、GSM短信通信、RFID识别信息等,并通过程序逻辑实现课程表管理、提醒以及数据显示等功能。

(2)定位模块

  • GPS模块,用于实时获取并更新儿童所在位置信息,确保家长可以随时查看孩子的位置状态。

(3)无线通信模块

  • Air724UG 4G GSM短信模块,提供远程通信能力,当发生紧急情况时,儿童可通过书包上的求救按钮触发发送带有位置信息的短信至预设的家长手机。

(4)存储模块

  • AT24C02 EEPROM芯片,用作非易失性存储器,存储孩子的课程表信息,即使在断电情况下也能保存数据不丢失。

(5)射频识别模块

  • RFID-RC522模块,配合贴在书籍上的RFID标签,检测书包内是否携带齐全当日所需的书籍资料,如果发现缺少书籍,会触发报警提示。

(6)报警提示模块

  • 高电平触发的蜂鸣器模块,在检测到未带书籍或其它异常情况时,通过发出声音警报来提醒学生。

(7)显示模块

  • 采用1.44寸LCD显示屏,实时展示当前位置、时间、当天课表及未带书籍等重要信息,方便用户直观了解当前状况。

【3】功能总结

基于STM32的儿童智能安全防护书包设计

(1)定位模块:定位模块实时获取儿童位置信息,能够家长在放学时找到儿童位置,或者丢失时及时查找儿童的位置。 (2)GSM短信模块:儿童如果意识到自己走丢,就可以按下求救按钮发送位置短信给家长,进而使家长尽快找到儿童位置 (3)课程表录入存储模块:将每天的课程表录入系统,以便提醒学生第二天要带什么书籍。(eeprom) (4)射频识别模块:将每一科的书籍贴上标签再与系统中的课表进行对比,如果检测到当天某一科书本没有带,蜂鸣器会响,呼吸灯会亮。(RFID) (5)显示模块:LCD屏显示实时位置课表信息以及提示没有带的书籍。

硬件选型:

(1)主控芯片采用STM32F103RCT6

(2)定位模块采用: GPS模块

(3)短信发送模块采用 Air724UG 4G

(4)存储模块采用AT24C02

(5)射频识别模块采用RFID-RC522

(6)报警提示采用高电平触发的蜂鸣器模块

(7)显示屏采用1.44寸LCD显示屏

1.2 设计思路

(1)需求分析阶段

  • 对目标用户群体(儿童与家长)的需求进行深入研究和理解,确定主要功能点:儿童安全定位、紧急求助、课程表管理与提醒、书籍携带检测等。

(2)系统架构设计

  • 根据需求,选择STM32F103RCT6作为主控芯片,因其具有强大的处理能力、丰富的外设接口及低功耗特性,能够满足项目所需的复杂计算任务和多模块协调工作。

(3)功能模块划分

  • 定位模块设计采用GPS接收器,实时获取并解析位置信息。
  • 无线通信模块选用4G GSM短信模块Air724UG,实现实时位置信息的远程发送和接收紧急求助信号。
  • 数据存储模块使用EEPROM AT24C02,确保课程表数据的安全可靠存储。
  • 为实现书籍携带检测,利用RFID-RC522射频识别模块,结合预置在书籍上的RFID标签,自动识别书包内书籍是否齐全。
  • 报警提示模块通过高电平触发的蜂鸣器来发出声音警告,提醒学生遗漏书籍。
  • 显示模块配备1.44寸LCD显示屏,直观展示位置信息、课程表以及未带书籍的提醒。

(4)软硬件协同设计

  • 硬件方面,合理布局各模块,优化电源管理,确保设备稳定运行;软件方面,编写高效的嵌入式程序,实现对各个硬件模块的控制和交互,包括GPS数据解析、GSM通信协议栈开发、RFID读取与比对算法、数据显示逻辑等。

(5)人机交互设计

  • 设计简洁易用的界面和操作流程,如一键求救按钮、清晰的课程表显示、直观的报警提示等,便于儿童和家长快速理解和操作。

1.3 系统功能总结

功能模块 功能描述
定位模块(GPS) 实时获取并更新儿童地理位置信息,通过无线通信模块发送至家长设备,以便家长随时掌握孩子位置动态。
短信通信模块(GSM) 儿童在紧急情况下按下求救按钮,系统通过4G GSM模块向预设的家长手机号码发送包含定位信息的短信进行求助。
课程表管理模块(EEPROM) 学生或家长可以录入每日课程表至系统中,利用AT24C02 EEPROM芯片存储数据,确保断电后仍能保留课程信息。
书籍检测模块(RFID) 通过RFID-RC522射频识别模块读取书本上的标签信息,自动比对与当日课表要求的书籍是否齐全,如有遗漏则触发报警提示。
报警提示模块(蜂鸣器) 当检测到学生未携带某科书籍或发生其他异常情况时,高电平触发的蜂鸣器会发出声音警告提醒学生。
显示模块(LCD显示屏) 配备1.44寸LCD显示屏实时显示当前位置、时间、当天课程表以及未带书籍的提示信息,方便学生查看和确认。

1.4 开发工具的选择

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是有点不适应界面的。

二、代码设计

2.1 GPS解析代码

基于STM32 HAL库进行GPS NMEA协议数据解析的代码

cpp 复制代码
#include "stm32f1xx_hal.h"
#include <string.h>
#include <stdio.h>

// GPS 数据结构体定义
typedef struct {
    char GPGGA[100]; // 用于存储GPGGA语句
    double latitude;  // 纬度
    double longitude; // 经度
    float UTC_time[7]; // UTC时间
    int fix_quality;   // 定位质量
    float hdop;       // 水平精度因子
} GPS_Data_TypeDef;

// 全局变量声明
GPS_Data_TypeDef GPS_Data;

// 串口接收缓冲区
uint8_t RxBuffer[256];

// GPS NMEA数据处理函数
void ProcessGPSData(void) {
    static uint8_t index = 0;
    
    // 从串口接收到的数据中查找特定的NMEA语句,例如GPGGA
    if (strstr((char*)RxBuffer, "$GPGGA")) {
        // 分割NMEA语句获取所需字段
        char *token;
        token = strtok((char*)RxBuffer, ",");
        
        while(token != NULL) {
            // 解析各字段
            if (/* 判断当前token是否为纬度 */) {
                GPS_Data.latitude = atof(token);
                // 考虑南北纬转换及格式化
            } else if (/* 判断当前token是否为经度 */) {
                GPS_Data.longitude = atof(token);
                // 考虑东西经转换及格式化
            } else if (/* 判断当前token是否为UTC时间 */) {
                // 处理时间信息
            }
            token = strtok(NULL, ",");
        }

        // 清空接收缓冲区以便下次接收新的数据
        memset(RxBuffer, 0, sizeof(RxBuffer));
        index = 0;
    }
}

// 串口中断服务函数
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; // 读取接收到的数据

        // 将接收到的数据添加到缓冲区,并检查是否有完整的NMEA句子结束符'\r\n'
        if (temp == '\n') { // 根据实际使用情况可能需要同时检测'\r'和'\n'
            RxBuffer[index++] = temp; // 添加换行符
            RxBuffer[index] = '\0'; // 字符串结束符
            ProcessGPSData(); // 调用解析函数
        } else if (index < (sizeof(RxBuffer)-1)) {
            RxBuffer[index++] = temp;
        }
    }
}

int main(void) {
    // 初始化系统时钟和USART1
    MX_GPIO_Init();
    MX_USART1_UART_Init();

    // 开启串口中断
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);

    while (1) {
        // 主循环
        // ...
    }
}

2.2 AT24C02存储代码

cpp 复制代码
#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;

    // 写入数据到EEPROM
    EEPROM_Write(address, data_to_write);

    // 从EEPROM读取数据
    data_read = EEPROM_Read(address);

    // 检查读取的数据
    if (data_read == data_to_write) {
        // 读取成功
    } else {
        // 读取失败
    }

    while (1) {
    }
}

2.3 RFID-RC522代码

STM32与RFID-RC522的交互涉及到很多步骤,包括初始化RFID模块、检测卡片、读取卡片信息、以及将这些信息存储起来。

cpp 复制代码
#include "stm32f10x.h"  
#include "SPI.h"  
#include "RFID.h"  
#include "usart.h" // 如果你使用了串口打印,可以包含这个头文件  
  
#define SS_PIN     PA4  // 根据你的连接修改这个引脚  
#define RST_PIN    PA3  // RFID模块的复位引脚  
  
RFID rfid(SS_PIN, RST_PIN); // 创建RFID对象  
  
uint8_t uid[5]; // 用于存储卡片的UID  
  
int main(void)  
{  
    SystemInit(); // 初始化系统  
    usart_init(115200); // 初始化串口,用于调试  
    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数组中  
            {  
                uid[i] = rfid.uid.uidByte[i];  
            }  
            // 可以在这里添加代码将uid存储到EEPROM、Flash或其他存储介质中  
            // 也可以通过串口打印UID进行调试  
            printf("Card UID: ");  
            for (uint8_t i = 0; i < rfid.uid.size; i++)  
            {  
                printf("%02X ", uid[i]);  
            }  
            printf("\r\n");  
        }  
        HAL_Delay(100); // 延时一段时间,避免过度占用CPU  
    }  
}

2.4 Air724UG 4G代码

使用STM32的HAL库和USART外设(串口)与Air724UG 4G模块进行通信。通过UART_SendString()函数可以发送字符串到串口,通过GSM_SendCommand()函数可以向4G模块发送AT指令。

main()函数中,设置短信格式为文本模式,设置短信接收方号码,发送短信内容。

cpp 复制代码
#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发送完成回调函数
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    // UART接收完成回调函数
}

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("\r\n");
    HAL_Delay(100); // 等待响应
}

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"); // 设置短信格式为文本模式
    GSM_SendCommand("AT+CMGS=\"+86"); // 设置短信接收方号码
    GSM_SendCommand(phone_number);
    GSM_SendCommand("\"");

    // 发送短信内容
    GSM_SendCommand(message);
    HAL_UART_Transmit(&huart1, (uint8_t)26, 1, HAL_MAX_DELAY); // 发送Ctrl+Z结束符

    while (1) {
    }
}

void SystemClock_Config(void) {
    // 系统时钟配置
}

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);
}

三、总结

基于STM32的儿童智能安全防护书包设计通过先进的技术手段,为儿童的安全提供全方位的保障。本项目融合了GPS定位、GSM短信通信、EEPROM存储、RFID射频识别以及LCD显示等多项功能,力求在儿童的日常生活和学习中提供便捷与安全。

通过GPS模块,书包能够实时追踪儿童的位置,让家长随时了解孩子的行踪,确保在关键时刻能够迅速找到孩子。而GSM短信模块则为儿童提供了一个紧急求助的途径,一旦孩子意识到自己走丢或有其他紧急情况,只需按下求救按钮,即可将位置信息以短信的形式发送给家长,从而迅速获得帮助。

在学习方面,本项目通过EEPROM存储模块实现了课程表的录入与存储功能。儿童或家长可以将每天的课程表录入系统,书包便会在需要时提醒孩子携带相应的书籍。而RFID射频识别模块则负责检测书包内是否已携带当天所需的各科书本。如果检测到某一科书本缺失,书包上的蜂鸣器会发出警报声,呼吸灯也会亮起,以提醒孩子及时补充。

此外,本项目还采用了一块1.44寸的LCD显示屏,用于实时显示儿童的位置信息、课表内容以及未携带书籍的提示信息。这使得儿童在使用书包的过程中能够随时了解自己的位置和当天的学习任务,为他们的安全和学习提供了双重保障。

相关推荐
2401_882727573 小时前
低代码配置式组态软件-BY组态
前端·后端·物联网·低代码·前端框架
追逐时光者4 小时前
.NET 在 Visual Studio 中的高效编程技巧集
后端·.net·visual studio
大梦百万秋4 小时前
Spring Boot实战:构建一个简单的RESTful API
spring boot·后端·restful
斌斌_____5 小时前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
路在脚下@5 小时前
Spring如何处理循环依赖
java·后端·spring
海绵波波1076 小时前
flask后端开发(1):第一个Flask项目
后端·python·flask
小奏技术7 小时前
RocketMQ结合源码告诉你消息量大为啥不需要手动压缩消息
后端·消息队列
AI人H哥会Java8 小时前
【Spring】控制反转(IoC)与依赖注入(DI)—IoC容器在系统中的位置
java·开发语言·spring boot·后端·spring
凡人的AI工具箱9 小时前
每天40分玩转Django:Django表单集
开发语言·数据库·后端·python·缓存·django
奔跑草-9 小时前
【数据库】SQL应该如何针对数据倾斜问题进行优化
数据库·后端·sql·ubuntu