stm32温控风扇

103 阅读2分钟

主要模块

STM32板子,DS18B20温度传感器,L298N电机驱动模块,OLED屏幕一个

主要代码

#include "pwm.h"
#include "DS18B20.h"
#include "delay.h"
#include "key.h"
#include "oled.h"

int yuzhi1 = 27;
int yuzhi2=29;
int yuzhi3=31;
int flag = 1;						 //记录你的选择
int dangwei = 1;         //显示档位
int temperature;         //用于记录温度

void Dis_Temp()				   //OLED显示函数
{
	
	OLED_ShowString(1,1,"T:");
	OLED_ShowNum(1,3,temperature/10,2);
	OLED_ShowString(2, 1, "SET:");
	OLED_ShowString(4, 1, "D:");
	OLED_ShowNum(2,6,yuzhi1,2);
	OLED_ShowNum(2,9,yuzhi2,2);
	OLED_ShowNum(2,12,yuzhi3,2);
}

void menu(void)            //按键控制菜单函数
{

		if(KEY0 == 0)          //按键1实现光标选择
		{
			delay_us(20);				 //防抖
			while(KEY0 	== 0);	 //按下后不松手,则停在这
			delay_us(20); 			 //防抖
			flag++;
			if(flag == 4) flag = 1;
		}
		
			if(KEY1 == 0)          //按键2实现温度阈值+
				{
					delay_us(20);				 //防抖
					while(KEY1 	== 0);	 //按下后不松手,则停在这
					delay_us(20); 			 //防抖
					
					if(flag==1)
					{
						yuzhi1 ++;
						if(yuzhi1 == yuzhi2) yuzhi1 = yuzhi2 - 1;
						
					}					
					
					if(flag==2)
					{
						yuzhi2 ++;
						if(yuzhi2 == yuzhi3) yuzhi2 = yuzhi3 - 1;
					}
				
				
					if(flag==3)
					{
						yuzhi3 ++;
					}
				}
		
		if(KEY2 == 0)          //按键3实现温度阈值-
		{
			delay_us(20);				 //防抖
			while(KEY2 	== 0);	 //按下后不松手,则停在这
			delay_us(20); 			 //防抖

				if(flag==1)
					{
						yuzhi1 --;
					}					
										
				if(flag==2)
					{
						yuzhi2 --;
						if(yuzhi2 == yuzhi1) yuzhi2 = yuzhi1 + 1;
					}
				
				if(flag==3)
					{
						yuzhi3 --;
						if(yuzhi3 == yuzhi2) yuzhi3 = yuzhi2 + 1;
					
					}		
		}

		
		switch(flag)
		{
			case 1:
			{
				OLED_ShowString(3,6,"*");
				OLED_ShowString(3,9," ");
				OLED_ShowString(3,12," ");
			}break;
			case 2:
			{
				OLED_ShowString(3,6," ");
				OLED_ShowString(3,9,"*");
				OLED_ShowString(3,12," ");
			}break;
			case 3:
			{
				OLED_ShowString(3,6," ");
				OLED_ShowString(3,9," ");
				OLED_ShowString(3,12,"*");
			}break;
		}

}

void tiaosu(void)          //根据温度调速
{
	if(temperature/10 < yuzhi1) 
	{
		PWM_SetCompare2(0);
		delay_us(1);
		OLED_ShowNum(4,3,0,1);
	}
	else if(yuzhi1<temperature/10 && temperature/10 <= yuzhi2){
		PWM_SetCompare2(3000);
		delay_us(1);
		OLED_ShowNum(4,3,1,1);
	}
	else if(yuzhi2<temperature/10 && temperature/10 <= yuzhi3)
	{
		PWM_SetCompare2(6000);
		delay_us(1);
		OLED_ShowNum(4,3,2,1);
	}
	else if(yuzhi3<temperature/10)
	{
		PWM_SetCompare2(10000);
		delay_us(1);
		OLED_ShowNum(4,3,3,1);
	}
		
}

int main(void)
{
	PWM_Init();
	uart_init(72,128000);           					//初始化串口1
	OLED_Init();
	KEY_Init();
	delay_us(50);
	DS18B20_Init();

	OLED_Clear();
	
	while(1)
	{
		temperature = DS18B20_Get_Temp();
		Dis_Temp();		
		delay_us(1);
		menu();
		tiaosu();

	}
	
}




实物图片

image.png