【STM32单片机】u8g2智能风扇设计

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使用按键、IIC OLED模块、DS18B20温度传感器、直流电机、红外遥控等。
主要功能:
初始化后进入温度显示界面,系统初始状态为手动模式,关闭定时功能。工作在手动模式下,屏幕右上角会显示手图标,自动模式则不显示;
在手动模式下,可通过按键K1调节风扇档位,系统支持0-3档,0为停止;按下K2键停止,按下K3键切换自动/手动模式,按下K4键进入温度阈值及定时时间设置界面;
按下K4键进入设置功能界面,可通过K3键切换不同功能设置,K1和K2用于调节;比如温度阈值设置为26.5C,开启定时,定时时间设置为0.5小时;设置好后,可按下K4键退出,
此时界面上方会显示一个闹铃图标,当定时时间到达,风扇则关闭,需按下K3键后再按下K4键重新进入定时功能;
在系统运行中,可通过红外遥控器上的K1-K4位置键操作对应功能;


二、软件设计

/*
作者:嗨小易(QQ:3443792007)*///系统数据显示
void sys_data_show(void)
{u8 buf[6];u8 settime=0;reflash_window_show();//刷新固定窗口显示内容while(1){//未进入设置模式if(sys_ctrl.set==0){//显示温度buf[0]=sys_ctrl.temp/100+0x30;buf[1]=sys_ctrl.temp%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp%100%10+0x30;buf[4]='C';buf[5]='\0';u8g2_SetFont(&u8g2,u8g_font_ncenB24);u8g2_DrawStr(&u8g2,25,50,(char *)buf);//显示档位buf[0]=sys_ctrl.lev%10+0x30;buf[1]='\0';u8g2_SetFont(&u8g2,u8g2_font_helvB12_tf);u8g2_DrawStr(&u8g2,20,12,(char *)buf);}//进入设置模式显示else{//箭头指向位置u8g2_SetFont(&u8g2,u8g2_font_helvB12_tf);u8g2_DrawStr(&u8g2,0,12+sys_ctrl.mode*23,"->");//显示温度阈值buf[0]=sys_ctrl.templ/100+0x30;buf[1]=sys_ctrl.templ%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.templ%100%10+0x30;buf[4]='C';buf[5]='\0';u8g2_DrawStr(&u8g2,20+5*10,12,(char *)buf);//显示定时状态if(sys_ctrl.timeflag==0)u8g2_DrawStr(&u8g2,20+7*10,35,"OFF");else u8g2_DrawStr(&u8g2,20+7*10,35,"ON ");//显示定时时间settime=((float)sys_ctrl.settime/60)*10;buf[0]=settime/10+0x30;buf[1]='.';buf[2]=settime%10+0x30;buf[3]='H';buf[4]='\0';u8g2_DrawStr(&u8g2,20+5*10,58,(char *)buf);}u8g2_SendBuffer(&u8g2);break;}
}//系统功能控制
void sys_fun_ctrl(void)
{//自动模式if(sys_ctrl.handflag==1 && sys_ctrl.time_over==0){//如果温度低于下限,停止if(sys_ctrl.temp<sys_ctrl.templ)sys_ctrl.lev=0;//随着温度升高(26.5-28.0),档位1else if(sys_ctrl.temp>=sys_ctrl.templ && sys_ctrl.temp<(sys_ctrl.templ+15)) sys_ctrl.lev=1;//随着温度升高(28.0-29.5),档位2else if(sys_ctrl.temp>=(sys_ctrl.templ+15) && sys_ctrl.temp<(sys_ctrl.templ+30))sys_ctrl.lev=2;//随着温度升高(29.5以上),档位3else if(sys_ctrl.temp>=(sys_ctrl.templ+30))sys_ctrl.lev=3;}//开启定时if(sys_ctrl.timeflag==1){//如果时间到达if(sys_ctrl.min>=sys_ctrl.settime){sys_ctrl.min=0;sys_ctrl.lev=0;TIM_Cmd(TIM3,DISABLE); //关闭定时器sys_ctrl.timeflag=0;sys_ctrl.time_over=1;}}//设置占空比TIM_SetCompare3(TIM4,sys_ctrl.lev*166);
}/*******************************************************************************
* 函 数 名         : TIM3_IRQHandler
* 函数功能		   : TIM3中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TIM3_IRQHandler(void)
{static u8 i=0;static u8 sec=0;if(TIM_GetITStatus(TIM3,TIM_IT_Update)){LED0=!LED0;i++;if(i>=2)//1S{i=0;sec++;if(sec>=60){sec=0;sys_ctrl.min++;}	}}TIM_ClearITPendingBit(TIM3,TIM_IT_Update);	
}//应用控制系统
void sys_app_ctrl(void)
{u8 i=10;USART1_Init(115200);LED_Init();OLED_Init();//u8g2初始化u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_stm32_gpio_and_delay);  // init u8g2 structure u8g2结构u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,发送init序列到显示器,显示器在此之后处于睡眠模式,u8g2_SetPowerSave(&u8g2, 0); //开启显示sys_open_logo_show();//系统开机LOGO显示DS18B20_Init();//等待温度数据稳定while(i--){sys_ctrl.temp=DS18B20_GetTemperture()*10;//保留一位小数delay_ms(100);}KEY_Init();Hwjs_Init();TIM3_Init(1000,36000-1);  //定时500msTIM4_CH3_PWM_Init(500,72-1);//频率是2KhTIM_SetCompare3(TIM4,0);sys_parm_init();//系统参数初始化while(1){sys_data_get();//系统数据获取sys_data_show();//系统数据显示sys_data_set();//系统数据设置sys_fun_ctrl();//系统功能控制}
}

三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试工作步骤详情

软件测试步骤按照研发阶段一般分为5个部分&#xff1a;单元测试、集成测试、确认测试、系统测试、验收测试&#xff0c;下面将不同阶段需要的一些工作内容做一下梳理希望可以帮助到大家。 一、单元测试的内容&#xff1a;&#xff08;白盒为主&#xff0c;黑盒为辅&#xff09;…

Ubuntu 安装 CUDA 与 CUDNN GPU加速引擎

一、NVIDIA&#xff08;英伟达&#xff09;显卡驱动安装 NVIDIA显卡驱动可以通过指令sudo apt purge nvidia*删除以前安装的NVIDIA驱动版本&#xff0c;重新安装。 1.1. 关闭系统自带驱动nouveau 注意&#xff01;在安装NVIDIA驱动以前需要禁止系统自带显卡驱动nouveau&#xf…

Diffusion Autoencoders: Toward a Meaningful and Decodable Representation

Diffusion Autoencoders: Toward a Meaningful and Decodable Representation (Paper reading) Konpat Preechakul, VISTEC, Thailand, CVPR22 Oral, Cited:117, Code, Paper 1. 前言 扩散概率模型 (DPM) 在图像生成方面取得了显着的质量&#xff0c;可与 GAN 相媲美。但是与…

独立站引流,如何在Reddit进行营销推广?

Reddit是目前最被忽视却最具潜力的社交媒体营销平台之一&#xff0c;它相当于国内的百度贴吧&#xff0c;是美国最大的论坛&#xff0c;也是美国第五大网站&#xff0c;流量仅次于Google、Youtube、Facebook以及亚马逊。 如果会玩&#xff0c;Reddit也可以跟其他的社交媒体营销…

Element UI搭建首页导航和左侧菜单以及Mock.js和(组件通信)总线的运用

目录 前言 一、Mock.js简介及使用 1.Mock.js简介 1.1.什么是Mock.js 1.2.Mock.js的两大特性 1.3.Mock.js使用的优势 1.4.Mock.js的基本用法 1.5.Mock.js与前端框架的集成 2.Mock.js的使用 2.1安装Mock.js 2.2.引入mockjs 2.3.mockjs使用 2.3.1.定义测试数据文件 2…

扫地机器人经营商城小程序的作用是什么

扫地机器人对人们生活大有帮助&#xff0c;近些年也有不少企业开创品牌&#xff0c;在电商平台每年销量也非常高&#xff0c;同行竞争激烈及私域化程度加深情况下&#xff0c;虽然第三方平台或线下方式也有生意&#xff0c;但互联网电商发展也为商家们带来了诸多痛点。 那么通…

【图像去噪】【TGV 正则器的快速计算方法】通过FFT的总(广义)变化进行图像去噪(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 【图像去噪】【TGV 正则化器的快速计算方法】通过FFT的总&#xff08;广义&#xff09;变换进行图像去噪&#xff0c;可提供更自然的恢复图像。…

uniapp:不同权限设置不同的tabBar

1、在pages.json里&#xff0c;将所有tabBar涉及的页面都加进来。 我这里使用username来动态显示tabBar。 jeecg用户显示&#xff1a;首页&#xff0c;订单&#xff0c;消息&#xff0c;发现&#xff0c;我的&#xff0c;一共5个tabBar。 admin用户显示&#xff1a;首页&…

青大数据结构【2022】

关键字&#xff1a; next数组、下三角矩阵、完全二叉树结点、静态分布动态分布、迪杰斯特拉最短路径、二叉排序树失败ASL、排序比较、二叉排序树中序遍历、链表删除最大值 一、单选 二、简答 三、应用 四、算法分析 五、算法设计

「Go框架」gin框架是如何处理panic的?

本文我们介绍下recover在gin框架中的应用。 首先&#xff0c;在golang中&#xff0c;如果在子协程中遇到了panic&#xff0c;那么主协程也会被终止。如下&#xff1a; package mainimport ("github.com/gin-gonic/gin" )func main() {r : gin.Default()// 在子协程中…

轻松使用androidstudio交叉编译libredwg库

对于安卓或嵌入式开发者而言,交叉编译是再熟悉不过的操作了,可是对于一些刚入门或初级开发者经常会遇到这样的问题:如何交叉编译C++库来生成安卓下的so库呢? 最近有一些粉丝找到我求救,那么我最近刚好有空大致研究了下,帮他们成功编译了其中一个libredwg的C++库,这篇文章…

LeetCode01

LeetCode01 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和 为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你…

Lua多脚本执行

--全局变量 a 1 b "123"for i 1,2 doc "Holens" endprint(c) print("*************************************1")--本地变量&#xff08;局部变量&#xff09; for i 1,2 dolocal d "Holens2"print(d) end print(d)function F1( ..…

Java中的IO流的缓冲流

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 &#x1f334;IO流体系结构&#x1f334;缓冲流1.提高效率的原理2.缓冲流的类型3.字符缓冲流两个特有方法 &#x1f334;总结 &#x1f334;IO流体系…

git学习使用

git使用 1、cmd #查看版本 git version2、初识 Git GUI: Git提供的图形界面工具 Git Bash: Git提供的命令行工具 1.打开Git Bash2.设置自己的用户名和邮箱地址git config --global user.name "xxx"git config --global user.email "123456789163.com"查…

基于jenkins+k8s实现devops

1、背景 由于jenkins运行在k8s上能够更好的利用动态agent进行构建。所以写了个部署教程&#xff0c;亲测无坑 2、部署 1、创建ns kubectl create namespace devops 2、kubectl apply -f jenkins.yml apiVersion: v1 kind: ServiceAccount metadata:name: jenkinsnamespace…

OpenHarmony应用程序包整体说明

用户应用程序泛指运行在设备的操作系统之上&#xff0c;为用户提供特定服务的程序&#xff0c;简称“应用”。一个应用所对应的软件包文件&#xff0c;称为“应用程序包”。 OpenHarmony提供了应用程序包开发、安装、查询、更新、卸载的管理机制&#xff0c;方便开发者开发和管…

word中给公式加序号的方法

①首先&#xff0c;用word插入一个公式 然后呢&#xff0c;在公式后面敲上这个公式在整篇文章中的序号。我的这个公式在整篇文章中是第三号&#xff0c;所以就敲上(3),如下图所示&#xff1a; 然后&#xff0c;在公式和序号之间&#xff0c;按住shift3(#) 切忌&#xff0c;…

UNITY—2D游戏制作入门!

Unity作为当今最流行的游戏引擎之一&#xff0c;受到各大厂商的喜爱。 像是炉石传说&#xff0c;以及逃离塔克夫&#xff0c;都是由unity引擎开发制作。 作为初学者的我们&#xff0c;虽然无法直接做出完成度那么高的作品&#xff0c;但每一个伟大的目标&#xff0c;都有一个…

MySQL数据库的索引和事务

目录 一、索引 1.1Mysql索引 1.2索引的作用 1.3 创建索引的依据 1.4 普通索引 修改表方式创建索引 删除索引 1.5 唯一索引 修改表方式创建 删除索引 1.6 主键索引 修改表方式创建 1.7 组合索引 1.8 全文索引 1.9查看索引 二、事务 2.1事务概念 2.2事务的ACID特…