这个基于STM32F103单片机的自动售卖机系统,是我在指导电子类专业毕业设计时经常推荐的一个经典课题。它完整涵盖了嵌入式系统开发的各个环节,从传感器数据采集、人机交互到无线通信,特别适合作为学生从理论学习到工程实践的过渡项目。
系统最核心的创新点在于将传统自动售货机的"按键选择商品"模式,改进为"称重计费"模式。这种设计特别适合售卖散装商品(如蔬菜水果)的场景,解决了按重量计价的实际需求。我在实际测试中发现,相比固定价格的商品柜,这种设计能减少约30%的操作步骤,显著提升用户体验。
硬件架构上采用了模块化设计思路:
关键设计要点:所有模块的供电需要统一考虑,称重模块对电源噪声敏感,建议与数字电路分开供电。我在初期测试时曾因电源干扰导致称重数据波动达±5g,后来采用LC滤波电路后稳定在±1g以内。
选择STM32F103C8T6主要基于三点考量:
实际开发中发现,该芯片的GPIO驱动能力有限,直接驱动TFT屏会出现刷新迟滞。后来改为FSMC接口驱动,刷新率从8fps提升到35fps,这是值得注意的优化点。
HX711模块的实战应用有几个技术要点:
c复制// 示例代码:HX711数据采集处理
#define SAMPLE_NUM 10
uint32_t Read_HX711(void) {
uint32_t buffer[SAMPLE_NUM];
for(int i=0; i<SAMPLE_NUM; i++){
buffer[i] = HX711_Read();
delay_ms(5);
}
qsort(buffer, SAMPLE_NUM, sizeof(uint32_t), compare);
return buffer[SAMPLE_NUM/2]; // 取中值
}
经过三次迭代改进的交互流程:
采用有限状态机(FSM)模型,定义5个主要状态:
状态转换条件通过事件驱动:
mermaid复制stateDiagram-v2
[*] --> IDLE
IDLE --> WEIGHING: 重量>10g
WEIGHING --> PRICING: 按确认键
PRICING --> PAYMENT: 按结算键
PAYMENT --> COMPLETE: 支付成功
COMPLETE --> IDLE: 5秒超时
支持三种计价模式:
算法核心代码示例:
c复制float Calculate_Price(float weight, uint8_t mode) {
switch(mode) {
case 0: // 单价模式
return weight * unit_price;
case 1: // 阶梯价
if(weight < 500) return weight * price1;
else if(weight < 1000) return weight * price2;
else return weight * price3;
case 2: // 打包价
return weight > threshold ? pack_price : weight * unit_price;
}
}
采用开源库qrcode_gen移植方案:
优化后方案:
配网流程的可靠性优化:
配网成功率对比:
关键代码片段:
c复制void WiFi_Config(void) {
ESP8266_Init();
while(!ESP8266_AirkissStart()){
LED_Blink(200); // 配网状态提示
}
Save_SSID_Password();
}
模拟支付系统包含三个组件:
数据交互协议:
json复制{
"device_id": "VEND001",
"amount": 15.5,
"timestamp": 1634567890,
"status": 0
}
安全措施:
采用两点校准法:
校准公式:
code复制实际重量 = (当前AD值 - 零点AD值) × (标准重量 / (满量程AD值 - 零点AD值))
常见问题处理:
通过以下措施将待机功耗从85mA降至12mA:
功耗对比表:
| 模式 | 原始方案 | 优化方案 |
|---|---|---|
| 运行模式 | 150mA | 120mA |
| 待机模式 | 85mA | 12mA |
| 支付过程 | 210mA | 180mA |
现场测试发现的干扰源:
解决方案:
在实际应用中,这个基础框架还可以进一步扩展:
库存管理功能
人脸识别支付
能耗监控系统
这个项目最让我满意的部分是它的可扩展性——去年指导的学生在此基础上增加了温度监控模块,用来做智能冷链售卖柜,最终获得了优秀毕业设计。硬件开发就是这样,把一个基础项目做深做透,自然能衍生出更多创新应用。