基于stm32f4开发的智能台灯(代码片段)

canoe1996 canoe1996     2023-01-21     418

关键词:

基于STM32F4开发的智能台灯

写这篇博客的目的有2个,首先是记录一下学习STM32大半年来的第一个自己动手开发的项目,整理一下开发过程和思路;其次也是希望可以和更多的同行交流开发经验,有什么问题可以多多讨论,集思广益,共同进步~

设计目标以及功能说明

开发的智能台灯功能有2个:
1.手动模式:可通过按键调节LED灯亮度,共10档;
2.自动模式:当检测到有人在的条件下,根据环境光照强度自动调节LED灯亮度;当检测到无人在,将进入延时,延时时间结束将关闭LED灯。

原理图


由于是在面包板上焊接的电路,原理图画的比较粗糙;
首先核心控制器件选用的是正点原子的STM32F407核心板,这款核心板功能非常齐全,应付一般的项目开发控制绝对是够了,自己手头上项目也是用这个做的。
手动模式下的LED控制:这个就比较简单,直接核心板输出一个定时器TIM13-PWM的脉宽调制信号到LED灯上,按键上下调节占空比即可调节亮度,相信了解PWM控制原理的小伙伴一看就知道是怎么回事~
自动模式下的LED控制:
1.红外探测模块可以去淘宝上搜索,有很多成熟的模块选用,总的来说就是这种模块可以在一定范围内检测到有人即可输出高电平信号,没有人就保持低电平;我选用的是HC-SR501,质量不是很好,本来有2种模式,不可重复触发模式:即探测到人就输出一定时间的高电平然后变为低电平;可重复触发模式:探测到有人一直输出高电平知道人离开延时结束。
2.将红外探测模块接到MCU的ADC1通道2,当adcx2得到的值大于1500,就说明有人,此时光敏电阻与电位器串联的电路通过ADC1通道3检测电压信号即代表了环境亮度,然后经过简单的数学公式建立通道3检测的到的adcx3与PWM占空比的关系,就可以实现根据环境亮度实时调节LED亮度的功能。
3.当检测到无人时,在程序里面设置了for循环+delay,延时时间可以自己设置,延时一段时间后就跳出循环,等待下一个红外探测模块的高电平进入循环。

程序代码

代码是在keil5里面用C语言写的,下面就把主程序的代码放上来,里面注释的很清楚,大家可以看一下

在这里插入代码片int main (void)


	volatile u8 t=0;
	volatile u8 i=0;
	volatile u8 key;	//按键
	volatile u16 led0pwmval = 499;//LED灯亮度值  0为最亮,499为最弱
	volatile u8 SD_Mode = 0;//手动模式
	volatile u16 adcx0;
	volatile u16 adcx1;
		
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);      //初始化延时函数
	uart_init(115200);		//初始化串口波特率为115200
	LCD_Init();					//LCD初始化
	LED_Init();					//初始化LED 
	KEY_Init(); 				//按键初始化
  Adc_Init(); 				//adc初始化
	TIM13_PWM_Init(500-1,84-1);	//84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.
	TIM_SetCompare1(TIM13,led0pwmval);	//修改比较值,修改占空比
	POINT_COLOR=RED; 

	LCD_ShowString(30,50,200,16,16,"CANOE @ Light");	
	delay_ms(5000);
