基于stm32的智能台灯系统

目录

一、设计任务

二、总体设计

三、硬件设计

1、单片机最小系统

 2、复位电路

 3、显示模块

 4、光敏电阻电路设计

5、台灯电路

6、人体热释电模块

 四、软件设计

五、说明书


一、设计任务

        智能台灯是一种基于STM32系列单片机的智能灯具系统,它可以通过检测周围环境的光亮度和人体热释传感器来检测周围是否存在人员。该系统可以根据检测到的信息来自动调节灯具的亮度和颜色,以使灯光更加舒适和温馨,从而控制台灯的亮灯开关。当使用者离台灯太近时,发出声光警报。灯泡的工作时间可以设置,工作时间到了就会发出警报提示;如果晚上有强烈的光线,如果有人在走动。可以自动调节照明角度和高度,使得灯光能够更适合使用者。 若灯前长时间无人,台灯系统检测后自动选择熄灭状态,从而也体现了我们本产品的节能效果。

二、总体设计

 本系统主要由单片机,蜂鸣器,数显装置,LED,人体感应装置,光检测装置,按钮控件等构成:

1 TFTLCD液晶屏当达到了系统设定的时间后,会有一盏小灯会亮起来,并且会有一个铃声响起,这是在告诉用户,用户可以休息一段时间,避免因为学习太多而对自己的身体造成危害,用户在这个时候就会按下按钮,让自己的身体得到充分的休息。

系统将重新开始工作。

2.功能按钮:复位按钮,设定按钮,自动手动开关按钮,灯光调整按钮,启动定时按钮。

3.人的感应系统:在发现有人接近时,可根据灯光的强弱,将灯光进行开关。

三、硬件设计

1、单片机最小系统

该芯片的核心控制部分,采用了ARM32系列的 CortexM3,并由STM32单片机来实现。

 2、复位电路

        复位电路是目前比较常用的一种电路,它的设计比较简单,容易实现。为了防止过高的电流造成晶片的损伤,一般使用1 K欧姆的电阻器来分压。单片机一般可分为上电复位和手动键复位两种。上电-重置模式,在上电-重置的一刹那,不需要任何介入,就能自动完成;而人工重置,必须要用手按下按钮,才能完成。所以,在无控制时,可用人工复位电路。

 3、显示模块

TFTLCD的主要特征为:亮度高,对比度强,层次丰富,色彩鲜艳。它是当前液晶显示中最主要的一种。在电视,手机,计算机,平板电脑等各种电子设备上得到了广泛的应用。

 4、光敏电阻电路设计

该设计使用光敏电阻来实时探测当前的光线情况,当光线小于设定值时,会自动打开台灯,为用户提供光线。

5、台灯电路

       本设计利用单片机控制LED管脚,并利用L9110来驱动台灯亮度的控制,从而实现对台灯的控制。

6、人体热释电模块

该设计通过探测人体发出的红外线来检测人体活动情况。热释电探测仪的工作原理是发射红外线,不同的对象会反射出不同波长的红外线,热型红外传感器也称为无源红外传感器或者热释电红外传感器。

 四、软件设计

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key_s.h"
#include "lcd2TFT.h"
#include "buzzer.h"
#include "usart.h"	
#include "stmflash.h"
#include "RCC.h"
#include "IOin.h"
#include "timer.h"
#include "IOin.h"
#include "adc.h"

#define AUTO 0
#define MANU 1

//Flash掉电保护数据部分
#define LEN  50//保存数据个数(最后位数据为CRC)
u16 eep[LEN];
#define mode eep[45]
#define limitValue eep[46]

#define DIS_NUM 2//定义3个界面
#define DIS_RTC 2
#define DIS_PARA 1
#define DIS_DEFAUL 0

u8 refresh=1;
//u8 setRTC=0;
u8 setPara=0;
u8 disCtrl = DIS_DEFAUL;//0-RTC时钟;1-设置上下限;2-默认显示参数
u8 lightADC;
u8 someoneTrig = 0;
u8 usartKey = 0;
void readFlash(void);
void writeFlash(void);

