一、项目概述
随着外卖行业的快速发展,如何高效、安全地存取外卖成为一个亟待解决的问题。本项目旨在设计一个基于STM32单片机的智能外卖存取系统,通过短信验证、密码输入和舵机控制等功能,提升外卖存取的安全性和便捷性。
项目目标与用途
本项目的目标是构建一个能够自动存取外卖的智能柜,用户通过手机短信进行身份验证,确保只有授权用户才能访问柜内外卖。该系统的主要用途包括:
-
安全性:通过短信验证和密码输入,防止未授权访问。
-
便捷性:用户可以随时通过手机远程控制柜门,方便快速取餐。
-
管理性:可以记录外卖取件情况,便于管理和统计。
解决的问题与带来的价值
本项目解决了外卖存取过程中的安全和便捷性问题,极大地提高了用户体验。同时,智能外卖柜可以在高峰期减轻外卖员的工作负担,提高外卖配送的效率。
二、系统架构
系统架构设计
本系统的架构设计包括硬件组件和软件组件的合理组合。以下是系统组件及其功能:
-
STM32单片机:负责系统的整体控制和逻辑处理。
-
GSM模块:实现短信的发送和接收。
-
OLED显示屏:显示系统状态和用户提示信息。
-
矩阵键盘:用于用户输入密码和控制指令。
-
舵机:控制外卖柜门的开关。
-
按键:实现简单的人机交互。
-
电源模块:提供系统所需的稳定电源。
-
蜂鸣器:提供声音提示。
技术栈选择
-
单片机:选择STM32F103,具有较高的性能和丰富的外设接口。
-
通信协议:UART用于GSM模块的通信,I2C用于OLED显示屏,GPIO和PWM用于键盘和舵机控制。
-
开发环境:使用STM32CubeIDE进行软件开发。
三、环境搭建
所需的软件和硬件环境
-
硬件:
-
STM32F103单片机
-
SIM800L GSM模块
-
OLED显示屏 (0.96英寸)
-
4x4矩阵键盘
-
SG90舵机
-
蜂鸣器
-
电源模块
-
按键
-
-
软件:
-
STM32CubeIDE
-
Keil MDK(可选)
-
C/C++编译环境
-
环境安装步骤与配置
-
安装STM32CubeIDE:
-
从ST官方网站下载并安装STM32CubeIDE。
-
根据安装向导完成配置。
-
-
创建新项目:
-
打开STM32CubeIDE,选择“新建STM32项目”。
-
选择STM32F103系列芯片,配置项目名称和路径。
-
-
配置外设:
-
在STM32CubeMX中,启用GPIO、UART、I2C等外设。
-
根据硬件连接配置引脚。
-
-
编译工具链:
- 确保在项目属性中选择正确的编译器版本。
配置示例与注意事项
-
引脚配置:
-
确保GSM模块、OLED、矩阵键盘等连接到正确的引脚。
-
检查电源模块是否提供合适的电压和电流。
四、代码实现
功能模块逐步实现
短信验证模块
短信验证模块的主要功能是通过GSM模块接收短信,并根据短信内容进行身份验证。本模块会解析收到的短信,从中提取出用户发送的指令,并进行相应的操作。
代码实现
以下是短信验证模块的代码实现,包括初始化GSM模块、接收短信、解析短信内容以及进行身份验证的过程。
#include "string.h"
#include "stdio.h"
// GSM模块的UART句柄
extern UART_HandleTypeDef huart1;
// 短信接收缓冲区
char sms_buffer[160];
// 函数声明
void GSM_Receive_SMS(void);
bool VerifyPassword(char *input);
void OpenCabinet(void);
void SendSMS(char *message);
// 短信接收与解析
void GSM_Receive_SMS(void) {
// 清空接收缓冲区
memset(sms_buffer, 0, sizeof(sms_buffer));
// 使用UART接收短信
HAL_UART_Receive(&huart1, (uint8_t *)sms_buffer, sizeof(sms_buffer), HAL_MAX_DELAY);
// 打印接收到的短信(调试用)
printf("Received SMS: %s\n", sms_buffer);
// 检查短信内容是否包含"OPEN"
if (strstr(sms_buffer, "OPEN") != NULL) {
// 提取密码
char *password = strtok(sms_buffer, " "); // 假设密码跟在"OPEN"后面
password = strtok(NULL, " "); // 获取密码
if (VerifyPassword(password)) {
OpenCabinet(); // 密码验证成功,打开柜门
SendSMS("柜门已打开"); // 反馈短信给用户
} else {
SendSMS("密码错误,请重试"); // 反馈短信给用户
}
} else {
SendSMS("无效指令"); // 反馈短信给用户
}
}
// 验证密码
bool VerifyPassword(char *input) {
const char *correct_password = "1234"; // 设定正确的密码
return strcmp(input, correct_password) == 0; // 比较输入的密码与正确密码
}
// 打开柜门
void OpenCabinet(void) {
// 控制舵机打开柜门
SetServoAngle(90); // 将舵机转到90度位置
HAL_Delay(5000); // 开门5秒钟
CloseCabinet(); // 5秒后关闭柜门
}
// 关闭柜门
void CloseCabinet(void) {
SetServoAngle(0); // 将舵机转回0度位置
}
// 发送短信反馈给用户
void SendSMS(char *message) {
char command[160];
sprintf(command, "AT+CMGS=\"%s\"\r\n", "用户手机号"); // 更改为实际手机号
HAL_UART_Transmit(&huart1, (uint8_t *)command, strlen(command), HAL_MAX_DELAY);
HAL_Delay(100); // 等待回复
HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), HAL_MAX_DELAY);
HAL_UART_Transmit(&huart1, (uint8_t *)"\x1A", 1, HAL_MAX_DELAY); // 发送结束符
}
模块功能说明
-
GSM模块初始化:在主程序中,需要确保GSM模块已经初始化并能够进行UART通信。通过
HAL_UART_Receive
函数接收来自GSM模块的短信。 -
短信内容解析:接收到的短信存储在
sms_buffer
中,通过strstr
函数查找指令关键词“OPEN”。如果找到,则提取后续的密码。 -
密码验证:使用
VerifyPassword
函数将提取的密码与预设的正确密码进行比较,返回验证结果。 -
开门操作:如果密码正确,调用
OpenCabinet
函数,控制舵机打开柜门,并发送短信反馈给用户;如果密码错误,则发送相应的错误提示。 -
发送短信反馈:通过
SendSMS
函数将相应的反馈信息发送给用户,确保用户能够了解操作结果。
五、项目总结
本项目通过对基于STM32单片机的智能外卖存取系统的设计与实现,成功构建了一个安全、便捷的外卖存取解决方案。项目主要功能包括短信验证、密码输入、舵机控制以及用户界面展示,充分利用了硬件模块的特性,实现了系统的整体功能。
主要功能回顾
-
短信验证模块:通过GSM模块实现外卖员与顾客之间的通信,保障取餐的安全性。
-
密码输入模块:用户通过矩阵键盘输入密码,系统进行实时验证,提升安全性。
-
舵机控制模块:实现柜门的开关控制,用户体验良好。
-
用户界面模块:通过OLED显示屏展示系统状态,方便用户操作。