9
收藏
微博
微信
复制链接

基于STC单片机的蓝牙台灯制作 带源码 原理图

提问于
2024-01-19 20:24

本帖最后由 橙子不洒脱 于 2017-5-16 16:04 编辑

模电&数电——卡通台灯复活记

       大学生活离不开宿舍生活,而宿舍生活又离不开属于自己的照明设备。有了它,才可以在熄灯之后的宿舍里继续如鱼得水。在刚进入大学校园的时候,母亲就给我买了一个卡通台灯,外观如图1所示。
                                                    图1 台灯外观.jpg
图1 台灯外观
此款台灯的照明部分由21个草帽型白发白高亮LED并联构成,亮度勉强但是没有亮度调整功能,在不同情况下亮度一致有些不尽人意。内置锂电池以及220v直插式充电电路以及充电时亮起的指示灯。灯的亮灭靠小人腹部的自锁开关控制。常有这样的情况发生:有光线上床方便,但爬到上铺却才想起没有关台灯,只好下床关灯在摸黑上床。虽有种种不便,使用久了反倒也习惯了。可是就在前不久的一次充电时,插头插入插座的瞬间外壳内发出“呲啦”声响,接着LED板短暂的发出异常亮度接着熄灭。见状我迅速将其拔出插座,尝试着按下开关后LED没有正常亮起,再次插入插座后充电指示灯也没有正常亮起,疑似损坏。拆开外壳取出电路板以及电池,发现充电电路为容阻降压电路,实物如图2所示。
图2 降压板实物.jpg

图2 降压板实物     
容阻降压电路利用电容在一定的交流信号频率下产生的容抗来限制最大工作电流,通常用于低成本取得非隔离的小电流电源,电路原理如图3所示。
图3 容阻降压电路.jpg


图3 容阻降压电路     
它的输出电压通常可在几伏到三几十伏,实际数值取决于所使用稳压管的参数,所能提供的电流大小正比于限流电容容量。但是仔细分析此台灯电路,只包括用于整流的四个二极管,降压作用的无极性电容,以及并联在电容两端,用于拔掉插头后对电容尽快放电的放电电阻,却并没有发现稳压管的踪影。如果输入端电压高于220v,后端电压也会随之升高,可能会损坏后级电路。与此同时,插入插座瞬间有浪涌电压产生,也可能会损坏后级电路,所以应该加入浪涌抑制电路,但此电路也没有包括,由此判断电压是损坏电路的主要元凶。随即拆下LED板,发现所有并联在一起的LED全部烧毁。到此,我打消了维修的欲望,打算将它丢掉重买自认倒霉。就在我将各部分残骸聚拢时,我看到了桌子上的一枚三脚管,拿起定神一看,这不是老师前几天才讲过的三端稳压芯片7805么,如果用它来作为输出稳压,效果会好很多,增加调光以及无线控制功能也不是不可能。这么想着,我打开了我的元件箱……一阵头脑风暴后,我发现我的台灯不但有救,还可以来个华丽大升级。
先来说说无线控制的实现。无线传输方式有很多种,我根据它们的主要特点对比列出了表格,见图4。
图4 常用无线通讯技术的对比.png

图4 常用无线通讯技术的对比     
                                                      
由表可以看出,蓝牙无线通讯是DIY的不二选择。价格对比其他几种设备相对低廉,技术成熟且资料丰富。另一方面,蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案,所以蓝牙天生跟串口有着密切的关系。配对以后的蓝牙串口模块可以当作半双工串口使用,无需了解任何蓝牙协议,但仅支持8位数据位、1位停止位、无奇偶校验的通信格式,不支持其他格式。不过这也是最常用的通信格式。可以说只要熟悉串口通信,就可以使用蓝牙串口模块实现无线控制了。顺带一提,蓝牙模块分为主机模块、从机模块、主从一体模块,主机模块只能配对从机模块,主机模块之间不能配对连接,主机模块也不能跟带蓝牙的电脑或者手机等其他蓝牙设备配对。从机模块可以跟带蓝牙的电脑或者带蓝牙的手机配对使用,从机模块之间也不能连接。因为这里仅仅要用手机的蓝牙连接台灯,所以选择从机模块。我选用的模块型号为HC-06,外观如图5所示。
图5 蓝牙模块外观.JPG
图5 蓝牙模块外观     
                 
