目录
一、设计任务
智能台灯是一种基于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,"","","");
}
}
}
五、说明书
目录
有问题私聊,微信:lwfw123456789