基于STM32的智能台灯_自动亮度_久坐提醒仿真设计(Proteus仿真+程序设计+设计报告+讲解视频)

发布于:2025-05-21 ⋅ 阅读:(22) ⋅ 点赞:(0)


基于STM32的智能台灯_自动亮度_久坐提醒仿真设计

(Proteus仿真+程序设计+设计报告+讲解视频)

仿真图Proteus 8.9

程序编译器:keil 5

编程语言:C语言

设计编号:C0112

1.主要功能

智能护眼灯

结合当前嵌入式技术,具有灯光亮度调节、人走自己关灯和久坐提醒功能。

1.上电默认是自动模式,自动模式灯亮。光照越弱,台灯越亮。

2.自动模式下人体红外热释电检测到有人自动开灯同时计时。

3.监测到久坐(仿真30秒方便测试)后蜂鸣器报警,LCD1602显示Please Activity,人离开后蜂鸣器自动关掉。

4.按键切换手动模式,模式下可以通过按键手动调光。

5.使用LCD1620显示环境光亮度,灯光亮度级别和久坐计时时间。

6.使用Proteus仿真,灯珠用LED灯代替。

STM32F103系列芯片 人体红外热释电 光照传感器 LCD1602

资料下载链接:

通过网盘分享的文件:KEY_C0112

链接: https://pan.baidu.com/s/1FwWffUhRNRludhkpC8j_ag?pwd=n4at

提取码: n4at

2.仿真设计

开始仿真后是自动模式,LCD1602液晶第一行显示LIGHT光照强度=440Lux。红外热释电开关闭合,第二行显示久坐时间和灯光亮度。串口传输光照强度和灯光亮度。虚拟示波器显示灯光PWM波形。

开始仿真 有人在完善

按下按键,调整手动模式,LCD1602第二行显示灯光亮度,可以通过按键+和按键-调整亮度。

手动模式

3.程序设计

程序是用keil5 mdk版本打开的,如果打开有问题,核实下keil的版本。程序是HAL版本编写的,有stm32cubemx配置文件。有注释可以结合讲解视频理解。

程序

int main(void)
{
  /* USER CODE BEGIN 1 */


	char dis_str1[]="				 ";  //输出字符串内容设置16个字符 英文+标点+数字
	char dis_str2[]="				 ";  //输出字符串内容设置16个字符 英文+标点+数字
	
//	ADC_ChannelConfTypeDef sConfig = {0};  //建立sConfig结构体	
	char str[20];  //字符串的存放数组
//	uint32_t adcv;  //存放ADC转换结果

	float temp;
	
  uint16_t ADC_Value[2] = {0};  //用于存放ADC数据
//	uint8_t i;  //定义循环变量	
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

	
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();

  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_TIM2_Init();
	MX_ADC1_Init();
  /* USER CODE BEGIN 2 */
//  MX_GPIO_Init();
//  MX_USART1_UART_Init();
//  MX_DMA_Init();
//  MX_ADC1_Init();  
//	SMG_Write_Data(0,gsmg_code[0]);
    LCD_Init();
    HAL_UART_Transmit(&huart1, (uint8_t *)&"adc_dm1", 7, 10);  //串口1发送字符串,数组长度为12,超时10ms
    HAL_ADCEx_Calibration_Start(&hadc1);   //开启adc前校准一下ADC
	  HAL_Delay(10);
 	  HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&ADC_Value,2);//开启ADC的DMA,采集的数据直接放入 AD_Buf这个数组里,操作简单。
	  HAL_UART_Transmit(&huart1, (uint8_t *)&"adc_dma", 7, 10);  //串口1发送字符串,数组长度为12,超时10ms 
	
    HAL_TIM_Base_Start_IT(&htim2);  //初始化定时器
    user_pwm=50;
    refresh_flag=1;
  	BEEP=0;

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

		HAL_ADCEx_Calibration_Start(&hadc1);   //开启adc前校准一下ADC
 	    HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&ADC_Value,2);//开启ADC的DMA,采集的数据直接放入 AD_Buf这个数组里,操作简单。
		if(state==0&&refresh_flag){//通道1采集 自动模式
		   temp=ADC_Value[0];//得到AD值
			 temp=light_intensity(temp);	//转化为光照强度
		   sprintf(str,"auto_temp=%0.0f\r\n",temp);
		   HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), 30);//串口1发送字符串,数组长度为strlen(str),超时20ms
		   memset(str,0,strlen(str));  
 
		   if(INF_DET==1){//没有人在
		   	user_pwm=0;
		   }else{
		   	user_pwm=(float)temp*(100.0/1000);  
				 user_pwm=100-user_pwm;//自动模式PWM的范围是0-100  
		   }
		  
		   sprintf(str,"user_pwm=%d%%\r\n",user_pwm);
			HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), 30);//串口1发送字符串,数组长度为strlen(str),超时20ms
		   refresh_flag=1; 
			STATE_LED=0;//模式灯点亮

		}else if(state==1&&refresh_flag){//手动模式
			STATE_LED=1;//模式灯熄灭
		  temp=ADC_Value[0];//得到AD值
			temp=light_intensity(temp);	//转化为光照强度
			sprintf(str,"manl_temp=%0.0f\r\n",temp);
			HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), 30);//串口1发送字符串,数组长度为strlen(str),超时20ms

		}

		HAL_ADC_Stop(&hadc1);											//停止ADC1	
		HAL_Delay(200);