void revAPP(void);
    u8 led_pwm=30;
    
    void sendAPP(void);

void Dis_RTC(void);
int main(void)
{
	u32 cnt=0; 
    u8 key; 
    u8 powerOn=0;//台灯开关

    u32 trig_cnt=0;
            
    //使用内部高速晶振HSI RC(8Mz)
    //配置SYSCLK->36MHz,HCLK->36MHz APB1->36MHz,APB2->36MHz,ADC1,2->18MHz
    SystemClock_Config();
    MY_NVIC_PriorityGroupConfig(2);        
    delay_Init(SysClockFreq/1000000);
    uart_init(SysClockFreq/1000000,9600);
    //printf("SysClockFreq = %d MHz\r\n",SysClockFreq/1000000);
    Adc_Init();
    LED_Init();
	delay_ms(500);
    LCD_Init();
    SR501_init();
    Buzzer_Init();
    KEY_Init();
    Beep(200);
    readFlash();  
    Beep(200);     
//Start:
    refresh = 1;    
    LCD_Clear();
    Beep(200);
    LCD_Clear();
	LCD_GotoTitle(20);
	LCD_Print("  智能台灯");
	while(1)
	{
        delay_ms(1);
        cnt++; 
        revAPP();	    
        if(cnt>200)
        {
            cnt = 0;
            LED = !LED;
            buzzer = 0;
            sendAPP();
            refresh = 1;

            lightADC = 100 - Get_Adc(ADC_CH0)/40.59f;//PA0采集光敏,光越强值越大~[0,100]         
            someoneTrig = readSR501();//采集热释电
            if(powerOn)
            {
                if(mode==AUTO)
                {
                    setPWM(100-lightADC);
                }
                else
                {
                    setPWM(led_pwm);
                }                
            }
            else
            {
                setPWM(0);
            }
   
            
            
            if(someoneTrig==0&&powerOn)
            {
                trig_cnt++;
                if(trig_cnt>30)
                {
                    powerOn = 0;
                }
            }
        }

        //扫描按键
        key = KeyScan(0);

        if(key)
        {
            Beep(200);
            refresh = 1;
            powerOn = 1;
            if(key==1)//+
            {              
                if(led_pwm>30)led_pwm-=30;
                else led_pwm = 0;

            }
            else if(key==2)//-
            {
                led_pwm+=30;
                if(led_pwm>90)led_pwm=90;
            }
            else if(key==3) //mode          
            { 
                if(mode==AUTO)mode=MANU;
                else mode=AUTO;
  
            }            
        }

        //LCD刷新
        if(refresh)
        {
            refresh = 0;
            if(setPara)
            {
                LCD_GotoXY(0,0);
                LCD_Print("set paras:");
                //0123456789abcdef
                //mode:AUTO L:123%
                LCD_GotoXY(0,1);
                LCD_Print("模式:");
                if(setPara==1&&LED)LCD_Print("    ");
                else
                {
                    if(mode==0)LCD_Print("自动");
                    else LCD_Print("手动");                    
                }
                               

                LCD_Print(" L:");  
                LCD_WrNUM(limitValue/10%10);                
                if(setPara==2&&LED)LCD_WrDat('_');else
                LCD_WrNUM(limitValue%10); 
                LCD_WrDat('%');            
            }
            else 
            {
                //0123456789abcdef
                //Trig:1 mode:AUTO
                //ON    Light:123%
                LCD_GotoXY(0,0);
                LCD_Print("监测:");
                if(someoneTrig)LCD_Print("有人");
                else LCD_Print("无人");
				
				
				
				
				LCD_GotoXY(0,1);
                LCD_Print("模式:");
                if(mode==0)LCD_Print("自动");
                else LCD_Print("手动");
				
                
                LCD_GotoXY(0,2);
				LCD_Print("计时:");
                LCD_WrNUM(trig_cnt/30%10);
                LCD_WrNUM(trig_cnt/3%10);
				
				LCD_GotoXY(0,3);
				LCD_Print("开关:");
                if(powerOn)
                {
                    LCD_Print("开");
                }
                else
                {
                    LCD_Print("关");
                } 
				LCD_GotoXY(0,4);
				LCD_Print("光强:");
                LCD_WrNUM(lightADC/100%10);
                LCD_WrNUM(lightADC/10%10);
                LCD_WrNUM(lightADC/1%10);
                LCD_WrDat('%');
                
				
                
            
            }
        }//refresh
   
	}//while(1)	 
}