模块TXD连接到单片机RXD,RXD连接到单片机TXD,接着就像串口一样使用了。其中STA为LED状态引出脚,单片机可通过STA引脚状态判断蓝牙是否已经连接,LED闪烁表示没有连接,常亮表示蓝牙已连接并打开了端口。EN为使能脚,悬空或接高时使能,使能就是当被外部拉低时关闭模块电源以节省电能(电流消耗<20uA),这两个引脚这里用不到,只做固定作用。

  接下来说供电方式,我打算去掉锂电池改为直插电源的形式,正在学的模电书告诉了我怎么做,如图6。

图6 7805典型电路.png
图6 7805典型电路
这么经典的电路,自然不用多说什么,就是在7805输出端上串联了一个自锁开关与台灯本身的开关相呼应,并且在输出端与地之间并联一个LED跟电阻作为电源指示灯,给原来的充电指示灯一个新的任务。由于功率不大,7805的温度并不高,所以未加装散热片。为了迎合台灯外壳的形状以便安装,我把洞洞板裁成条形,并以条形排列焊接。为方便调试,接口处使用二端接线柱连线,焊接的实物如图7所示。
      图7 7805焊接实物图.jpg
图7 7805焊接实物图
外壳内唯一有可能安装变压器的空间就是原本安装锂电池的位置,我找遍了手头上所有的变压器,最后终于在一个小音响套件里找到了一个宽度跟锂电池差不多的9V变压器,安装效果如图8所示。
      图8 安装变压器.jpg
图8 安装变压器
变压器的220V输入线从原本插头的位置穿过,用热熔胶固定,裸露的线缆全部用热缩管保护。
接下来到了整个电路的核心控制单元了,是谁解读蓝牙模块不断送来的枯燥信号?又是谁日夜恪尽职守为我们关闭或开启台灯?没错!它就是那大名鼎鼎的单片机。今天我们请来的这位单片机先生是STC公司旗下的12C4052AD。别看它身材娇小,干起活来可绝不马虎,串口中断的本领可以让它不错过蓝牙模块传来的每一个消息,PWM(脉宽调制)的绝活可以使台灯不仅具有开或者关两种状态,还可以根据我们的需要调整出不同的亮度。脉宽调制可以理解为:在一个固定周期内,产生时长不同的高低电平,通过不同时长比例的组合,在原本两种状态中间构建出一个线性变化,然后取出你要的比例值,如图9。
图9 图解PWM.jpg

  图9 图解PWM
通过PWM功能,我们就可以通过单片机控制台灯的亮度。天生爱偷懒的我好想直接把LED灯板直接连在单片机的PWM引脚上,但是这样做会要了单片机先生的命啊!因为不管是拉电流的方式还是灌电流的方式驱动这21个LED都是强人所难,就算单片机先生拿出强推挽模式的雄心还是有点牵强了,所以我们找一个三极管来帮帮它。这款单片机有两个固定的PWM引脚,随便选择一个用限流电阻接到三极管的基极,就可以控制LED灯板的亮灭以及亮度啦。不过三极管控制的是7805输出的5v电压,为防止5v的电压烧毁LED灯板,在三极管的发射极串联了一个正偏的二极管,它会带来0.7v的压降,再加上电路中别处的压降,LED就很安全了。同时电路中可能会存在杂波造成各种未知的影响,所以我们在电路中并联一个104滤波电容。我想让蓝牙模块可以随意插拔方便调试,所以用排插跟控制板连接,焊接完成的电路如图10所示。
图10 单片机焊接实物图.jpg

  图10 单片机焊接实物图
到此,所有的电路部分都已经结束,完整的电路图如图11所示
图11 完整电路图.png

图11 完整电路图
其中D3就代表LED灯板,特别说明的是,因为用到蓝牙串口通讯,所以晶振频率是11.0592MHz,用12.000MHz的代替会出错。按照电路的大小对台灯外壳进行了最后的修整,最终的效果如图12所示。
图12 装入外壳.jpg


图12 装入外壳
最后来说说软件部分跟手机app的部分。程序的主要用处就是接收蓝牙的数据,然后设置对应的PWM值。首先初始化串口和PWM:
void UART_PWM_init (void){

     EA = 1; //允许总中断

     ES = 1; //允许UART串口的中断


     TMOD = 0x20;  //定时器T/C1工作方式2

     SCON = 0x50;  //串口工作方式1,允许串口接收

     TH1 = 0xFD;   //定时器初值高8位设置

     TL1 = 0xFD;   //定时器初值低8位设置

     TR1 = 1; //定时器启动  

/************/  

     CMOD=0x02; //设置PCA定时器

     CL=0x00;

     CH=0x00;

     CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式

     CCAP0L=0x00;//设置PWM0初始值与CCAP0H相同

     CCAP0H=0x00;// PWM0初始时为0

     CR=1; //启动PCA定时器

}