while(1)

	
  while (SD_Mode == 0)//自动模式
	
	LCD_ShowString(30,70,200,16,16,"zidongmoshi");	
	LCD_ShowString(30,150,200,16,16,"LIGHT_VAL:");	
	key=KEY_Scan(0);		
	if(key==KEY0_PRES||key==WKUP_PRES)  //在自动模式下,如果检测到有按键按下,则退出自动模式进入手动模式
	
	SD_Mode = 1;
		
	
	TIM_SetCompare1(TIM13,499);
	adcx0=Get_Adc_Average(ADC_Channel_2,10);		//通过ADC1探测得到红外探测模块的输出值,当有人活动时会监测得到高电平  
	if (adcx0 >  1500)  //当探测得到高电平时,根据ADC通道3采集得到光敏电阻的值来调节亮度值
		
	
	for(i=0;i<100;i++)
	
	adcx1=Get_Adc_Average(ADC_Channel_3,10);//采集得到光敏电阻的值,环境亮度越暗得到的值越小,亮度越高得到的值越大
		                                      //adcx1的值处于1200~4000范围内
	led0pwmval = (adcx1 - 1200)/6;		
	TIM_SetCompare1(TIM13,led0pwmval);	//修改比较值,修改占空比
	POINT_COLOR=BLUE;//设置字体为蓝色 
	LCD_ShowxNum(110,150,(500-led0pwmval),4,16,0);     	   //显示 亮度值	
	delay_ms(100);	
	key=KEY_Scan(0);		
	if(key==KEY0_PRES||key==WKUP_PRES)  //在自动模式下,如果检测到有按键按下,则退出自动模式进入手动模式
	
	SD_Mode = 1;
	i=100;
	
	
	
	
	
	
	

	led0pwmval = 300;
	while(SD_Mode == 1)  //手动模式下 按键增减LED亮度
		
	
		LCD_ShowString(30,70,200,16,16,"shoudongmoshi");
		
		LCD_ShowString(30,90,200,16,16,"WK_UP:+  KEY0:-");	 
	  POINT_COLOR=BLUE;//设置字体为蓝色      	 
	  LCD_ShowString(30,150,200,16,16,"LIGHT_VAL:");	  

		t++;
		key=KEY_Scan(0);			  
		if(key==WKUP_PRES)
				 
			if(led0pwmval<499)led0pwmval+=40;
			TIM_SetCompare1(TIM13,led0pwmval);	//修改比较值,修改占空比
		
		else if(key==KEY0_PRES)	
		
			if(led0pwmval>45)led0pwmval-=40;
			else led0pwmval=0;
			TIM_SetCompare1(TIM13,led0pwmval);	//修改比较值,修改占空比
			
		if(t==10||key==KEY0_PRES||key==WKUP_PRES) 	//WKUP/KEY1按下了,或者定时时间到了
			
		
			LCD_ShowxNum(110,150,(500-led0pwmval),4,16,0);     	   //显示 亮度值
			LED0=!LED0;	   
			t=0;
		
		delay_ms(10);	
	
	







实物图

结束语

本人现在是科研狗一枚,这个小东西是在老师给的项目忙里偷闲花了3天时间做出来的,主要是为了熟悉STM32开发的一些东西,后面有时间还会陆续做一些其他有些意思的项目,大家如果有什么好玩的项目想法创意之类的可以私信我一起交流,有机会一起做些有意思的事~
有什么问题留言区或者私信我讨论,邮件也可以(18642896070@163.com),欢迎交流~

stm32f4基于库函数移植dsp源码“dsp简介及工程创建“(代码片段)

文章目录DSP简介一、可供移植的DSP文件BasicMathFunctionsCommonTablesComplexMathFunctionsControllerFunctionsFastMathFunctionsFilteringFunctionsMatrixFunctionsStatisticsFunctionsSupportFunctionsTransformFunctions!!!所有这些 查看详情

基于stm32f103的智能门锁系统(代码片段)

基于STM32F103的智能门锁系统直接说明实现了什么效果1指纹解锁(基于AS608)2RFID解锁(基于RC522)3密码解锁(基于LCD电容屏触摸控制)4蓝牙解锁(基于HC-06)5后台服务器管理开锁信息(基于ESP8266)6APP... 查看详情

stm32f4hal库开发--rtc(代码片段)

一、STM32F407RTC时钟简介STM32F407的RTC,是一个独立的BCD定时器/计数器。RTC提供了一个日历时钟(包含年月日时分秒信息)、两个可编程闹钟(ALARMA和ALARMB)中断,以及一个具有中断功能的周期性可编程唤醒... 查看详情

stm32f4hal库开发--gpio(代码片段)

这种外设都之前都讲过了,专栏:stm32库开发实战指南。但是使用STM32CubeMX该配置配置呢??接下来看一下。一、GPIO简介STM32F4的IO可以由软件配置成如下8种模式中的任何一种:1、输入浮空2、输入上拉3、输入... 查看详情

stm32f4hal库开发--串口(代码片段)

...据位长度、奇偶校验位、DMA等信息。具体参看:STM32开发–串口详解二、函数1、串口参数初始化,并使能串口。HAL_StatusTypeDefHAL_UART_Init(UART_HandleTypeDef*huart);该函数只有一个入口参数huart,为UART 查看详情

stm32f4hal库开发--时钟使能和配置(代码片段)

