【开源】LVGL+FreeRTOS 基于STM32F411CEU6的健康助手项目制作

视频演示

【开源】LVGL+FreeRTOS 基于STM32F411的智能健康助手小项目

网盘链接在最底下!!!无套路!!!直接分享!!! 


 硬件介绍

  1. STM32F411CEU6 主控

  2. TFT 1.8inch 显示屏

  3. DTH11 温湿度传感器

  4. HC-05 蓝牙模块

  5. 蜂鸣器模块

  6. Max30102 心率血氧传感器

  7. XGZP6847A 压力传感器

  8. 波轮按键+独立按键

  9. MPU6050 陀螺仪模块


技术栈

STM32

  1. SPI协议驱动

  2. I2C协议驱动

  3. PWM控制

  4. UART串口协议驱动

  5. ADC模数转换

FreeRTOS

  1. 任务创建

  2. 队列

  3. 事件

  4. 二值信号量

  5. 互斥信号量

  6. 临界区保护

LVGL

  1. 图片按钮

  2. Label标签显示

  3. 多界面切换

  4. 进度条

  5. 开关


代码框架

  1. Hardware+MPU6050:STM32硬件驱动相关的文件

  2. FreeRTOS/User:创建的任务

  3. GUI_Page:为我们创建的页面

User_Task_Init.c

中创建了任务和使用到的其他freertos相关的功能

#include "User_Task_Init.h"/*FreeRTOS创建任务句柄*/
TaskHandle_t AppTaskCreate_Handle = NULL;/* 创建任务句柄 */
TaskHandle_t LVGL_Task_Handle = NULL;/* 创建任务句柄 */
TaskHandle_t WDG_task_Handle = NULL;/* 创建任务句柄 */TaskHandle_t Sensor_Data_Update_Task_Handle = NULL;/* 创建任务句柄 */
TaskHandle_t Key_Task_Handle = NULL;/* 创建任务句柄 */
TaskHandle_t Heart_Data_Update_task_Handle = NULL;/* 创建任务句柄 */
TaskHandle_t UI_Page_Switch_task_Handle = NULL;/* 创建任务句柄 */
TaskHandle_t key_task_Handle = NULL;/* 创建任务句柄 */
/*FreeRTOS创建队列句柄*/
QueueHandle_t Senser_Queue =NULL;
QueueHandle_t Key_Queue =NULL;
/*FreeRTOS创建二值信号量*/
SemaphoreHandle_t Page_Switch_BinarySem = NULL;
/*FreeRTOS创建事件*/
EventGroupHandle_t WDG_Event_Handle = NULL;
/*FreeRTOS一些宏定义*//*FreeRTOS任务函数声明*/
static void AppTaskCreate(void);
void WDG_task(void const * argument);void FreeRTOS_Task_Init(void)
{BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS *//* 创建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();   /* 启动任务,开启调度 */elsereturn -1;  
}/************************************************************************ @ 函数名  : AppTaskCreate* @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面* @ 参数    : 无  * @ 返回值  : 无**********************************************************************/
static void AppTaskCreate(void)
{BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */char buf[64];taskENTER_CRITICAL();           //进入临界区Senser_Queue = xQueueCreate((UBaseType_t ) 20,/* 消息队列的长度 */ (UBaseType_t ) sizeof(SensorData_t));/* 消息的大小 */ Key_Queue = xQueueCreate((UBaseType_t ) 4,/* 消息队列的长度 */ (UBaseType_t ) sizeof(uint8_t));/* 消息的大小 */ Page_Switch_BinarySem = xSemaphoreCreateBinary();WDG_Event_Handle = xEventGroupCreate();xTaskCreate((TaskFunction_t )lvgl_task, /* 任务入口函数 */(const char*    )"lvgl_task",/* 任务名字 */(uint16_t       )512,   /* 任务栈大小 */(void*          )NULL,	/* 任务入口函数参数 */(UBaseType_t    )4,	    /* 任务的优先级 */(TaskHandle_t*  )&LVGL_Task_Handle);/* 任务控制块指针 */xTaskCreate((TaskFunction_t )WDG_task, /* 任务入口函数 */(const char*    )"WDG_task",/* 任务名字 */(uint16_t       )128,   /* 任务栈大小 */(void*          )NULL,	/* 任务入口函数参数 */(UBaseType_t    )3,	    /* 任务的优先级 */(TaskHandle_t*  )&WDG_task_Handle);/* 任务控制块指针 */xTaskCreate((TaskFunction_t )Sensor_Data_Update_task, /* 任务入口函数 */(const char*    )"Sensor_Data_Update_Task",/* 任务名字 */(uint16_t       )256,   /* 任务栈大小 */(void*          )NULL,	/* 任务入口函数参数 */(UBaseType_t    )3,	    /* 任务的优先级 */(TaskHandle_t*  )&Sensor_Data_Update_Task_Handle);/* 任务控制块指针 *///	xTaskCreate((TaskFunction_t )UI_Page_Switch_task, /* 任务入口函数 */
//					(const char*    )"UI_Page_Switch_task",/* 任务名字 */
//					(uint16_t       )128*8,   /* 任务栈大小 */
//					(void*          )NULL,	/* 任务入口函数参数 */
//					(UBaseType_t    )4,	    /* 任务的优先级 */
//					(TaskHandle_t*  )&UI_Page_Switch_task_Handle);/* 任务控制块指针 */vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务taskEXIT_CRITICAL();            //退出临界区
}uint8_t WDG_task_Flag;
void WDG_task(void const * argument) 
{EventBits_t r_event;while(1) {r_event = xEventGroupWaitBits(WDG_Event_Handle, LVGL_EVENT|SENSOR_EVENT,pdTRUE,pdTRUE,portMAX_DELAY);   if ((r_event & (LVGL_EVENT|SENSOR_EVENT)) == (LVGL_EVENT|SENSOR_EVENT)) { WDG_task_Flag = 1;IWDG_Feed();} }
}

