STM32+FreeRTOS模拟手机PWM调光、屏幕解锁、定时休眠小项目
本人初学freertos,手里只有一块STM32MP157裸板,屏幕都没有,显示都是通过串口模拟的,自己想了一个实验项目,可以用来熟悉freertos的基本内容。谢谢
目录
概述:
主要程序:
实验效果
源码
概述:
//使用百问网STM32MP157(仅使用M4内核)开发板移植FreeRTOS
//利用板载AP3216C传感器收集光和距离数据
//模拟实现手机的密码解锁功能
//模拟实现手机的实时PWM调光功能
//模拟实现手机或平板的合盖息屏(保护套息屏)功能
//模拟实现手机自动休眠锁屏功能
//硬件外设使用:key1:改变密码数字
// key2:确定密码并切换密码位置
// led(yellow):模拟手机屏幕
// led(green):提示手机是否解锁成功
// AP3216C:收集光和距离数据
//涉及相关外设功能:FreeRTOS(队列,任务状态,软件定时器)、I2C、串口、标准IO、定时器PWM
效果:双键一起按唤醒屏幕后,可进行输入密码解锁屏幕,同时黄色LED(模拟手机屏幕)随环境光亮暗变化,若有物体贴紧传感器,则会锁屏并熄灭屏幕,若唤醒屏幕后20秒未按按键,则自动休眠锁屏。
主要程序:
app_freertos.c
defaulttask:运行解锁屏幕程序
task02:模拟手机PWM自适应调光
task03 :模拟合盖息屏程序
/*app_freertos.c*/
void StartDefaultTask(void *argument) //任务一defaultTask中运行解锁屏幕程序
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){vTaskSuspend(defaultTaskHandle); //在屏幕未唤醒时挂起任务一,等待双键点亮屏幕osTimerStart(myTimer01Handle,20000); //开启软件定时器(自动重装载),定时为20s,用于模拟手机自动锁屏mycodefunc(); //调用密码输入屏幕解锁程序osDelay(1);}/* USER CODE END StartDefaultTask */
}/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument) //task02任务为模拟手机PWM自适应调光,用黄色LED模拟手机屏幕
{/* USER CODE BEGIN StartTask02 *//* Infinite loop */ for(;;){vTaskSuspend(myTask02Handle); //在屏幕未唤醒时挂起任务二,等待双键点亮屏幕mypwmfunc(); //调用PWM实时自适应调光程序osDelay(1);} /* USER CODE END StartTask02 */
}/* USER CODE BEGIN Header_StartTask03 */
/**
* @brief Function implementing the myTask03 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask03 */
void StartTask03(void *argument) //task03任务为双键唤醒屏幕程序和实时模拟合盖熄灭屏幕程序(利用距离传感器)
{/* USER CODE BEGIN StartTask03 *//* Infinite loop */for(;;){if(key_1==down&&key_2==down){ //当开发板双按键同时按下,软件消抖vTaskDelay(5);if(key_1==down&&key_2==down){vTaskResume(defaultTaskHandle); //此时恢复defaulttask和task02,屏幕正常使用,进行正常解锁和输入密码等vTaskResume(myTask02Handle);//ledon();vTaskDelay(1000);}}mypsfunc(); //调用模拟合盖息屏程序osDelay(1);} /* USER CODE END StartTask03 */
}/* Callback01 function */
void Callback01(void *argument) //软件定时器回调程序(利用freertos自带软件定时器功能)
{ //当超过20s未使用按键重置软件定时器时间,则会调用回调函数/* USER CODE BEGIN Callback01 */ledoff(); //绿色LED熄灭,表示已上锁,解锁需要重新输入密码vTaskSuspend(myTask02Handle); //挂起task02,实时PWM调光功能关闭pwmoff(); //黄色LED熄灭,表示屏幕熄灭printf("************屏幕上边界************\r\n"); //串口打印此时屏幕状态,什么都没有printf(" \n");printf(" \n");printf(" \n");printf(" \n");printf(" \r\n");printf("************屏幕下边界************\r\n");printf("已锁屏 \r\n"); vTaskSuspend(defaultTaskHandle); //挂起defaulttask任务,暂停按键输入任务/* USER CODE END Callback01 */
}
my_key.c
defaulttask中调用的解锁屏幕程序
uint8_t code[5]={'X','X','X','X'}; //设定四位密码,默认显示为XXXX
uint8_t temp[11]={'0','1','2','3','4','5','6','7','8','9'}; //数字密码0-9
uint8_t rightcode[]="1234"; //在这里设定密码,默认为1234
extern osThreadId_t defaultTaskHandle; //外部声明相关句柄
extern osTimerId_t myTimer01Handle;
void mycodefunc(){printf("************屏幕上边界*********\r\n"); //屏幕亮起,提示输密码printf("请输入密码,按KEY2确定.\n");printf(" \n");printf(" \n");printf(" \n");printf(" \n");printf(" \r\n");printf("************屏幕下边界*********\r\n");vTaskDelay(500);uint8_t i=0,j=0;while(i<4){ if(key_1==down){ //按key1更改数字vTaskDelay(5);if(key_1==down){xTimerReset(myTimer01Handle,100);if(j==11){code[i]=temp[0];j=0;myprint();}else{code[i]=temp[j++];myprint();} vTaskDelay(500); }} if(key_2==down){ //按key2确认并切换到下一位vTaskDelay(5);if(key_2==down){xTimerReset(myTimer01Handle,100);i++;j=0;//myprint();vTaskDelay(500);}}}if(i==4&&strcmp(code,rightcode)!=0) printf("密码错误!请重新输入.\r\n"),mycodefunc(); //检测密码是否正确if(i==4){ //密码正确,提示已解锁,绿色LED亮代表已经解锁ledon();printf("*******************************\r\n");printf("屏幕已解锁. \r\n");}
}
void myprint(){for(uint8_t i=0;code[i]!='\0';i++) printf("%c",code[i]);printf("\r\n");
}
my_pwm.c
实时PWM调光和合盖息屏模拟程序
void mypwmfunc(){ //PWM调光函数,黄色LED会随外部光照情况调整自身亮暗uint16_t als,ps;while(1){AP3216_Read_ALS_Data(&als); //读光照和距离数据AP3216_Read_PS_Data(&ps);if(myQueue01Handle!=0){ //将ps数据通过队列传给task03if(xQueueSend(myQueue01Handle,&ps,1)!=pdTRUE){xQueueReset(myQueue01Handle); }} sprintf(dec,"%x",als);uint16_t ret=hexToDec(dec); //将十六进制als数据转换为十进制pwmon(); __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,ret); //通过改变PWM的CCR值改变占空比调节亮度if(key_1==down||key_2==down){ //若在运行过程中有按键被按下,重置软件定时器,代表此时正在使用屏幕,不锁屏xTimerReset(myTimer01Handle,100);}}
}
void mypsfunc(){ //模拟合盖息屏程序uint16_t ps=0;if(myQueue01Handle!=0){ //从队列读取task02发出的ps数据if(xQueueReceive(myQueue01Handle,&ps,1)==pdTRUE){if(ps>0x1000){ //当距离过近时熄灭屏幕vTaskDelay(50);if(ps>0x1000){ledoff(); //绿色LED熄灭,表示锁屏vTaskSuspend(myTask02Handle); //调光程序挂起pwmoff(); //屏幕熄灭printf("************屏幕上边界*********\r\n");printf(" \n");printf(" \n");printf(" \n");printf(" \n");printf(" \r\n");printf("************屏幕下边界*********\r\n");printf("已锁屏. \r\n");vTaskSuspend(defaultTaskHandle);xQueueReset(myQueue01Handle);}}} }
}
my_AP3216C.c
芯片驱动部分
oid AP3216_Read_PS_Data(uint16_t *pPS) //读距离传感器数据
{taskENTER_CRITICAL(); //特别注意此时任务应进入临界段,否则读i2c会容易卡死uint8_t ps_l = 0, ps_h = 0;ps_l = AP3216_ReadOneByte(PS_L_ADDR);ps_h = AP3216_ReadOneByte(PS_H_ADDR);if( (ps_l&0x40)==0x40){*pPS = 0;}else {*pPS = ((ps_h&0x1F)<<8) | (ps_l&0x0F);}taskEXIT_CRITICAL();
}void AP3216_Read_ALS_Data(uint16_t *pALS) //读光传感器数据
{ taskENTER_CRITICAL(); //特别注意此时任务应进入临界段,否则读i2c会卡死uint8_t als_l = 0, als_h = 0;als_l = AP3216_ReadOneByte(ALS_L_ADDR);als_h = AP3216_ReadOneByte(ALS_H_ADDR);*pALS = (als_h<<8) | (als_l);taskEXIT_CRITICAL();
}
实验效果
【基于FreeRTOS模拟手机屏幕自动调光,屏幕保护,屏幕解锁功能实验演示视频】 https://www.bilibili.com/video/BV1LW4y147fE/?share_source=copy_web&vd_source=02efc9b8955e0c6589b36882af845feb
源码
https://github.com/fredning/freertos-phone-sim
STM32+FreeRTOS模拟手机PWM调光、屏幕解锁、定时休眠小项目相关推荐
- 81、基于STM32单片机智能台灯 PWM调光坐姿矫正 灯光控制定时台灯设计
毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.硬件框图 七.流程图 八.程序源码 九.资料包括 摘要 随着社会在不断进 ...
- 苹果亮度突然变暗_iPhone 12调光策略延续三星OLED经典方式 低于25%亮度将采用PWM调光_手机新闻...
华强北电脑网10月23日消息 众所周知,苹果iPhone 12的屏幕是采用三星的OLED屏幕,大家也都知道,关于手机屏幕的亮度可以自动调节,在强光下,手机屏幕亮度就会调高,在弱光下,亮度就会变暗,就是 ...
- 关于LCD,LED,OLED那些事and关于DC调光与PWM调光
关于LCD,LED,OLED那些事and关于DC调光与PWM调光 LCD(liquid-crystal display)液晶显示器 LCD 的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许 ...
- android 屏幕 占空比,手机选购漫谈 篇三:LCD永不为奴,还是OLED真香?深究 “瞎眼” 的PWM调光...
手机选购漫谈 篇三:LCD永不为奴,还是OLED真香?深究 "瞎眼" 的PWM调光 2018-10-30 15:00:00 702点赞 1681收藏 551评论 在上一篇中,咱们聊 ...
- 全程pwm调光_dc调光的手机有哪些
dc调光的手机有哪些?目前已经发布的黑鲨游戏手机2.黑鲨游戏手机Helo均为全程DC调光,魅族16系列手机,OPPO的Reno,一加7等手机已经是支持DC调光. dc调光的手机有哪些 1.据悉,目前已 ...
- STM32单片机RGB红蓝调光植物补光系统红光蓝光PWM调色调节亮度
实践制作DIY- GC0040-红蓝调光植物补光系统 一.功能说明: 基于STM32单片机设计-红蓝调光植物补光系统 二.功能介绍: STM32F103C系列最小系统板+12V电源+2个恒流源驱动板驱 ...
- 笔记本电脑屏幕PWM调光频率测试调节软件
目录 测试平台 支持Windows 10 PWM.exe PWMHelper.exe PWMCTL 1.0.0.2.exe 不支持Windows 10 PWMCTL 1.0.0.1.exe Intel ...
- LED调光之 PWM调光和CCR模拟调光的区别
PWM调光和CCR模拟调光的区别 编者:Romeo 一:什么是PWM调光 1.1 PWM调光概念 PWM (Pulse Width Modulation)调光也称为脉宽调制调光,主要是通过在一个周期内 ...
- PT4115使用STM32单片机引脚PWM调光
PT4115使用STM32单片机引脚PWM调光 与上位机使用modbus与上位机使用modbus通信,能够实现0~100%亮度调节,现存问题:上电时LED灯亮一下,可能怀疑是PWM初始化太慢,直接将引 ...
最新文章
- 百度发布智能电视伴侣,并公布短视频计划
- tflearn 数据集太大无法加载进内存问题?——使用image_preloader 或者是 hdf5 dataset to deal with that issue...
- 破除Odoo 菜单栏提示 99+
- JQUERY的appendappendTo
- OCPC 广告算法在凤凰新媒体的实践探索
- 数组 边界 检查的几种实现方法
- hdoj-3342-Legal or Not(拓扑排序)
- 波士顿动力放出新视频:谁都挡不住机器狗开你的门
- OJ1114: 逆序(数组)(C语言)
- 麦肯锡在全球调研分析160个案例,给出5个行业的34个AI应用场景
- 【原创】关于nginx.pid丢失的解决办法
- 考研高等数学张宇30讲笔记——第九讲一元函数积分学的几何应用
- Excel函数实战技巧精粹(二)常用函数之VLOOKUP全解
- CF55D: Beautiful Number
- 关于bp抓包挂代理127.0.0.1服务器出现“有软件正在阻止Firefox安全连接至网站”问题的解决方法
- 黑马程序员---java基础-Java之IO
- linux判断文件类型是否存在脚本,shell脚本中的逻辑判断 文件目录属性判断 if特殊用法 case判断...
- 历年阿里面试题汇总(2017年不断更新中)
- 67键键盘如何输出`和~符号(一百五十一)
- 2k2实用球员_NBA2K Online2实用平民球员推荐:上篇