基于STM32的智能台灯

这篇具有很好参考价值的文章主要介绍了基于STM32的智能台灯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

器材:LED,独立按键,OLED,光敏电阻,stm32f1。

功能1,由环境亮度控制LED亮度模式: 按下KEY1进入自动调节亮度模式,OLED实时显示环境光照强度和PWM占空比,按下KEY4退出该模式。使用函数关系(这里我取的最简单的一次函数)建立光敏电阻采集转换后的ADC值与PWM的CCR3的值,从而使LED灯的亮度连续变化。

while(1)
{
key1=KEY_Scan(0);	
adcx=Lsens_Get_Val();
TIM_SetCompare2(TIM3,1.8*adcx-44);
OLED_ShowNum(0,0,adcx,2,16);
OLED_ShowString(20,0,"%",16);
OLED_ShowNum(0,2,1.8*adcx-44,2,16);
if(key1==KEY4_PRES)
 {  
 TIM_SetCompare2(TIM3,100);
 TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);			
 LED_Clear();
 break;
 }
}

功能2,按下KEY2进入按键控制模式:KEY1亮度递减,KEY2亮度递增,KEY3直接变为最亮模式,OLED实时显示PWM占空比,按下KEY4退出该模式。

while(1)
{					
  TIM_SetCompare2(TIM3,ccrx);
  OLED_ShowNum(0,0,ccrx,2,16);
  key2=KEY_Scan(0);	
  if(key2==KEY1_PRES)
  {ccrx+=20;TIM_SetCompare2(TIM3,ccrx);
  OLED_ShowNum(0,0,ccrx,2,16);}
					 
if(ccrx==100&&key2==KEY1_PRES)ccrx=0;
					 
if(key2==KEY2_PRES)
 {ccrx-=20;TIM_SetCompare2(TIM3,ccrx);OLED_ShowNum(0,0,ccrx,2,16);}
					
if(ccrx==0&&key2==KEY2_PRES)ccrx=100;
					 
if(key2==KEY3_PRES)
{ccrx=0;TIM_SetCompare2(TIM3,ccrx);OLED_ShowNum(0,0,ccrx,2,16);}
					
if(key2==KEY4_PRES)
 { TIM_SetCompare2(TIM3,100);
  TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);	
 OLED_Clear();ccrx=0;break;}
} 

功能3,按下KEY3进入定时模式:每按下一次KEY1分钟数加一,没每按下一次KEY2秒数加10,按下KEY3进入定时模式,LED变亮,OLED实时显示分钟数和秒数,当分钟数和秒数均归零后LED灯熄灭,按下KEY4退出该模式。

while(1)
 {
	OLED_ShowNum(0,0,min,2,16);
	OLED_ShowString(20,0,"m",16);
	OLED_ShowString(30,0,"i",16);
	OLED_ShowString(40,0,"n",16);
	OLED_ShowNum(60,0,sec,2,16);
	 OLED_ShowString(80,0,"s",16);
				  
	TIM_SetCompare2(TIM3,100);
	key3=KEY_Scan(0);	//µÃµ½¼üÖµ
	if(key3==KEY1_PRES)
   { TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);	sec+=10;}
	if(key3==KEY2_PRES)
	{ TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);	min+=1;}
	 if(key3==KEY3_PRES)
	 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	{
	if(cnt==1)TIM_SetCompare2(TIM3,0);
	 else TIM_SetCompare2(TIM3,100);
	}
	if(key3==KEY4_PRES)
	 { OLED_Clear(); TIM_SetCompare2(TIM3,100);
	   TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);	
						
		sec=min=0;break;}
}

原理:令定时器2的ARR=10000-1,PSC=7200-1,使得每1s执行一次中断服务函数,在中断服务函数和mian.c中使用if语句和对变量的灵活赋值达到了想要的效果。

定时器2中断服务函数:

void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		
		cnt=1;
		num++;
		if(num==11)num=0;
		if(sec==0&&min==0)cnt=0;
		if(cnt==1)
		{
			if(sec==0&&min>0)min--,sec=60;
			if(sec>0)sec--;
			if(sec==0&&min>0)sec=60,min--;
			if(sec==0&&min==0)cnt=0;
		}
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

在main.c用extern声明num,sec,min,cnt变量。

