🤞🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是智能快递柜。
设计的详细功能见网盘中的文章《19、基于STM32的智能快递柜设计》:
链接:https://pan.baidu.com/s/1uWSZX2zbZwy9sYwwnvyktQ?pwd=5132
提取码:5132
目录
1、系统功能
1、主控采用STM32F03C8T6。
2、采用ESP8266-0S作为WIFI模块连接云平台,实现远程开柜。
3、采用RFID射频模块(MFRC522 )卡片实现开关柜门。
4、采用舵机模拟开关柜门。
5、采用矩阵键盘实现密码开柜。
2、演示视频和实物
智能快递柜
3、系统设计框图
4、软件设计流程图
5、原理图
6、主程序
#include "sys.h" //有需求和定制的,可以联系VX:lwfw123456789
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "MFRC522.h"
/***********************************************************************************************
同学好!我们是5132单片机设计,定制单片机设计,实物和说明书均可定制,欢迎大家咨询。VX:lwfw123456789
其他项目演示视频和说明请大家移步哔哩哔哩、CSDN和公众号等。
哔哩哔哩:5132单片机设计
CSDN: 5132单片机设计
公众号: 5132单片机设计
抖音 : 5132单片机设计
小红书: 5132单片机设计
咸鱼: 5132单片机设计
************************************************************************************************/
#define mima1 208062
#define mima2 213583
unsigned char buf[20]; //存放卡序号
volatile unsigned char FlagKeyPress = 0; //有键按下标志,处理完毕清0
uint8_t KeyNum;
uint32_t mima; //单价,长整型值,单位为分
//存储按键值
uint32_t bufe[10]; //存储传感器采集的数据
//存放温湿度
u8 state, state2 = 2, state2_1, state3; //按键状态标志
u8 t = 0; //传感器读取时间间隔
u8 flag; //远程控制标志
u8 flag2 = 0, flag1, flag3;
uint16_t RTC_Time[] = {0, 0, 0};
uint16_t RTC_Time1[] = {7, 0, 0}; //定时时间---开
uint16_t RTC_Time2[] = {19, 0, 0}; //定时时间---关
u8 T_state, T_state1, qingping = 1, state_dingshi_yu_guan, state_dingshi_yu_kai, state_dingshi_yu_switch, state3_1;
extern void TimeRead();
extern void ChuangGan(void);
void MY_Gizwits_Init(void) //机智云初始化函数
{
TIM3_Int_Init(9, 7199); //1MS系统定时
usart3_init(9600);//WIFI初始化
memset((uint8_t *)¤tDataPoint, 0, sizeof(dataPoint_t)); //设备状态结构体初始化
gizwitsInit();//环形缓冲区初始化
gizwitsSetMode(2); //设置模式
userInit();
}
void KeyPress(unsigned char keycode)
{
switch (keycode)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
if (mima < 999999)
{
mima = (mima) * 10 + keycode;
OLED_Clear();
delay_ms(10);
}
break;
case 10:
{
switch (mima)
{
case 111111:
Servo_SetAngle1(90);
Buzzer_ON();
delay_ms(300);
Buzzer_OFF();
mima = 0;
break;
case 222222:
Servo_SetAngle2(90);
Buzzer_ON();
delay_ms(300);
Buzzer_OFF();
mima = 0;
break;
case 333333:
Servo_SetAngle3(90);
Buzzer_ON();
delay_ms(300);
Buzzer_OFF();
mima = 0;
break;
default :
break;
}
}
break;
case 11: //删除键
if (mima <= 999999)
{
mima = (mima) / 10;
delay_ms(10);
}
OLED_Clear();
break;
case 12: //清零键
mima = 0;
delay_ms(10);
OLED_Clear();
break;
case 15: //清零键
Servo_SetAngle1(0);
Servo_SetAngle2(0);
Servo_SetAngle3(0);
break;
default :
break;
}
}
int main(void)
{
unsigned char status; //返回符
unsigned int temp, i;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
Buzzer_Init(); //下面为外设初始化
OLED_Init();
MyRTC_Init();
Servo_Init(); //舵机初始化,并设置舵机初始角度
MY_Gizwits_Init(); //机智云初始化
MFRC522_Init();
TIM4_Int_Init(999, 71999);
MatrixKey_Init();
Servo_SetAngle1(90);
Servo_SetAngle2(90);
Servo_SetAngle3(90);
Buzzer_ON();
delay_ms(300);
Buzzer_OFF();
delay_ms(300);
Servo_SetAngle1(0);
Servo_SetAngle2(0);
Servo_SetAngle3(0);
while (1)
{
OLED_ShowChinese(2, 2, 78);
OLED_ShowChinese(2, 3, 79);
OLED_ShowChinese(2, 4, 80);
OLED_ShowChinese(2, 5, 81);
OLED_ShowChinese(2, 6, 82);
OLED_ShowChinese(3, 1, 83);
OLED_ShowChinese(3, 2, 84);
OLED_ShowString(3, 5, ":");
userHandle(); //数据上传
gizwitsHandle((dataPoint_t *)¤tDataPoint); //后台处理,必须放在while里
TimeRead();
KeyNum = MatrixKey_GetValue();
OLED_ShowNum(3, 6, mima, 6);
if ((KeyNum < 17) && (FlagKeyPress == 0))
{
FlagKeyPress = 1;
KeyPress(KeyNum);
FlagKeyPress = 0;
delay_ms(300);
}
status = MFRC522_Request(PICC_REQALL, buf);//寻卡
if (status != MI_OK)
{
MFRC522_Reset();
MFRC522_AntennaOff();
MFRC522_AntennaOn();
continue;
}
printf("卡的类型:");
for (i = 0; i < 2; i++)
{
temp = buf[i];
printf("%X", temp);
}
status = MFRC522_Anticoll(buf);//防冲突
if (status != MI_OK)
{
continue;
}
for (i = 0; i < 4; i++)
{
temp = temp * 10 + buf[i];
}
if (temp == (mima1))
{
Servo_SetAngle1(90);
Buzzer_ON();
delay_ms(300);
Buzzer_OFF();
}
if (temp == (mima2))
{
Servo_SetAngle2(90);
Buzzer_ON();
delay_ms(300);
Buzzer_OFF();
}
}
}
void TimeSet() //设置时间
{
if (KeyNum == 2) //PB10
{
delay_ms(20);
if (KeyNum == 2)
{
T_state++;
if (T_state > 2)
{
T_state = 0;
}
}
}
if (T_state == 0) //时间显示模式
{
MyRTC_ReadTime();
OLED_ShowNum(1, 5, MyRTC_Time[3], 2); //时
OLED_ShowString(1, 7, ":");
OLED_ShowNum(1, 8, MyRTC_Time[4], 2); //分
OLED_ShowString(1, 10, ":");
OLED_ShowNum(1, 11, MyRTC_Time[5], 2); //秒
RTC_Time[0] = MyRTC_Time[3];
RTC_Time[1] = MyRTC_Time[4];
RTC_Time[2] = MyRTC_Time[5];
}
if (T_state == 1) //修改时间
{
if (KeyNum == 5)
{
delay_ms(20);
if (KeyNum == 5)
{
T_state1++;
if (T_state1 > 2)
{
T_state1 = 0;
}
}
}
if (T_state1 == 0) //修改时
{
if (KeyNum == 4)RTC_Time[0]++;
if (KeyNum == 3)RTC_Time[0]--;
if (RTC_Time[0] > 23 & RTC_Time[0] < 100)RTC_Time[0] = 0;
if (RTC_Time[0] > 100)RTC_Time[0] = 23;
OLED_ShowNum(1, 5, RTC_Time[0], 2); //时
}
if (T_state1 == 1) //修改分
{
if (KeyNum == 4)RTC_Time[1]++;
if (KeyNum == 3)RTC_Time[1]--;
if (RTC_Time[1] > 59 & RTC_Time[1] < 100)RTC_Time[1] = 0;
if (RTC_Time[1] > 100)RTC_Time[1] = 59;
OLED_ShowNum(1, 8, RTC_Time[1], 2); //时
}
if (T_state1 == 2) //修改秒
{
if (KeyNum == 4)RTC_Time[2]++;
if (KeyNum == 3)RTC_Time[2]--;
if (RTC_Time[2] > 59)RTC_Time[2] = 0;
if (RTC_Time[2] > 59 & RTC_Time[2] < 100)RTC_Time[2] = 0;
if (RTC_Time[2] > 100)RTC_Time[2] = 59;
OLED_ShowNum(1, 11, RTC_Time[2], 2); //时
}
}
if (T_state == 2)
{
MyRTC_Time[3] = RTC_Time[0];
MyRTC_Time[4] = RTC_Time[1];
MyRTC_Time[5] = RTC_Time[2];
MyRTC_SetTime();
T_state = 0;
}
}
void TimeRead()
{
MyRTC_ReadTime();
OLED_ShowNum(1, 5, MyRTC_Time[3], 2); //时
OLED_ShowString(1, 7, ":");
OLED_ShowNum(1, 8, MyRTC_Time[4], 2); //分
OLED_ShowString(1, 10, ":");
OLED_ShowNum(1, 11, MyRTC_Time[5], 2); //秒
}
7、总结
本设计硬件设计部分由主控制器STM32、射频模块、舵机、矩阵按键、显示、蜂鸣器和WIFI模块组成。能实现自动、远程和手动控制,并能通过手机APP接收消息和发送指令。