在STM32F4的HAL库中,外设时钟使能操作都是在RCC相关固件库文件头文件stm32f4xx_hal_rcc.h定义的。外设时钟使能在HAL库中都是通过宏定义标识符来实现。首先,我们来看看GPIOA的外设时钟使能宏定义标识符。#define__HAL_RCC_GPIOA_CL... 查看详情

stm32f4hal库开发--spiflash(代码片段)

一、驱动bsp_spi_flash.c#include"THC_Board_include_h.h"/*Privatedefine------------------------------------------------------------*/#defineW25X_WriteEnable0x06//写使能#defineW25X_WriteDisable0x04//写失能 查看详情

stm32f4hal库开发--新建基于hal库的工程模板(代码片段)

...ubeF4固件包下载下载:STM32CubeF4MCUFirmwarePackage二、新建基于HAL库的工程模板1、新建文件夹建立一个文件夹为Template。这是工程的根目录文件夹。然后为了方便我们存放工程需要的一些其他文件,这里我们还新建下面4个子文... 查看详情

stm32f4hal库开发--dma(代码片段)

一、DMA简介DMA之前有讲过,参看:STM32开发–DMA详解DMA,全称为DirectMemoryAccess,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I... 查看详情

stm32f4基于库函数移植dsp源码“dsp简介及工程创建“(代码片段)

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档... 查看详情

stm32f4hal库开发--nvic中断优先级管理(代码片段)

一、中断寄存器STM32F429xx的96个中断里面,包括10个内核中断和91个可屏蔽中断,具有16级可编程的中断优先级,而我们常用的就是这91个可屏蔽中断。在MDK内,与NVIC相关的寄存器,MDK为其定义了如下的结构体。/... 查看详情

stm32f4hal库开发--工程模板解读(代码片段)

一、关键文件介绍1、HAL库关键文件stm32f4xx_hal_ppp.c/.h基本外设的操作API,ppp代表任意外设。其中stm32f4xx_hal_cortex.c/.h比较特殊,它是一些Cortex内核通用函数声明和定义,例如中断优先级NVIC配置,系统软复位以及Systic... 查看详情

arduino框架下stm32f1/f4系列hid模式程序烧录教程(代码片段)

...er烧录模式"Uploadmethod":"HIDbootloader2.2"开发固件基于已编译好的BootLoaderHex文件(包含STM32F1和STM32F4系列的BootLoaderHex文件& 查看详情

基于stm32f103c8t6的智能垃圾桶项目(代码片段)

基于STM32F103c8t6的智能垃圾桶项目写在前头软件配置硬件部分1.主控芯片2.HC-SR04超声波模块模块简介模块参数工作原理GPIO配置3.SG90舵机模块简介模块参数工作原理GPIO配置3.OLED显示屏模块简介模块参数工作原理GPIO配置软件部分HC-SR0... 查看详情

stm32f4hal库开发--独立看门狗(iwdg)(代码片段)

之前讲过看门狗,参看:STM32开发–看门狗详解一、HAL库配置独立看门狗步骤1、取消寄存器写保护,设置看门狗预分频系数和重装载值。首先我们必须取消IWDG_PR和IWDG_RLR寄存器的写保护,这样才可以设置寄存器IWDG... 查看详情

stm32f4hal库开发--gpio(代码片段)

这种外设都之前都讲过了,专栏:stm32库开发实战指南。但是使用STM32CubeMX该配置配置呢??接下来看一下。一、GPIO简介STM32F4的IO可以由软件配置成如下8种模式中的任何一种:1、输入浮空2、输入上拉3、输入... 查看详情

stm32f4hal库开发--温度传感器(ds18b20)(代码片段)

参看:《嵌入式-STM32开发指南》第三部分外设篇-第2章温度传感器DS18B20这篇文章讲的非常详细了。一、简介1、概述DS18B20是DALLAS最新单线数字温度传感器,新的"一线器件"体积更小、适用电压更宽、更经济。Dallas半导体公... 查看详情

基于stm32f407设计的蓝牙遥控小车(代码片段)

开始语新的博客来了,博主继上个做完智能台灯项目后一直想做智能小车项目,在做老师给的项目之外抽空做了一下小车;首先强调一下,这个小车只是半成品,按照我的进度只做到50%,写这篇的博客的目... 查看详情