mian.c:

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "adc.h"
#include "lsens.h"
#include "myiic.h"
#include "oled.h"
#include "dht11.h"
#include "rtc.h"
vu8 key0=0;	 
 	vu8 key1=0;
	vu8 key2=0;
	vu8 key3=0;
	u8 adcx;
  u8 time=0;
  u8 ccrx=0;	
 u16 num=0,sec=0,min=0;
u8 cnt=0;
 

void Mode_1(void);
void Mode_2(void);
void Mode_3(void);
void Mode_4(void);

 int main(void)
 {		
	delay_init();	    	 //
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //
	uart_init(115200);	
 	//LED_Init();			     //
	 KEY_Init();         //
	 TIM2_Int_Init(10000-1,7200-1);
 	TIM3_PWM_Init(100,0);	 //
	 Lsens_Init();//
	 OLED_Init();			//
	 OLED_Clear(); 
	 LED0=0;
while(1)
{
key0=KEY_Scan(0);	//
		 
if(key0==KEY1_PRES)//
 {
	OLED_Clear();
				 
   Mode_1();
}
			
if(key0==KEY2_PRES)//
{
 OLED_Clear();
 Mode_2();
}
if(key0==KEY3_PRES)//
{
OLED_Clear();
 Mode_3();
}
			
if(key0==KEY4_PRES)
 Mode_4();
 }
}

 void Mode_1(void)
 {
  while(1)
{
  key1=KEY_Scan(0);	//
  adcx=Lsens_Get_Val();
 TIM_SetCompare2(TIM3,1.8*adcx-44);
 OLED_ShowNum(0,0,adcx,2,16);
 OLED_ShowString(20,0,"%",16);
 OLED_ShowNum(0,2,1.8*adcx-44,2,16);
 if(key1==KEY4_PRES)
 { TIM_SetCompare2(TIM3,100);
    TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);			
	OLED_Clear();break;}
 }
  }
 void Mode_2(void)
 {
while(1)
 {			
     TIM_SetCompare2(TIM3,ccrx);
	OLED_ShowNum(0,0,ccrx,2,16);
	key2=KEY_Scan(0);	//
	if(key2==KEY1_PRES)
	 {ccrx+=20;TIM_SetCompare2(TIM3,ccrx);OLED_ShowNum(0,0,ccrx,2,16);}
	 //Ö𽥱䰵
	if(ccrx==100&&key2==KEY1_PRES)ccrx=0;
	 if(key2==KEY2_PRES)
		{ccrx-=20;TIM_SetCompare2(TIM3,ccrx);OLED_ShowNum(0,0,ccrx,2,16);}
		 //Öð½¥±äÁÁ
	if(ccrx==0&&key2==KEY2_PRES)ccrx=100;
	 if(key2==KEY3_PRES)
	 {ccrx=0;TIM_SetCompare2(TIM3,ccrx);OLED_ShowNum(0,0,ccrx,2,16);}
		 //×îÁÁ
	if(key2==KEY4_PRES)
		{ TIM_SetCompare2(TIM3,100);
	 TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);	
	OLED_Clear();ccrx=0;break;}
	 } 
 }

 void Mode_3(void)
 {
     while(1)
 {
	OLED_ShowNum(0,0,min,2,16);
	OLED_ShowString(20,0,"m",16);
	OLED_ShowString(30,0,"i",16);
	OLED_ShowString(40,0,"n",16);
	OLED_ShowNum(60,0,sec,2,16);
	OLED_ShowString(80,0,"s",16);
	TIM_SetCompare2(TIM3,100);
    key3=KEY_Scan(0);	//
	if(key3==KEY1_PRES)
	{ TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);	sec+=10;}
		if(key3==KEY2_PRES)
	 { TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);	min+=1;}
	if(key3==KEY3_PRES)
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	 {
		if(cnt==1)TIM_SetCompare2(TIM3,0);
	    else TIM_SetCompare2(TIM3,100);
	 }
	if(key3==KEY4_PRES)
	{ OLED_Clear(); TIM_SetCompare2(TIM3,100);
	TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);	
	sec=min=0;break;}
	}
 }
 void Mode_4(void)
 {
  while(1)
  { OLED_Clear();TIM_SetCompare2(TIM3,100);
	TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);	break;}
 }
 
 

