STM32开发实例_基于STM32单片机的智能台灯系统(电路图+程序+流程图)24-32-04

一.系统概述

智能台灯系统多功能台灯系统能够智能化地调节亮度、监测人体活动、感知环境光照,并实现定时和报警功能,提升了用户的使用体验和功能扩展性,具体包括以下主要功能:
1. 亮度调节:
   - 系统在自动模式和手动模式下调节台灯的亮度,自动模式下根据光强进行自动调节,手动模式下通过按键进行灯光亮度的调节。
2.坐姿调节:
   - 通过红外光电开关检测台灯与人体之间的距离,距离过近则报警提醒。
3. 学习定时:
   - 使用时钟模块进行学习定时时间的提醒,并通过OLED显示屏显示实时时间,到达定时时间蜂鸣器报警提醒。
4. 光照采集:
   - 利用光敏电阻模块进行光强检测并通过OLED显示屏进行数据显示。

 二.电路设计

电路图采用Altium Designer进行设计:
1. 系统电路中的STM32F103C8T6单片机最小系统是系统的控制核心;
2. 通过DS1302实现时钟定时,并通过SDA、SCK、DAT三个引脚与单片机进行连接;
3. 通过光电开关进行人体检测,模块的数据输出脚与单片机的GPIO口直接连接;
4. 使用独立按键进行灯光控制和模式切换,按键的一端接地,一端接单片机的GPIO口;;
5. 通过0.96寸的OLED12864进行数据显示,采用IIC总线的形式与单片机进行通信;
6. 使用光敏电阻模块进行光强检测,传感器的模拟端与单片机的模拟输入端相接。

  三.程序设计

#include "stm32f10x.h"
#include "OLED_I2C.h"
#include "ds1302.h"
#include "timer.h"
#include "gpio.h"
#include "delay.h"
#include "key.h"
#include "adc.h"
#include "stdio.h"
#include "string.h"

unsigned char setn=0;
unsigned char txshi=12,txfen=0,txmiao=0;
u8 tixing=0;//0:时间提醒关,1:时间提醒开
u8 mode=0;//0:自动模式,1手动模式
unsigned char miao = 0;//没有人的计时时间
unsigned char PWM_Val = 0xFF;//用于PWM调节
unsigned char GearTemp = 0;//0~3档
u8 RemindFlag=0;//提醒时间到了标志
u8 PostureFlag=0;//坐姿提醒

int main(void)
{
	char i=0;
	
	DelayInit();
	I2C_Configuration(); //IIC初始化
	OLED_Init(); //OLED初始化
	KEY_Init(); //按键初始化
	BEEP_AND_GD_RTHW_GPIO_Config();
  OLED_CLS();//清屏
	DS1302_Init(&SysDate);
	DelayMs(100); 
	DS1302_DateRead(&SysDate);//读时间 
	OLED_CLS();//清屏
	for(i=0;i<4;i++)OLED_ShowCN(i*16,2,i+8,0);//测试显示中文:亮度等级
	OLED_ShowStr(62,2,": ",2);//显示冒号
	for(i=0;i<4;i++)OLED_ShowCN(i*16,4,i,0);//测试显示中文:提醒时间
	DisplayMode();
  TIM2_Init(49,71);     //定时器初始化,定时50us
	TIM3_Init(499,7199);  //定时器初始化,定时50ms
	//Tout = ((arr+1)*(psc+1))/Tclk ;  
	//Tclk:定时器输入频率(单位MHZ)
	//Tout:定时器溢出时间(单位us)
	while(1)
	{
		  KeySettings();
	    DisplayTime();
		  DisplayTiXingTime();
		  AutoHandle();
		  LedGearHandle(GearTemp);
		  if(GD == 0)//检测坐姿不正确
			{
					if(PostureFlag==0)
					{
							PostureFlag=1;
						  BEEP=1;//蜂鸣器提醒
						  OLED_CLS();//清屏
						  for(i=0;i<6;i++)OLED_ShowCN(i*16+16,2,i+16,0);//测试显示中文:请注意坐姿!
						  DelayMs(1000); 
						  OLED_CLS();//清屏
						  for(i=0;i<4;i++)OLED_ShowCN(i*16,2,i+8,0);//测试显示中文:亮度等级
							OLED_ShowStr(62,2,": ",2);//显示冒号
							for(i=0;i<4;i++)OLED_ShowCN(i*16,4,i,0);//测试显示中文:提醒时间
						  DisplayMode();
					}
			}
			else
			{
					PostureFlag=0;
			}
	}
}

void TIM2_IRQHandler(void)//定时器2中断服务程序	 
{ 
	  static u8 time_count = 0;
		if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{ 
				TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位
			  time_count++;
			  if(time_count > 200)time_count = 0;//10ms一个周期
				if(time_count >= PWM_Val)LED = 1;//占空比调节
				else LED = 0;  
	  }
}

void TIM3_IRQHandler(void)   //TIM3中断
{
		static u8 count=0,count2=0;
		if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{
				TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源 
			  if(count2++>=2)
				{
					  count2 = 0;
            if(GD == 1)
						{
							 if(RemindFlag==1 && txshi==SysDate.hour && txfen==SysDate.min)
							 {
									 BuzzerSound();
							 }
							 else
							 {
									 BEEP=0;
							 }
						}
				}
        if(count++ >= 20)//1秒时间到
				{
						count = 0;
						if(RTHW==1)miao=30;//检测到有人,时间赋值30秒
					  else
						{
								if(miao>0)miao--;//没有人,30秒倒计时
						}
				}
		}
}

 四.资料内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小常硬件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值