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

news2024/11/22 6:25:59

文章目录

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


一、功能简介

本项目使用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),档位1
		else if(sys_ctrl.temp>=sys_ctrl.templ && sys_ctrl.temp<(sys_ctrl.templ+15)) 
			sys_ctrl.lev=1;
		//随着温度升高(28.0-29.5),档位2
		else if(sys_ctrl.temp>=(sys_ctrl.templ+15) && sys_ctrl.temp<(sys_ctrl.templ+30))
			sys_ctrl.lev=2;
		//随着温度升高(29.5以上),档位3
		else 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);  //定时500ms
	TIM4_CH3_PWM_Init(500,72-1);//频率是2Kh
	TIM_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.coloradmin.cn/o/1041843.html

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

相关文章

探索视听新纪元: ChatGPT的最新语音和图像功能全解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f916; 人工智能 AI: &#x1f9e0; Machine …

【我的创作纪念日】使用pix2pixgan实现barts2020数据集的处理(完整版本)

使用pix2pixgan &#xff08;pytorch)实现T1 -> T2的基本代码 使用 https://github.com/eriklindernoren/PyTorch-GAN/ 这里面的pix2pixgan代码进行实现。 进去之后我们需要重新处理数据集&#xff0c;并且源代码里面先训练的生成器&#xff0c;后训练鉴别器。 一般情况下…

亚马逊要求的UL报告的产品标准是什么?如何区分

亚马逊为什么要求电子产品有UL检测报告&#xff1f; 首先&#xff0c;美国是一个对安全要求非常严格的国家&#xff0c;美国本土的所有电子产品生产企业早在很多年前就要求有相关安规检测。 其次&#xff0c;随着亚马逊在全球商业的战略地位不断提高&#xff0c;境外的电子设…

百度资源搜索平台出现:You do not have the proper credential to access this page.怎么办?

Forbidden site not allowed You do not have the proper credential to access this page. If you think this is a server error, please contact the webmaster. 如果你的百度资源平台&#xff0c;点进去出现这个提示&#xff0c;说明您的网站已经被百度清退了。 如果你的网…

队列的分类及用途

队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;用于存储和管理数据元素。队列通常遵循先进先出&#xff08;FIFO&#xff0c;First-In-First-Out&#xff09;的原则&#xff0c;这意味着最早添加到队列的元素将首先被移除。队列有不同的类型和用途&#x…

VS code本地安装PlantUML

VS code本地安装PlantUML 需要条件vs code安装插件使用常见错误 需要条件 在VS Code上安装PlantUML扩展之前&#xff0c;请确保您具有以下先决条件: : Java与GraphViz(点击可直接跳转下载界面); 安装省略 vs code安装插件 vs code安装以下两个插件&#xff08;PlantUML,Grap…

易云维®智慧工厂数字化管理平台助推工业制造企业数字化转型新动能

近年来&#xff0c;我国正在积极推进工业制造企业数字化转型&#xff0c;工业制造企业数字化转型迎来了密集的利好政策&#xff0c;近期&#xff0c;国家工信部又出台系列政策&#xff0c;实施工业制造企业数字化促进工程&#xff0c;推动工业制造企业更快更好地拥抱数字经济。…

数字安全设备制造有哪几种方式?

数字安全设备制造是指制造用于保护数字信息系统和网络安全的专用设备。以下是几种常见的数字安全设备制造方式&#xff1a; 集成式安全设备制造&#xff1a;集成式安全设备制造是将多种安全功能集成到单一的硬件设备或软件平台中。这种制造方式可以大大降低设备的成本和复杂性&…

vue3 + vite3 addRoute 实现权限管理系统

vue3 vite3 addRoute 实现权限控制 1、前言2、静态路由3、动态路由4、在组建中使用路由5、注意事项 1、前言 在权限系统开发中&#xff0c;根据后端返回的菜单列表动态添加路由是非常常见的需求&#xff0c;它可以实现根据用户权限动态加载可访问的页面。本篇文章我们将重点介…