void writeFlash(void)
{
//    u8 i,j;
//    for(j=0;j<LIB_NUM;j++)
//    {
//        for(i=0;i<4;i++)
//            eep[j*4 + i] = IC_Lib[j][i];
//    }
    Flash_Write(eep,LEN);
}

void readFlash(void)
{
//    u8 i,j;
    if(0==Flash_Read(eep,LEN))
    {
//        for(j=0;j<LIB_NUM;j++)
//        {
//            for(i=0;i<4;i++)
//                 IC_Lib[j][i] = eep[j*4 + i];
//        }
    }
    else
    {
        limitValue = 80;
    }
}

void sendAPP(void)
{
    static u8 step=0;
    static u8 psc=0;
    char str[20];
    char str1[20];
    
	//分频执行,降低发送速度
	psc++;
	if(psc < 5)return;
	else psc = 0;
 

    if(step== 0)APPsendLable0("光强","监测","模式","","","");
    else if(step== 3)APPsendLable1("","","","","","","","");
    else if(step==6)APPsendLable2("模式","亮度+","亮度-","");
    else if(step==9)APPsendTitle("智能台灯");
    else
    {
        sprintf(str,"%d",lightADC);
        if(mode==AUTO)sprintf(str1,"%s","自动");else sprintf(str1,"%s","手动");
        if(someoneTrig)
            APPsendValue(str,"有人",str1,"","","");
        else
            APPsendValue(str,"无人",str1,"","","");   
    }
    step++;
    if(step>10)step=0;    

}

void revAPP(void)
{
    char str[20];
    char str1[20];    
    if(revPara_F)
    {
        revPara_F=0;
        Beep(200);
        
//            limitValue = revDate[0];
//            mode = revDate[1];
        
        //Flash_Write(eep,LEN);
    }
    
    if(revLED_F&0x80)
    {
        Beep(200);
        if(revLED_F&0x01)
        {
                if(mode==AUTO)mode=MANU;
                else mode=AUTO;
        }
        if(revLED_F&0x02)
        {
                led_pwm+=30;
                if(led_pwm>90)led_pwm=90;
        }
        if(revLED_F&0x04)
        {
                if(led_pwm>30)led_pwm-=30;
                else led_pwm = 0;
        }        
        revLED_F = 0; 


{
        sprintf(str,"%d",lightADC);
        if(mode==AUTO)sprintf(str1,"%s","自动");else sprintf(str1,"%s","手动");
        if(someoneTrig)
            APPsendValue(str,"有人",str1,"","","");
        else
            APPsendValue(str,"无人",str1,"","","");     
}        
    }   
}


五、说明书

目录

绪 论

1.1课题研究及发展的历史及意义

1.2智能台灯国内外研究现状

第一章 系统的总体设计与方案分析

1.1智能台灯系统总体设计框图

1.2方案的选择

1.2.1 CPU模块

1.2.2 显示模块

1.2.3 红外传感器模块

第二章 智能台灯硬件设计

2.1单片机最小系统

2.2显示模块

2.3 光敏电阻电路设计

2.4 台灯电路

2.5 人体热释电模块

2.6蜂鸣器驱动

2.7 按键模块

第三章 智能台灯软件设计

3.1 软件编程语言

3.1.1 主程序部分代码

3.2蜂鸣器模块

3.3按键模块

3.4 TFTLCD显示屏模块

3.5热释电传感器模块

第四章 智能台灯软硬件调试

4.1 硬件调试

3.2 软件调试

总结

参考文献

致谢

有问题私聊,微信:lwfw123456789

  • 13
    点赞
  • 174
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

5132毕业设计

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

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

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

打赏作者

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

抵扣说明:

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

余额充值