当串口中断触发时,根据接收的数据设置对应的PWM值:
void UART_R (void) interrupt4  using 1{ //切换寄存器组到1
unsigned char UART_data; //定义串口接收数据变量
RI = 0;            //令接收中断标志位为0(软件清零)
UART_data = SBUF;  //将接收到的数据送入变量 UART_data
if(UART_data == 'U'){if(LD !=255){Ch = 1;LD = LD + 51; }}//串口接收到大写字母U,增加亮度,51*5=255 即5级调光
if(UART_data == 'D'){if(LD !=0){Ch = 1;LD = LD - 51; }}  //串口接收到大写字母D,减少亮度
if(UART_data == 'F'){if(LD !=0){Ch = 1;LD = 0; }}        //串口接收到大写字母F,改变亮度为0 即关灯
if(UART_data == 'O'){if(LD !=255){Ch = 1;LD = 255; }}    //串口接收到大写字母O,改变亮度为255 即开灯
}
其中LD即为要设置的PWM值,范围0—255,0为关灯,255为最亮,现在还需要一个PWM设置程序:
void PWM0_set (unsigned chara){
     CCAP0L= a; //设置值直接写入CCAP0L
     CCAP0H=a; //设置值直接写入CCAP0H
}
各老大已就位,但群龙无主,依然无法运作,这时主程序出来维持秩序了:
void main (void){
     LD = 153;//初始亮度
     Ch = 0;
     UART_PWM_init();//初始化

     while(1){
     if (CH == 1){//产生变化,送入新的pwm值
              PWM0_set(LD);Ch = 0;} //设置PWM占空比
     }
}
  单片机这边的程序就搞定了,如果你懒得自己写,我会在下面上传源码。至于手机的app呢,不需要自己写,因为有很多现成的蓝牙串口的app可供下载,我用的是一款名为“蓝牙串口”的软件,图标如图13所示。
                                             

图13 蓝牙串口图标.png

图13 蓝牙串口图标
打开app后界面如图14所示,用手在屏幕上从右向左滑动2次,就能看到如图15的界面。


图14 进入后的界面.png 图15 需要用的界面.png

    图14 进入后的界面                图15 需要用的界面
可能你看到的没有图片上的这些字,没关系,这些是我自己设置的,
长按任意按钮,会弹出这样的设置窗口,设置的方式如图16所示。

图16 设置方式.png

16 设置方式

按照单片机程序的规定,发送字符U是亮度加,字符D是亮度减,字符O是开灯,字符F是关灯。按照这样设置好,程序会自动保存,你的蓝牙台灯遥控就做好了。


    做好了这一切,却只是个开始,如果你愿意开动脑筋,会发现这套系统可以控制很多东西。心动不如行动,让身边的东西都互联起来,亲身感受一下物联网时代的魅力吧!

0.png
完整源程序下载 蓝牙台灯.zip (13.6 KB, 下载次数: 89)

收藏 277 0 9
粉丝
0
关注
0
主题
2
资料真不错.下载学习
0

回答于 · 2024-01-20 14:28

粉丝
1
关注
0
主题
5

一起进步~
0

回答于 · 2024-01-21 10:12

粉丝
0
关注
0
主题
4
不行啊,我的实现不了蓝牙功能
0

回答于 · 2024-01-22 06:11

粉丝
0
关注
0
主题
2
程序出错
0

回答于 · 2024-01-22 06:39

粉丝
0
关注
0
主题
9
数据传输不过去啊
0

回答于 · 2024-01-22 14:15

粉丝
0
关注
0
主题
5
感动的快哭了,代码都写好了就差楼主的原理图了可以动手焊了
0

回答于 · 2024-01-23 02:27

粉丝
0
关注
0
主题
2
感谢分享
0

回答于 · 2024-01-23 04:29

粉丝
0
关注
0
主题
4
哈哈哈   厉害了  大神啊
0

回答于 · 2024-01-23 14:32

粉丝
0
关注
0
主题
1
牛牛
0

回答于 · 2024-01-23 14:49