第二届全国高校计算机技能竞赛——Java赛道

第二届全国高校计算机技能竞赛——Java赛道 小赛跳高 签到题 import java.util.*; public class Main{public static void main(String []args) {Scanner sc new Scanner(System.in);double n sc.nextDouble();for(int i 0; i < 4; i) {n n * 0.9;}System.out.printf(&…

探索公共厕所的数字化治理,智慧公厕完善公共厕所智能化的治理体系

随着城市化进程的不断发展&#xff0c;公共厕所治理成为一个不容忽视的问题。如何通过数字化手段来提升公共厕所管理水平&#xff0c;成为了一个备受关注的话题。本文将以智慧公厕领先厂家广州中期科技有限公司&#xff0c;大量精品案例项目实景实图&#xff0c;探讨公共厕所数…

品牌线上假货怎么治理

随着品牌的发展&#xff0c;母婴、家电、百货等行业&#xff0c;链接量暴增&#xff0c;销售店铺也较多&#xff0c;线上仅通过图片销售的形式&#xff0c;也导致了假货链接地滋生&#xff0c;假货分两种情况&#xff0c;一种是只销售假货的店铺&#xff0c;一种是真假混卖的店…

用numpy生成18种特殊数组

文章目录 单值数组特殊矩阵范德蒙德矩阵数值范围坐标网格绘图代码 所有创建数组的函数中&#xff0c;都有一个可选参数dtype&#xff0c;表示创建的数组的数据类型。 指定维度empty, eye, identity, ones, zeros, full模仿维度empty_like, ones_like, zeros_like, full_like特…

【Linux】C语言实现对文件的加密算法

异或加密 解密方式是进行第二次加密后自动解密 #define BUF_SIZE (16384) //16k /************************************************************** 功能描述: 加密实现 输入参数: --------------------------------------------------------------- 修改作者: 修改日期…

【小尘送书-第五期】《巧用ChatGPT快速提高职场晋升力》用ChatGPT快速提升职场能力,全面促进自身职业发展

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

qq录屏快捷键大全,玩转录制就这么简单(干货)

“qq有录屏快捷键吗&#xff1f;有点好奇&#xff0c;现在用qq录制屏幕&#xff0c;总是得去点击屏幕录制才可以出来&#xff0c;太麻烦了&#xff0c;如果可以通过快捷键的方式打开&#xff0c;会轻松许多&#xff0c;想问问大家&#xff0c;知道qq录屏快捷键是多少吗&#xf…

#你我都是国家队#,与泸州老窖一起为中国荣耀干杯

执笔 | 姜 姜 编辑 | 古利特 代表亚洲最高水平的体育盛会已经开幕两天&#xff0c;国家队运动员们在赛场上挥洒汗水&#xff0c;国人的激情也随之升温。 为迎接这场体育盛会&#xff0c;9月13日&#xff0c;TEAM CHINA中国国家队官方微博携手泸州老窖发布了一条态度短片&am…

R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类...

原文链接&#xff1a;http://tecdat.cn/?p21379 本文我们对逻辑回归和样条曲线进行介绍&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 logistic回归基于以下假设&#xff1a;给定协变量x&#xff0c;Y具有伯努利分布&#xff0c; 目的是估计参数β。 回想一…

如何在Python中实现高效的数据处理与分析

在当今信息爆炸的时代&#xff0c;我们面对的数据量越来越大&#xff0c;如何高效地处理和分析数据成为了一种迫切的需求。Python作为一种强大的编程语言&#xff0c;提供了丰富的数据处理和分析库&#xff0c;帮助我们轻松应对这个挑战。本文将为您介绍如何在Python中实现高效…

【深度学习实验】卷积神经网络(二):自定义简单的二维卷积神经网络

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 二维互相关运算&#xff08;corr2d&#xff09; 2. 二维卷积层类&#xff08;Conv2D&#xff09; a. __init__&#xff08;初始化&#xff09; b. forward(前向传…