在本项目中,我们将使用PIC微控制器通过仅使用IR遥控器来远程控制少量AC负载。Arduino也已经完成了类似的项目IR远程控制家庭自动化,但是在这里,我们使用EasyEDA的在线PCB设计器和模拟器在PCB上进行了设计,并使用其PCB设计服务订购了PCB板,如本教程的后续部分所示。文章。
在该项目结束时,您将可以从舒适的椅子/床上使用普通遥控器切换(打开/关闭)任何交流负载。为了使该项目更有趣,我们还启用了一个功能,该功能可在Triac的帮助下控制风扇的速度。只需单击您的IR遥控器即可完成所有这些操作。您可以将任何TV / DVD / MP3遥控器用于此项目。微控制器接收来自遥控器的不同IR信号,然后通过继电器驱动器电路控制相应的继电器。这些继电器用于连接和断开交流负载(电灯/风扇)。
工作说明:
这个项目的工作非常容易理解。当按下红外遥控器上的按钮时, 它将使用38Khz调制频率以编码脉冲的形式发送一系列代码。这些脉冲由TSOP1738 传感器接收,然后由控制器读取。然后,控制器将接收到的脉冲序列解码为十六进制值,并将其与程序中的预定义十六进制值进行比较。
如果发生任何匹配,则控制器通过触发相应的继电器/三端双向可控硅开关来执行相对操作,并且板上的LED也会指示相应的结果。在此项目中,我们使用了4个不同颜色的灯泡(小灯泡)作为照明负载,另一个灯泡(大灯泡)被认为是用于演示的风扇。
我们选择键1来切换继电器1,选择2来切换继电器2,选择3来切换继电器3,选择4来切换继电器4,选择Vol +来增加风扇速度,选择Vol-来降低风扇速度。
注意:此处我们使用100瓦灯泡代替了风扇。
有多种类型的IR遥控器可用于不同的设备,但大多数遥控器的工作频率为38KHz。在此项目中,我们使用IR电视遥控器控制家用电器,并使用TSOP1738红外接收器检测红外信号。该TSOP1738传感器可以感应38Khz频率信号。本文详细介绍了红外遥控器和TSOP1738的工作:红外发射器和接收器
我们的PIC微控制器的工作电压为+ 5V,继电器的工作电压为+ 12V,因此我们使用变压器来降低220V交流电,并使用全桥整流器对其进行整流。然后,通过分别使用稳压器IC 7812和7805将整流后的DC电压调节至+ 12V和+ 5V。
为了触发继电器,我们使用了诸如BC547之类的晶体管,该晶体管可以用作电子开关,根据PIC微控制器的信号来打开/关闭继电器。TRIAC是一种功率半导体,能够控制输出电压。此功能用于控制风扇的速度。
我们还使用了Triac驱动器来通过我们的PIC微控制器控制Triac。该驱动器用于向三端双向可控硅开关元件提供触发角脉冲,以便可以控制输出功率。这里我们使用了6级速度控制。级别为0时,风扇将关闭。当级别为1时,速度将为全速的1/5。当级别为2时,速度将为全速的2/5,对于其他速度则分别为全速。可以使用板载7段显示器监视当前速度水平。
该项目的框图如下所示。
组件:
下面给出了构建此项目所需的组件:
- PIC18f2520单片机-1
- TSOP1738 -1
- 红外电视/ DVD遥控器-1
- 晶体管BC547 -4
- 继电器12伏-4
- 带支架的灯泡-5
- 连接线-
- EasyEda PCB -1
- 16x2 LCD
- 电源12v
- 端子2针`-8
- 端子连接器3针-1
- 变压器12-0-12 -1-
- 稳压器7805 -1
- 稳压器7812 -1
- 电容器1000uf -1
- 电容器10uf -1
- 电容器0.1uf -1
- 电容器0.01uf 400V`-1
- 10k -5
- 1k -5
- 100欧姆-7
- 共阴极段-1
- 1n4007二极管-10
- BT136双向可控硅-1
- 公头/母头-
- LED -6
- 光耦合器MOC3021 -1
- 光电耦合器mtc2e或4n35 -1
- 20Mhz晶体-1
- 33pf电容器-2
- 5.1V稳压二极管-1
- 47欧姆2瓦电阻器-1
所有这些组件都是常用的,可以轻松购买。但是,如果您正在网上寻找最佳商品,那么我们建议您使用LCSC。
LCSC是一个伟大的在线商店,可以为各种项目购买电子零件。它们具有大约25,000种组件,最棒的是,他们甚至为小型项目出售少量产品,并且还拥有全球运输服务。
解码红外遥控器:
如前所述,您可以为项目使用任何种类的遥控器。但是我们必须知道从该特定遥控器生成什么样的信号。对于遥控器上的每个单独的钥匙,该钥匙都有一个等效的十六进制值。使用此十六进制值,我们可以区分微控制器端的每个键。因此,在决定使用遥控器之前,我们应该知道该遥控器中预设的按键的十六进制值。在此项目中,我们使用了NEC遥控器。下面给出了NEC遥控器上按键的十六进制值。
如您所见,HEX值有7个字符,其中只有后两个有所不同,因此我们可以仅考虑后两个数字来区分每个键。
电路原理图:
该项目的示意图如下所示。
使用esayEDA原理图编辑器可以使上面的原理图变得容易,因为它们提供了该项目中使用的所有组件的布局。它也不需要安装,可以随时随地在线使用。
引脚和组件值在上面的示意图中有明确规定。您也可以从此处下载原理图文件。
程式设计:
该项目的程序是使用MPLABX完成的,代码也非常简单易懂。完整的代码将在本教程的结尾给出,该程序的其他重要部分将在下面说明。
在代码的开头,我们应该包括所需的库,定义引脚并声明变量。
#包括
之后,我们使用“ for”循环创建了一个简单的延迟函数。
void delay(int time){for(int i = 0; i
之后,我们使用以下函数初始化了计时器
void timer()// 10-> 1us {T0PS0 = 0; T0PS1 = 0; T0PS2 = 0; PSA = 0;//定时器时钟源来自预分频器T0CS = 0; //预分频器从FCPU获取时钟(5MHz)T08BIT = 0; // 16位模式TMR0IE = 1; //使能TIMER0中断PEIE = 1; //启用外设中断GIE = 1; //全局启用INTs TMR0ON = 1; //现在启动计时器!}
现在在主函数中,我们为选定的引脚提供了指示,并初始化计时器和外部中断int0以检测过零。
ADCON1 = 0b00001111; TRISB1 = 0; TRISB2 = 1;TRISB3 = 0; TRISB4 = 0; TRISB5 = 0; TRISC = 0x00; TRISA = 0x00; PORTA = 0xc0; TRISB6 = 0; RB6 = 1;relay1 = 0; relay2 = 0; relay3 = 0; relay4 = 0; rly1LED = 0; rly3LED = 0; rly2LED = 0; rly4LED = 0; fanLED = 0;i = 0; ir = 0; tric = 0; timer(); INTEDG0 = 0; //在下降沿INT0IE = 1中断;//使能INT0外部中断(RB0)INT0IF = 0; //清除INT0外部中断标志位PEIE = 1;//启用外设中断GIE = 1; //全局启用INT
现在,这里我们不使用任何中断或捕获和比较模式来检测IR信号。在这里,我们只是使用数字引脚来读取数据,就像读取按钮一样。每当信号变高或变低时,我们都设置去抖方法并运行计时器。每当管脚将其状态更改为另一状态时,时间值就会保存在数组中。
IR远程发送逻辑0为562.5us,逻辑1为2250us。每当定时器读取大约562.5us时,我们就将其假定为0;当定时器读取大约2250us时,我们将其假定为1。然后将其转换为十六进制。
来自遥控器的输入信号包含34位。我们将所有字节存储在数组中,然后解码要使用的最后一个字节。
while(ir == 1); INT0IE = 0; while(ir == 0); TMR0 = 0; while(ir == 1); i ++; dat = TMR0; if(dat> 5000 && dat <12000){} else {i = 0; INT0IE = 1; } if(i> = 33){GIE = 0; 延迟(50); cmd = 0; for(j = 26; j <34; j ++){if(dat> 1000 && dat <2000)cmd << = 1; 否则if(dat> 3500 && dat <4500){cmd- = 0x01; cmd << = 1; }} cmd >> = 1;
上面的代码使用计时器中断接收和解码IR信号,并将相应的HEX值存储在变量cmd中。现在,我们可以将此十六进制值(cmd变量)与我们的预定义十六进制值进行比较,并如下所示切换继电器
if(cmd == 0xAF){relay1 =〜relay1; rly1LED =〜rly1LED; } else if(cmd == 0x27){relay2 =〜relay2; rly2LED =〜rly2LED; } else if(cmd == 0x07){relay3 =〜relay3; rly3LED =〜rly3LED; } else if(cmd == 0xCF){relay4 =〜relay4; rly4LED =〜rly4LED; } else if(cmd == 0x5f){speed ++; if(speed> 5){speed = 5; }} if(cmd == 0x9f){speed--; if(speed <= 0){speed = 0; }}
现在要知道我们的风扇当前在哪个位置运行,我们应该使用7段显示器。以下几行用于指示7段显示器的引脚。
if(speed == 5)//关闭5x2 = 10ms触发// speed 0 {PORTA = 0xC0; //显示0 RB6 = 1; fanLED = 0;} else if(speed == 4)// 8毫秒触发// speed 1 {PORTA = 0xfc; //显示1 RB6 = 1; fanLED = 1; } else if(speed == 3)// 6毫秒触发// speed 2 {PORTA = 0xE4; //显示2 RB6 = 0; fanLED = 1;} else if(speed == 2)// 4ms触发// speed 3 {PORTA = 0xF0; //显示3 RB6 = 0; fanLED = 1; } else if(speed == 1)// 2ms触发// speed 4 {PORTA = 0xD9; //显示4 RB6 = 0; fanLED = 1; } else if(speed == 0)// 0ms触发//速度5满功率{PORTA = 0xD2; //显示5 RB6 = 0; fanLED = 1; }
以下功能用于外部中断和时间溢出。该功能负责检测过零并驱动双向可控硅。
无效中断isr(){if(INT0IF){delay(speed); tric = 1; for(int t = 0; t <100; t ++); tric = 0; INT0IF = 0; } if(TMR0IF)//检查是否为TMR0溢出ISR {TMR0IF = 0; }}
该IR远程控制家庭自动化的最终PCB 如下所示:
使用EasyEDA的电路和PCB设计:
为了设计这种 远程控制家庭自动化,我们使用了EasyEDA,这是一个免费的在线EDA工具,用于无缝创建电路和PCB。以前,我们从EasyEDA订购了几块PCB,并在发现整个过程(从绘制电路到订购PCB)的整个过程中一直使用它们的服务,与其他PCB制造商相比,更加方便,高效。 EasyEDA免费提供电路图,仿真,PCB设计,还提供高质量,低价格的定制PCB服务。在此处查看有关如何使用Easy EDA进行原理图,PCB布局,模拟电路等的完整教程。
EasyEDA每天都在进步;他们增加了许多新功能并改善了整体用户体验,这使EasyEDA更加容易并且可用于设计电路。他们即将推出其桌面版本,该版本可以下载并安装在您的计算机上以供离线使用。
在EasyEDA中,您可以公开您的电路和PCB设计,以便其他用户可以复制或编辑它们并从中受益,我们还为这种远程控制家庭自动化公开了整个电路和PCB布局 。
以下是EasyEDA的PCB布局顶层快照,您可以通过选择“层”窗口中的层来查看PCB的任何层(顶层,底层,顶层丝绸,底层丝绸等)。
在线计算和订购PCB样品:
完成PCB设计之后,您可以单击 Fabrication output 图标 ,这将带您进入PCB订购页面。在这里,您可以在Gerber Viewer中查看您的PCB或下载您的PCB的Gerber文件并将其发送给任何制造商,直接在EasyEDA中订购它也更加容易(而且更便宜)。在这里,您可以选择要订购的PCB数量,所需的铜层数,PCB的厚度,铜的重量,甚至PCB的颜色。选择所有选项后,单击“保存到购物车”并完成您的订单,然后几天内您将收到您的PCB。
您可以使用此链接直接订购该PCB或下载Gerber文件。
在订购PCB的几天后,我们得到了PCB。我们收到的木板如下所示。
收到PCB后,我将所有必需的组件安装到PCB上,最后我们 准备好了 红外遥控家庭自动化系统,请在本文结尾的演示视频中检查该电路的工作情况。