智能LED灯基于STC89C52RC单片机设计,拥有自动与手动两种模式:
1)自动模式,可以过热释红外传感器检测是否有人,采用光敏电阻构成的电路检测环境光的强度,从而自动实现灯的自动开启和关闭;
2)手动模式,可以使用WIFI连接手机,通过手机App手动控制不同灯的开启和关闭,并可控制各LED灯的光亮度。
智能LED灯采用可移动充电式电源供电,满足不同场景的需求。系统简单易行、控制方便,可用于传统照明的节能改造。
设计思路
可实现灯具的自动控制;同时,结合ESP8266 WIFI模块,通过安卓手机端App与Wifi模块进行数据通信,实现对被控对象的无线连接手动控制。
系统框图
硬件设计
1)Wifi模块:
采用ESP8266对Wifi模块进行配置,就需要使用到AT指令集。其最基础的一些AT指令集在下面贴出,部分会在代码中使用到。
WIFIAT+CIPMUX=1AT+CIPSERVER=1,80 //修改端口号
若想深入研究自行找资料学习AT指令集。
2)热释电传感器
HC-SR501 人体红外传感器模块是基于红外技术的自动控制模块,它可以检测人或某些动物发出的红外辐射并输出电信号我们使用的 。
3)电源模块
电源模块采用18650可充电电池,由于其供电电压为3.6V,不能很好的为电路工作,所以我们通过升压模块对其进行电压放大,以达到标准供电电压5V。并能通过变压充电模块为18650电池充电。
4)驱动电路
由于单片机的IO口驱动能力较弱,无法满足大型LED灯的需要,所以在这里通过三极管进行电流放大。
该驱动电路通过电阻对单片机IO口进行降压,使得三极管得以导通,并对单片机IO口电流进行放大,以达到驱动该大型灯泡的能力,并给每一个LED灯串联一个限流电阻,已达到保护LED灯延长使用寿命的作用。该电路共使用六个大型LED灯照明,三黄三白,不同颜色交替摆放,已保证单种颜色灯光的照明范围。
要注意的是实物硬件电路板对led灯的一个布局,以及合理跳线的一个问题。
代码实施
程序主要模块是通过单片机串口与蓝牙进行通信。由于STC89c52没有独立的波特率发生器,所以将定时计数器T1改装成波特率发生器,产生9600的标准波特率,并通过串口中断函数对读取数据进行接收,并将串口中断优先级调到最高。
下面是手机APP与单片机的简单通信协议,创建单独协议的目的是为了对以后项目扩展,技术升级留下足够的预留空间,并可以保证产品的加密安全性。
通过对程序的算法设计,该智能灯泡可达到黑夜可自动控制,有人经过则自动开起,并保持最大可调时间10分钟后自动熄灭。通过手机APP控制LED的开关以及亮度调节,若夜晚通过手机APP开起灯光,人经过后无需手机关闭即可自动关闭,以防止由于忘关造成的电力浪费。以下是主程序流程图:
main.c:
#include "reg52.h"
#include"uart.h"
#include"led.h"
#include sbit 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; } } } led.c: #include "reg52.h" sbit LED_W = P1^0; sbit LED_W1=P1^1; sbit LED_W2=P1^2; sbit LED_Y = P1^5; sbit LED_Y1 = P1^6; sbit 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(); } uart.c: #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}; //用来储存接收到的内容 可自行制作或下载第三方软件WiFi调试助手。建议使用安卓平台。安卓平台允许开发者根据自己的喜好和应用需求,设计出具有不同特色的实用软件。同时,安卓平台还能够适配多种硬件开发平台,对于硬件开发门槛要求低,极大地方便了用户对其进行相关的开发研究。此外,凭借其巨大的优势,安卓平台在当前开发平台领域中呈现逐年上升的趋势。因此在本设计中采用安卓平台进行本项目的设计开发。