遇到的坑:文章来源地址https://www.toymoban.com/news/detail-571031.html

  1. 在同一个工程中使用定时器的两个功能时,要使用两个不同的定时器(本实验使用的定时器二的中断和定时器三的PWM),否则达不到应有的效果。
  2. 在led.c设置GPIO模式为推挽输出,在time.c的PWM设置GPIO模式为复用推挽输出,使得在程序中诸如LED=0;LED01;等语句失效。解决办法:可不调用LED初始化函数,在PWM初始化后,若要实现LED=0;或LED=1;可使用TIM_SetComparex();函数使占空比为0或最大值达到同样效果。
  3. 定时器2初始化的中断会干扰其他模式的正常运行。可使用TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);函数在对应处,使定时器2失能

到了这里,关于基于STM32的智能台灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32单片机的智能家居毕设

    1、硬件清单 序号 名称 型号/作用 数量 1 STM32单片机 正点原子精英板(STM32F103ZET6) 1 2 温湿度传感器 DHT11 1 3 光敏传感器 3针制光敏传感器模块 1 4 空气质量传感器 MQ135 1 5 人体红外传感器 微型人体红外感应模块 1 6 语音识别模块/播报模块 LD3320/JQ8900 MP3(可插SD/TF卡) 1 7 喇叭

    2024年02月03日
    浏览(92)
  • 基于stm32单片机的智能家居环境监控系统

    智能家居环境监控系统的整体电路主要由stm32单片机最小系统,光MQ-2烟雾传感器电路,红外人体检测电路,DS18B20温度传感器,LCD1602显示电路,水泵驱动电路,风扇驱动电路,LED指示灯,蜂鸣器报警电路;原理图如图: PCB如下: 1.通过MQ-2烟雾传感器及检测电路对周围环境中的

    2024年02月11日
    浏览(66)
  • 单片机毕设 基于STM32的智能药箱系统设计与实现

    Hi,大家好,今天向大家介绍一个学长做的单片机项目 基于STM32的智能药箱系统设计与实现 大家可用于 课程设计 或 毕业设计 照顾老人, 特别是提醒老人准时吃药已经成为了一个社会关心的问题。长期记录吃药种类、 吃药时间能为分析老人的病理提供有力的依据。 基于目

    2024年02月04日
    浏览(76)
  • 单片机项目分享 基于Stm32的家庭智能监控系统 - 单片机 图像识别 人体检测 AI

    hr style=\\\" border:solid; width:100px; height:1px;\\\" color=#000000 size=1\\\" 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最

    2024年01月16日
    浏览(74)
  • 【毕业设计】基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年02月04日
    浏览(90)
  • 基于51/STM32单片机的智能药盒 物联网定时吃药 药品分类

     功能介绍  以51/STM32单片机作为主控系统;   LCD1602液晶显示当前时间、温湿度、药品重量   3次吃药时间、药品类目和药品数量  HX711压力采集当前药品重量  红外感应当前药盒是否打开  DS1302时钟芯片显示当前年月日、时分秒、星期  DHT11采集当前环境温度和湿度       

    2024年02月19日
    浏览(47)
  • 物联网毕设 - 基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年02月03日
    浏览(79)
  • 【毕业设计】基于单片机的智能温控农业大棚系统 - 物联网 stm32

    Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目 基于单片机的智能温控农业大棚系统 大家可用于 课程设计 或 毕业设计 单片机-嵌入式毕设选题大全及项目分享: https://blog.csdn.net/m0_71572576/article/details/125409052 近年来我国的温室控制取得了 长足的进步, 首先在

    2024年02月02日
    浏览(65)
  • 【单片机毕设选题】 基于Stm32的家庭智能监控系统 - 单片机 图像识别 人体检测 AI

    hr style=\\\" border:solid; width:100px; height:1px;\\\" color=#000000 size=1\\\" 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最

    2024年01月21日
    浏览(66)
  • 基于STM32单片机和AD9850的智能DDS函数信号发生器

    CSDN话题挑战赛第2期 参赛话题:学习笔记 有一天,我在浏览CSDN时看到一篇关于 AD9850 的帖子。AD9850是一款可以产生1hz到40mhz左右正弦波的芯片。淘宝的产品经销商能够将芯片与提供 TTL 电平控制的小板配对,然后以令人难以置信的 60元(或更低!)的价格出售。 要控制 AD985

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包