STM32F4 系列智能快递柜主控程序方案
STM32F4 系列智能快递柜主控程序方案,适合 STM32F407 / F429 等主控。
一、快递柜系统总体架构
1、硬件组成
| 模块 | 说明 |
|---|---|
| MCU | STM32F407ZGT6 / F429 |
| 存储 | SPI Flash / EEPROM |
| 显示 | 4.3 寸 TFT / LCD |
| 输入 | 触摸 / 按键 / 矩阵键盘 |
| 通信 | 4G / WiFi / Ethernet |
| 锁控 | 电磁锁 / 电控锁 |
| 识别 | 二维码 / IC 卡 / 摄像头 |
| 电源 | 12V → DC-DC → 5V / 3.3V |
| 安防 | 门磁 / 光耦检测 |
2、软件架构
┌──────────────┐
│ APP层 │ 业务(存件/取件/远程)
├──────────────┤
│ Service层 │ 用户 / 订单 / 锁控
├──────────────┤
│ Driver层 │ UART / LCD / Lock
├──────────────┤
│ HAL/BSP层 │ STM32 HAL
└──────────────┘
二、核心功能拆解
本地存件
动态二维码取件
远程服务器开箱
异常报警(门未关、暴力开箱)
掉电保存订单
多格口管理(A01–D99)
三、核心数据结构设计
1、柜格结构体
typedef enum
{
BOX_IDLE = 0,
BOX_USED,
BOX_FAULT
} BoxStatus;
typedef struct
{
uint8_t box_id; // 格口号 1~N
BoxStatus status; // 状态
char order_id[24]; // 订单号
char phone[12]; // 手机号
uint32_t expire_time; // 过期时间
} BoxInfo_t;
2、系统全局变量
#define MAX_BOX_NUM 48
BoxInfo_t BoxList[MAX_BOX_NUM];
uint8_t Online_Flag = 0;
四、锁控驱动
1、锁控 IO 定义
#define LOCK_GPIO_PORT GPIOE
#define LOCK_PIN_START GPIO_Pin_0
void Lock_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStruct.GPIO_Pin = 0xFFFF; // PE0~PE15
GPIO_Init(GPIOE, &GPIO_InitStruct);
}
2、单路开锁函数
void Lock_Open(uint8_t box_id)
{
uint16_t pin = (1 << (box_id % 16));
GPIO_SetBits(LOCK_GPIO_PORT, pin);
Delay_ms(300); // 脉冲宽度
GPIO_ResetBits(LOCK_GPIO_PORT, pin);
}
3、门磁检测
uint8_t Door_Check(uint8_t box_id)
{
return GPIO_ReadInputDataBit(DOOR_PORT, door_pin[box_id]);
}
五、通信协议(服务器 ↔ 柜机)
1、JSON 示例
服务器下发开箱
{
"cmd": "open_box",
"box_id": 12,
"order_id": "20260108123456"
}
柜机上报状态
{
"cmd": "status",
"box_id": 12,
"status": "opened"
}
2、4G/WiFi 通信接口
void Net_Send(char *json)
{
HAL_UART_Transmit(&huart3, (uint8_t*)json, strlen(json), 100);
}
六、业务主逻辑
void Task_Delivery(void)
{
uint8_t box_id = Find_Empty_Box();
if(box_id == 0) return;
Generate_Order(box_id);
Save_To_Flash(box_id);
QRCode_Show(order_id);
Lock_Open(box_id);
}
void Task_Pickup(char *order_id)
{
uint8_t box_id = Find_By_Order(order_id);
if(box_id == 0) return;
Lock_Open(box_id);
Clear_Box(box_id);
}
参考代码 stm32F4 快递柜的主控程序 www.youwenfan.com/contentcnv/72893.html
七、掉电保护
订单写入 SPI Flash
上电自检恢复订单
防止掉电丢件
void Save_All_Box(void)
{
W25Q_Write((uint8_t*)BoxList, BOX_ADDR, sizeof(BoxList));
}
八、异常与安全处理
| 异常 | 处理方式 |
|---|---|
| 门未关 | 蜂鸣 + 上传告警 |
| 暴力开箱 | 锁定柜机 |
| 通信失败 | 本地缓存订单 |
| 非法扫码 | 拒绝并记录 |
九、FreeRTOS 任务划分
osThreadNew(Task_LockCtrl, NULL, &LockTask_attr);
osThreadNew(Task_Network, NULL, &NetTask_attr);
osThreadNew(Task_UI, NULL, &UITask_attr);
osThreadNew(Task_Monitor, NULL, &MonTask_attr);

浙公网安备 33010602011771号