> 文档中心 > 物联网毕设(STM32(Freertos)指纹模块+APP控制+云平台)

物联网毕设(STM32(Freertos)指纹模块+APP控制+云平台)


前言:这是我和盆友一起写的一个关于智能门禁系统的项目,我们也是经过了一两周的调试,也是完成了所以基础功能,虽然界面不是特别美观,但是只有实现了就行了,我们也没想要求有多高,就给大家展示一下这个做的玩的项目,我们会放一个百度云盘链接给大家,希望对大家有帮助啦,

特别鸣谢  我的小伙伴 啦

流程图

 

开发所需平台

keil5+Android studio

硬件使用

 

资料包

教程包

 APP与底层

百度网盘链接

链接:

网盘地址https://pan.baidu.com/s/1_X7ywOR4t_aH1jvA2vBuZg?pwd=heru

 
提取码:

        heru 

展示效果

部分代码展示

main

/  *  * @file    main.c  * @author  fire  * @version V1.0  * @date    2018-xx-xx  * @brief   FreeRTOS V9.0.0  + STM32 固件库例程  *  * @attention  *  * 实验平台:野火 STM32 全系列开发板   * 论坛    :http://www.firebbs.cn  * 淘宝    :https://fire-stm32.taobao.com  *    */  /* 包含的头文件/ /* FreeRTOS头文件 */#include "FreeRTOS.h"#include "task.h"//RT延迟函数#include "RT_Delay.h"//#include "bsp_SysTick.h"//网络协议层#include "onenet.h"//网络设备#include "esp8266.h"/* 开发板硬件bsp头文件 */#include "bsp_led.h"#include "bsp_usart.h"#include "bsp_key.h"//指纹模块#include "./as608/as608_test.h"#include "./as608/bsp_as608.h"//网络协议层#include "onenet.h"//步进电机#include "motor.h"//网络设备#include "esp8266.h"/ 任务句柄 //*  * 任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄 * 以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么 * 这个句柄可以为NULL。 */static TaskHandle_t AppTaskCreate_Handle = NULL;/* 创建任务句柄 */static TaskHandle_t Test_Task_Handle = NULL;/* LED任务句柄 */static TaskHandle_t KEY_Task_Handle = NULL;/* KEY任务句柄 *// 内核对象句柄 *//* * 信号量,消息队列,事件标志组,软件定时器这些都属于内核的对象,要想使用这些内核 * 对象,必须先创建,创建成功之后会返回一个相应的句柄。实际上就是一个指针,后续我 * 们就可以通过这个句柄操作这些内核对象。 * * 内核对象说白了就是一种全局的数据结构,通过这些数据结构我们可以实现任务间的通信, * 任务间的事件同步等各种功能。至于这些功能的实现我们是通过调用这些内核对象的函数 * 来完成的 *  *//* 全局变量声明 //* * 当我们在写应用程序的时候,可能需要用到一些全局变量。 *///主题设置char *Tips = "ESP";const char *topics[] = {"ESP"};extern uint8_t state;/* 函数声明/static void AppTaskCreate(void);/* 用于创建任务 */static void Test_Task(void* pvParameters);/* Test_Task任务实现 */static void KEY_Task(void* pvParameters);/* KEY_Task任务实现 */static void BSP_Init(void);/* 用于初始化板载相关资源 *//*  * @brief  主函数  * @param  无  * @retval 无  * @note   第一步:开发板硬件初始化      第二步:创建APP应用任务     第三步:启动FreeRTOS,开始多任务调度  /int main(void){  BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */    /* 开发板硬件初始化 */  BSP_Init();    printf("这是一个[野火]-STM32全系列开发板-FreeRTOS固件库实验!\n\n");/* 创建AppTaskCreate任务 */  xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  /* 任务入口函数 */   (const char*    )"AppTaskCreate",/* 任务名字 */   (uint16_t)1024,  /* 任务栈大小 */   (void*   )NULL,/* 任务入口函数参数 */   (UBaseType_t    )1, /* 任务的优先级 */   (TaskHandle_t*  )&AppTaskCreate_Handle);/* 任务控制块指针 */   /* 启动任务调度 */      if(pdPASS == xReturn)    vTaskStartScheduler();   /* 启动任务,开启调度 */  else    return -1;      while(1);   /* 正常不会执行到这里 */    }/*  * @ 函数名  : AppTaskCreate  * @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面  * @ 参数    : 无    * @ 返回值  : 无  /static void AppTaskCreate(void){  BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */    taskENTER_CRITICAL();    //进入临界区    /* 创建Test_Task任务 */  xReturn = xTaskCreate((TaskFunction_t )Test_Task, /* 任务入口函数 */   (const char*    )"Test_Task",/* 任务名字 */   (uint16_t)1024,   /* 任务栈大小 */   (void*   )NULL,/* 任务入口函数参数 */   (UBaseType_t    )2,    /* 任务的优先级 */   (TaskHandle_t*  )&Test_Task_Handle);/* 任务控制块指针 */  if(pdPASS == xReturn)    printf("创建MQTT_Task任务成功!\r\n");  /* 创建KEY_Task任务 */  xReturn = xTaskCreate((TaskFunction_t )KEY_Task,  /* 任务入口函数 */   (const char*    )"KEY_Task",/* 任务名字 */   (uint16_t)512,  /* 任务栈大小 */   (void*   )NULL,/* 任务入口函数参数 */   (UBaseType_t    )4, /* 任务的优先级 */   (TaskHandle_t*  )&KEY_Task_Handle);/* 任务控制块指针 */   if(pdPASS == xReturn)    printf("创建TOUCH_Task任务成功!\r\n");    vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务    taskEXIT_CRITICAL();     //退出临界区}/  * @ 函数名  : Test_Task  * @ 功能说明: Test_Task任务主体  * @ 参数    :     * @ 返回值  : 无  /static void Test_Task(void* parameter){ unsigned short timeCount = 0;//发送间隔变量unsigned char *dataPtr = NULL;unsigned short timeDoor = 0;//发送间隔变量ESP8266_Init();//初始化ESP8266while(OneNet_DevLink(Tips))//接入OneNETDelay_ms(500);   /* 延时500个tick */OneNet_Subscribe(topics, 1);while(1){Delay_ms(10);dataPtr = ESP8266_GetIPD(0);if(dataPtr != NULL){timeDoor=0;timeCount=0;OneNet_RevPro(dataPtr);}  timeDoor ++;timeCount ++;if(timeDoor >= 1500)//发送间隔{//心跳包while(OneNet_Publish( Tips , "KEEP:0"));//每十五秒询问查询一次门状态,自动关门timeDoor = 0;Door_Close(Tips);}if(timeCount >= 100 && state == 1)//发送间隔{//开门Door_ID_Open(Tips,state);timeCount = 0;}if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON )    {/* K1 被按下 */timeCount = 0;Mqtt_Task(Tips,2,0);/*比对指纹*/     }}}/  * @ 函数名  : Test_Task  * @ 功能说明: Test_Task任务主体  * @ 参数    :     * @ 返回值  : 无  /static void KEY_Task(void* parameter){/*测试STM32与指纹模块的通信*/Delay_ms(800);   /* 延时500个tick */Connect_Test();  while (1)  {Delay_ms(10);//printf("%d",state);    if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON )    {/* K2 被按下 *///printf("DOOR:%d\r\n",state);Compare_FR_MQTT(Tips);    }  }}/*  * @ 函数名  : BSP_Init  * @ 功能说明: 板级外设初始化,所有板子上的初始化均可放在这个函数里面  * @ 参数    :     * @ 返回值  : 无  */static void BSP_Init(void){/* * STM32中断优先级分组为4,即4bit都用来表示抢占优先级,范围为:0~15 * 优先级分组只需要分组一次即可,以后如果有其他的任务需要用到中断, * 都统一用这个优先级分组,千万不要再分组,切忌。 */NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );//SysTick_Init();/* LED 初始化 */LED_GPIO_Config();/* 串口初始化*/USART_Config();  Usart2_Init(115200); //串口2,驱动ESP8266用motor_configuration();      //步进电机//PB12,PB13,PB14,PB15/* 按键初始化*/Key_GPIO_Config(); /*初始化环形缓冲区*/rx_queue_init(); /*初始化指纹模块配置*/AS608_Config();}/END OF FILE/