基于STM32的智能快递柜设计

🤞🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是智能快递柜

设计的详细功能见网盘中的文章《19、基于STM32的智能快递柜设计》:

链接:https://pan.baidu.com/s/1uWSZX2zbZwy9sYwwnvyktQ?pwd=5132

提取码:5132

 目录

1、系统功能

2、演示视频和实物

3、系统设计框图

4、软件设计流程图

5、原理图

6、主程序

7、总结


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 *)&currentDataPoint, 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 *)&currentDataPoint);   //后台处理,必须放在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接收消息和发送指令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

5132单片机设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值