物联网毕设(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/