//		if(INF_DET==1){//没有人
//			HAL_UART_Transmit(&huart1, (uint8_t *)"out\r\n", 5, 30);//串口1发送字符串,数组长度为5,超时30ms
//		}else{
//			HAL_UART_Transmit(&huart1, (uint8_t *)"ing\r\n", 5, 30);//串口1发送字符串,数组长度为5,超时30ms
//
//		}
		 sprintf(dis_str1,"LIGHT=%0.0f Lux    ",temp);
		 LCD_ShowString(0,0,dis_str1);
		 if(state==0){//自动模式 而且人在
			 if(INF_DET==0){
				if(inf_count<COUNT_NUM){//久坐判断
					  sprintf(dis_str2,"TIME=%d LAMP=%d%%  ",inf_count,user_pwm);
				 }else{
						sprintf(dis_str2,"Please Activity  ");//久坐提醒
				 }		 
			 }else{
					sprintf(dis_str2,"                       ");
			 }
			
		 }else if(state==1){//手动模式
			 sprintf(dis_str2,"LAMP_L=%d%%       ",user_pwm);
		 }
		
		 LCD_ShowString(1,0,dis_str2); 
  }
  /* USER CODE END 3 */
}

img

程序流程图

img

4.设计报告

9608字设计报告,内容包括设计目标、硬件设计、软件设计、结论等。

img

随着嵌入式技术的快速发展,智能照明设备在健康照明领域的应用日益广泛。传统台灯功能单一,无法根据环境光自动调节亮度,且缺乏久坐提醒等健康管理功能。结合STM32单片机、传感器技术与人机交互设计,开发一款智能护眼灯,可有效改善用眼环境,降低视觉疲劳,符合现代人对健康生活的需求。

通过本次设计,我们希望能够提高对单片机的理解和应用能力。通过实践和探索,我们希望能够掌握相关的硬件和软件设计方法,为今后的学习和工作打下坚实的基础。同时,我们也希望能够通过这次设计,培养我们的团队协作能力和创新精神。

5.下载链接

0、常见使用问题及解决方法–必读!!!!

1、程序代码

2、Proteus仿真

3、功能要求

4、开题报告

5、设计报告

6、框图

7、讲解视频

Altium Designer 安装破解

KEIL+proteus 单片机仿真设计教程

KEIL安装破解

Proteus元器件查找

Proteus安装

Proteus简易使用教程

单片机学习资料

相关数据手册

答辩技巧

设计报告常用描述

鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url

img

资料下载链接:

通过网盘分享的文件:KEY_C0112

链接: https://pan.baidu.com/s/1FwWffUhRNRludhkpC8j_ag?pwd=n4at

提取码: n4at