以前,我们已经介绍了使用不同技术的多种类型的家庭自动化,例如基于DTMF的家庭自动化,使用Arduino的PC控制的家庭自动化,蓝牙控制的家庭自动化。在这个项目中,我们使用基于IR的无线通信来控制家用电器。在该项目中,Arduino用于控制整个过程。我们使用IR TV / DVD / MP3遥控器向控制系统发送一些命令,以控制AC家用电器。在从红外遥控器接收信号后,Arduino将相关信号发送到继电器,这些继电器负责通过继电器驱动器打开或关闭家用电器。
工作说明:
这个项目的工作很容易理解。当我们按下IR Remote的任意按钮时,遥控器将使用38Khz调制频率以编码脉冲序列的形式发送代码。这些脉冲由TSOP1738传感器接收并由Arduino读取,然后Arduino将接收到的脉冲序列解码为十六进制值,并将解码后的值与按下按钮的预定义十六进制值进行比较。如果发生任何匹配,则Arduino会执行相关操作,并通过使用适当的命令在16x2 LCD上显示相应的结果。在此项目中,我们使用了3种不同颜色的灯泡进行演示,以指示风扇,电灯和电视。
有多种类型的IR Remote可用于不同的设备,但大多数都在38KHz频率信号附近工作。在此项目中,我们使用IR电视遥控器控制家用电器。为了检测红外遥控信号,我们使用TSOP1738红外接收器。该TSOP1738传感器可以感应38Khz频率信号。本文可以详细介绍红外遥控器和TSOP1738的工作:红外发射器和接收器
组件:
- Arduino UNO
- TSOP1738
- 红外电视/ DVD遥控器
- ULN2003
- 继电器5伏
- 带支架灯泡
- 连接线
- 面包板
- 16x2 LCD
- 电源供应
- 聚四氟乙烯
- IC 7805
在此项目中,我们使用了红外遥控器的7、8和9数字按钮,分别用于控制风扇,灯光和电视,而ON / OFF按钮(电源按钮)用于同时打开和关闭所有电器。
在这里,我们使用了切换方法来打开和关闭单个家用电器。 切换方法 无非是要知道是否按了该按钮,即使按了无数次还是按了奇数次。这是通过将其除以2(i%2)后得到的提醒而发现的。如果存在某些提醒,则设备将打开;如果提醒为0,则将其关闭。假设按下遥控器上的键7,然后遥控器通过TSOP IR接收器向Arduino发送信号。然后Arduino对其进行解码,并将解码后的值存储到结果变量中。现在结果变量具有十六进制值0x1FE00FF,将其与键7的预定义十六进制值匹配后(参见上图),Arduino开启风扇。现在,当我们再次按下相同的键(键7)时,IR发送相同的代码。Arduino获得与以前相同的代码并与相同的代码匹配,但是这次风扇由于切换该位(i%2)而关闭。
使用Arduino解码IR遥控信号:
这是DVD NEC类型的列表远程解码的输出代码:
如果您不知道红外遥控器的解码输出,可以很容易地找到它,只需执行以下步骤:
- 从此处https://github.com/z3t0/Arduino-IRremote下载IR远程库。
- 解压缩它,并将其放置在您的Arduino“库”文件夹中。然后将提取的文件夹重命名为IRremote。
- 从Arduino运行以下程序,然后在Arduino IDE中打开“串行监视器”窗口。现在按任意IR Remote按钮,并在Serial Monitor窗口中看到相应的解码十六进制输出。
* IRremote:IRrecvDemo-演示使用IRrecv接收IR代码*必须将IR检测器/解调器连接到输入RECV_PIN。*版本0.1,2009年7月*版权所有2009 Ken Shirriff * http://arcfn.com * / #include
以上程序取自IRremote库的“ examples”文件夹,您可以查看更多示例以了解有关使用IR遥控器的更多信息。这就是我们解码IR远程输出的方式。
电路说明:
该电路的连接非常简单,此处液晶显示器用于显示以4位模式直接连接到arduino的家用电器的状态。LCD的数据引脚,即RS,EN,D4,D5,D6,D7连接到arduino数字引脚编号6、7、8、9、10、11。TSOP1738的输出引脚直接连接到数字引脚编号14(A )。Vcc引脚连接到+5伏特,GND引脚连接到电路的接地端子。继电器驱动器(即ULN2003)也用于驱动继电器。5伏SPDT 3继电器用于控制LIGHT,FAN和TV。继电器通过继电器驱动器ULN2003连接到arduino引脚3、4和5,分别用于控制LIGHT,FAN和TV。
代码说明:
在该项目的编程部分中,首先,在编程中,我们包含用于IR遥控器的库,可从Google轻松获得。并定义引脚并声明变量。
#包括
然后包括一个用于液晶显示器的标题,然后我们定义LCD和家用电器的数据和控制引脚。
#包括
之后,我们需要初始化LCD并给出用于风扇,灯光和电视的引脚方向。
void setup(){Serial.begin(9600); lcd.begin(16,2); pinMode(风扇,输出); pinMode(Light,OUTPUT); pinMode(电视,输出);
如前所述,下面的代码部分用于将接收到的十六进制值与该按钮的已定义十六进制代码进行比较。如果匹配,则使用代码中给出的适当功能执行相对操作。
void loop(){if(irrecv.decode(&results)){Serial.println(results.value,HEX); 延迟(100); lcd.setCursor(0,0); lcd.print(“ Fan Light TV”); if(results.value == 0x1FE00FF){i ++; int x = i%2; digitalWrite(Fan,x);