完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
系统基于STC89C52RC单片机设计,拥有自动与手动两种模式,自动模式下可以过热释红外传感器检测是否有人,采用光敏电阻构成的电路检测环境光的强度,从而自动实现灯的自动开启和关闭;手动模式下可以使用wifi连接手机,通过手机app手动控制不同灯的开启和关闭并可控制各LED灯的光亮度,并采用可移动充电式电源供电,满足不同场景的需求。系统简单易行、控制方便,可用于传统照明的节能改造。 设计思路 本系统基于STC89C52单片机设计,可实现灯具的自动控制;同时,结合esp8266wifi模块通过安卓手机端app与wifi模块进行数据通信,实现对被控对象的无线连接手动控制。主要功能如下: (1)自动模式: 通过光敏电阻和热释红外传感器分别自动检测光的强弱和是否有人,室内无人或者光照充足时自动灭灯,灭灯时间延时一分钟;有人到且光照不足时自动开灯;该模式即节约了人力资源又节约了大量电能。 (2)手动模式:开启手机wifi,通过手机APP手动控制灯的开启和关闭,使用手机轻松控制灯的开关,方便快捷。 图1 系统框图 硬件设计 wifi模块 wifi模块采用esp8266,对wifi模块进行配置就需要使用到AT指令集。其最基础的一些AT指令集在下面贴出,部分会在代码中使用到。 WIFIAT+CIPMUX=1AT+CIPSERVER=1,80 //修改端口号 AT+CWMODE=3 //设置模式 AT+RST //重启 AT+CWJAP="WiFixdd","xiaojieying" //搜索并连接路由器 AT+CIPMODE=1 //透传 AT+CIPMUX=0 //单路模式 AT+CIPSTART="TCP","172.29.242.2",8080 //连接手机端 AT+CIPSEND //进入透传 若想深入研究自行找资料学习AT指令集。 热释电传感器 HC-SR501 人体红外传感器模块是基于红外技术的自动控制模块,它可以检测人或某些动物发出的红外辐射并输出电信号我们使用的 。 电源模块 电源模块采用18650可充电电池,由于其供电电压为3.6V,不能很好的为电路工作,所以我们通过升压模块对其进行电压放大,以达到标准供电电压5V。并能通过变压充电模块为18650电池充电。 驱动电路 由于52单片机的IO口驱动能力较弱,无法满足大型LED灯的需要,所以我们在这里通过三极管进行电流放大,该驱动电路通过电阻对单片机IO口进行降压,使得三极管得以导通,并对单片机IO口电流进行放大,以达到驱动该大型灯泡的能力,并给每一个LED灯串联一个限流电阻,已达到保护LED灯延长使用寿命的作用。该电路共使用六个大型LED灯照明,三黄三白,不同颜色交替摆放,已保证单种颜色灯光的照明范围。 要注意的是实物硬件电路板对led灯的一个布局,以及合理跳线的一个问题。 代码实施 程序主要模块是通过单片机串口与蓝牙进行通信。由于STC89c52没有独立的波特率发生器,所以我们这里将定时计数器T1改装成波特率发生器,产生9600的标准波特率,并通过串口中断函数对读取数据进行接收,并将串口中断优先级调到最高。 下面是手机APP与单片机的简单通信协议,创建单独协议的目的是为了对以后项目扩展,技术升级留下足够的预留空间,并可以保证产品的加密安全性。 通过对程序的算法设计,该智能灯泡可达到黑夜可自动控制,有人经过则自动开起,并保持最大可调时间10分钟后自动熄灭。通过手机APP控制LED的开关以及亮度调节,若夜晚通过手机APP开起灯光,人经过后无需手机关闭即可自动关闭,以防止由于忘关造成的电力浪费。以下是主程序流程图。 #include "reg52.h" #include"uart.h" #include"led.h" #include ***it MAN=P1^4; int main() { unsigned char dat=0; NewLineReceived = 0; MAN=1; ColorLED_Init(); //LED灯初始化 Serial_Init(); //串口初始化 ms_delay(1000); WIFI_Init(); //WIFI模块初始化 timer0_init(); //定时计数器零初始化 color_led_pwm(0, 0); while(1) { if(MAN==0) { color_led_pwm(255, 255); while(MAN==0) ; color_led_pwm(0, 0); } if(NewLineReceived == 1) { uart_send_string("Init OK!"); serial_led();//调用串口解析函数 NewLineReceived = 0; } } } #include "reg52.h" ***it LED_W = P1^0; ***it LED_W1=P1^1; ***it LED_W2=P1^2; ***it LED_Y = P1^5; ***it LED_Y1 = P1^6; ***it LED_Y2 = P1^7; unsigned char whitenum=0; unsigned char yellownum=0; unsigned char ledWnum=0; unsigned char ledYnum=0; void ColorLED_Init() { LED_W = 1; LED_W1 = 1; LED_W2 = 1; LED_Y = 1; LED_Y1 = 1; LED_Y2 = 1;} void color_led_pwm(unsigned char v_iwhite, unsigned char v_iyellow)//点亮相应颜色的灯 { whitenum = v_iwhite; yellownum = v_iyellow; } /*** Function ledRPwmWrite* @author Danny* @date 2017.08.16* @brief LED_R产生pwm* @param void* @retval void* @par History 无*/ void ledWPwmWrite() { if((whitenum != 0) && (whitenum!=255)) { if(ledWnum <= whitenum) { LED_W=1; LED_W1=1; LED_W2=1; } else { LED_W=0; LED_W1=0; LED_W2=0; } } else if(whitenum==0) { LED_W=0; LED_W1=0; LED_W2=0; } else if(whitenum==255) { LED_W=1; LED_W1=1; LED_W2=1; }} /*** Function ledGPwmWrite* @author Danny* @date 2017.08.16* @brief LED_G产生pwm* @param void* @retval void* @par History 无*/ void ledYPwmWrite() { if((yellownum != 0)&&(yellownum!=255)) { if(ledYnum<=yellownum) { LED_Y=1; LED_Y1=1; LED_Y2=1; } else { LED_Y=0; LED_Y1=0; LED_Y2=0; } } else if(yellownum==0) { LED_Y=0; LED_Y1=0; LED_Y2=0; } else if(yellownum==255) { LED_Y=1; LED_Y1=1; LED_Y2=1; }} void Update_ColorPWM() { ledWPwmWrite(); ledYPwmWrite();} void timer0_init() { TMOD|=0X01; //定时器T0工作方式1,定时器T1工作方式2 TH0=0XFF; //100us定时,装入初值 TL0=0XA4; TR0=1; //启动T0工作 ET0=1; //允许T0中断 EA =1; //开总中断 PT0=0; } void timer0() interrupt 1 { TH0=0XFF; //50us定时,装入初值 TL0=0XD2; //控制pwmled ledWnum++; ledYnum++; Update_ColorPWM(); } #include "reg52.h" #include #include #include #include"led.h" bit NewLineReceived = 0; //串口接收完成标志位bit StartBit = 0; //协议开始标志int g_num=0; //定义变量int g_packnum=0;char InputString[50] = {0}; //用来储存接收到的内容 /*** Function StringFind* @author Danny* @date 2017.08.16 * @brief 字符串查找* @param[in] pSrc:源字符串; pDst:查找的字符串; v_iStartPos:源字符串起始位置* @param[out] void* @retval void* @par History 无*/int StringFind(const char *pSrc, const char *pDst, int v_iStartPos) { int i, j; for (i = v_iStartPos; pSrc!=' |