main.c 

初始化硬件、LVGL、调用任务创建函数创建任务和其他功能

#include "main.h"void vApplicationTickHook()
{// 告诉lvgl已经过去了1毫秒lv_tick_inc(1);
}static void Hard_Init(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);SystemInit();dwt_delay_init();BEEP_PWM_Init();Blue_Hc05_Init();Lcd_Init();Lcd_Clear(0xffff);lv_init();          lv_port_disp_init();        lv_port_indev_init();EXTI_Key_Config();MPU_Init();mpu_dmp_init();RTC_Config();MAX30102_Init();XGZP_Init();IWDG_Config(IWDG_Prescaler_64, 3125); //5s
}int main(void)
{Hard_Init();FreeRTOS_Task_Init();while (1){}
}

网盘链接

通过百度网盘分享的文件:STM32F4_Health Assistant.zip
链接:https://pan.baidu.com/s/1pAHKBgsChtsiSPcHAIBLAg?pwd=9xeg 
提取码:9xeg 
--来自百度网盘超级会员V5的分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1541844.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

WebGL缓冲区

一、缓冲区对象 缓冲区对象时WebGL系统中的一块内存区域,可以一次性地向缓冲区对象中填充大量的顶点数据,然后将这些数据保存其中,供顶点着色器使用。 类型化数组 这样程序可以预知数组中的类型,提高性能 类型描述Int8Array8位…

数据湖 Data Lake-概述

Data Lake 1. 数据湖的定义 数据湖是一种存储系统,用于集中存储大量的原始数据,可以按数据本来的原始格式进行存储,用户可以在需要时提取和分析这些数据。 A data lake is a centralized repository designed to hold vast volumes of data …

JavaScript高级进阶(三)

DOM-改变HTML 语法与说明 document.write() //改变HTML输出流,整个页面进行重绘。 操作对象.innerHTML新的HTML //改变HTML内容 操作对象.attribute新属性值 //改变HTML属性 对象.style.property新样式 //改变操作样式的属性 注意: document.write(),优先级太高&am…

Th:1.1 建立连接

基础讲解 1.TCP通信流程 基于TCP通信的Socket基本流程: 1.1 Socket 函数返回值&#xff1a;一个文件描述符&#xff1a; 特别的两个队列。 #include <sys/types.h> #include <sys/socket.h> //create an endpoint for communication int socket(int …

vue循环渲染动态展示内容案例(“更多”按钮功能)

当我们在网页浏览时&#xff0c;常常会有以下情况&#xff1a;要展示的内容太多&#xff0c;但展示空间有限&#xff0c;比如我们要在页面的一部分空间中展示较多的内容放不下&#xff0c;通常会有两种解决方式&#xff1a;分页&#xff0c;“更多”按钮。 今天我们的案例用于…

MyBatis-config.xml核心配置

MyBatis-config.xml 包含了会深深影响MyBatis行为的设置和属性信息&#xff0c;配置文档的顶层结构如下 environments&#xff08;环境配置&#xff09; environments用于配置数据库的URL信息&#xff0c;MyBatis-config可以动态配置多个数据源&#xff0c;用于连生产、预发、…

python:编写一个函数查找字符串中的最长公共前缀

最近在csdn网站上刷到一个题目&#xff0c;题目要求编写一个函数查找字符串中的最长公共前缀&#xff0c;题目如下&#xff1a; 给出的答案如下&#xff1a; from typing import List def longestCommonPrefix(strs:List[str]) -> str:if len(strs) 0:return i 0 #代…

矩阵系统源码搭建抖音矩阵批量剪辑矩阵分发,矩阵系统可开源或oem

揭秘抖音矩阵系统源码搭建秘籍 在短视频平台迅猛增长的背景下&#xff0c;抖音矩阵系统已变成扩大创作者及企业影响力的有效工具。构建这样一个系统需要精通多种编程技术&#xff0c;本文将探讨这些关键技术点。 矩阵营销系统通过集成多项功能如跨平台的账户管理、自动化任务生…

AI周报(9.15-9.21)

AI应用-宇宙建筑师&#xff1a;AI探索宇宙结构 近日&#xff0c;来自马克斯普朗克研究所等机构&#xff0c;利用宇宙学和红移依赖性对宇宙结构形成进行了场级仿真。 AI版“宇宙闪电侠”&#xff1a;若以传统宇宙模拟的缓慢行进比作悠然自得的蜗牛&#xff0c;那么AI便宛如宇宙…

Observability:构建下一代托管接入服务

作者&#xff1a;来自 Elastic Vishal Raj, Marc Lopez Rubio 随着无服务器&#xff08;serverless&#xff09;的引入&#xff0c;向 Elastic Cloud 发送可观察性数据变得越来越容易。你可以在 Elastic Cloud Serverless 中创建一个可观察性无服务器项目&#xff0c;并将可观察…

LeetCode 每周算法 7(二分查找)

LeetCode 每周算法 7&#xff08;二分查找&#xff09; 二分查找算法&#xff1a; class Solution { public: // 定义一个函数&#xff0c;接收一个整数向量nums和一个整数target&#xff0c;返回目标值在数组中的插入位置 int searchInsert(vector<int>& nums,…

golang学习笔记4-基本数据类型

声明&#xff1a;本人已有C&#xff0c;C,Python基础&#xff0c;只写本人认为的重点&#xff0c;方便自己回顾。 go的数据类型如下 由于bool和c类似&#xff0c;和go的区别是&#xff0c;bool的值只能取true和false&#xff0c;不能取整数&#xff0c;而且有默认值false。 一…

让C#程序在linux环境运行

今晚花一些时间&#xff0c;总结net程序如何在linux环境运行的一些技术路线。 1、采用.Net Core框架 NET Core 使用了 .NET Core Runtime&#xff0c;它可以在 Windows、Linux 和 macOS 等多个操作系统上运行。可以采用Visual Studio生成Linux版本的dll。 在Linux系统中&…

系统架构笔记-2-计算机系统基础知识

知识要点-2.6计算机语言 UML 对系统架构的定义是系统的组织结构&#xff0c;包括系统分解的组成部分以及它们的关联性、交互机制和指导原则等&#xff0c;提供系统设计的信息。 具体有以下 5 个系统视图&#xff1a; 1. 逻辑视图&#xff1a;也称为设计视图&#xff0c;表示…

【WEB】EZ_Host

1、 2、解答 http://8762a9b0-5aa3-49f8-b8d2-54e4cb0746cc.www.polarctf.com:8090/?hostlocalhost;lshttp://8762a9b0-5aa3-49f8-b8d2-54e4cb0746cc.www.polarctf.com:8090/?hostlocalhost;cat flag即可看到答案

【亿美软通-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

14.面试算法-字符串常见算法题(三)

1. 字符串回文问题 1.1 LeetCode.125. 验证回文串 回文问题在链表中是重点&#xff0c;在字符串中同样是个重点。当初我去美团面试第一轮技术面的第一个算法题就是让写判断字符串回文的问题。 这个本身还是比较简单的&#xff0c;只要先转换成字符数组&#xff0c;然后使用双…

OctoSQL 查询大量数据库和文件格式

OctoSQL 主要是一款 CLI 工具&#xff0c;可让你通过统一界面使用 SQL 查询大量数据库和文件格式&#xff0c;甚至在它们之间进行连接。同时&#xff0c;它还是一个易于扩展的完整数据流引擎&#xff0c;你可以用它为自己的应用程序添加 SQL 接口 OctoSQL是一款功能强大的SQL查…

Git从了解到操作

Git常用命令 基本的linux命令 ls / ll 查看当前目录( ls 是查看目录有哪些文件夹&#xff0c;ll 是查看隐藏文件)cat 查看文件内容touch 创建文件vi vi编辑器 (使用 vi 编辑器是为了方便展示效果&#xff0c;也可以记事本、editPlus、notPad等其它编辑器) 备注 Git GUl: Gi…

docker基本(仅供自己参考)

一、大型项目部署的问题&#xff1a; 1、大型项目的组件比较多&#xff0c;运行环境很复杂&#xff0c;部署通常会遇到各种问题&#xff1a; &#xff08;1&#xff09;&#xff1a;依赖关系复杂&#xff0c;容易出现兼容性问题 &#xff08;2&#xff09;&#xff1a;开发、…