手机是本世纪的革命性发明。它最初是为拨打和接听电话和短信而设计的,但是在智能手机出现之后,它已成为整个世界。在这个项目中,我们正在构建一个家庭自动化系统,在该系统中,人们可以使用简单的基于GSM的电话来控制家用电器,只需通过手机发送短信即可。在该项目中,不需要智能电话,只需使用旧的GSM电话就可以在任何地方打开和关闭任何家用电器。您还可以在此处检查更多无线家庭自动化项目:使用Arduino的IR远程控制家庭自动化,基于DTMF的蓝牙控制家庭自动化以及基于Arduino的PC控制家庭自动化。
工作说明
在该项目中,Arduino用于控制整个过程。在这里,我们已经使用GSM无线通信来控制家用电器。我们发送一些命令,例如“#A.light on *”,“#A.light off *”等等,用于控制AC家用电器。在Arduino通过GSM接收到给定命令后,Arduino将信号发送到继电器,以使用继电器驱动器打开或关闭家用电器。
电路元件:
- Arduino UNO
- GSM模块
- ULN2003
- 继电器5伏
- 带支架灯泡
- 连接线
- 面包板
- 16x2 LCD
- 电源供应
- 手机
在这里,我们在命令字符串中使用的前缀为“ #A。”。此前缀用于标识主命令在其旁边,字符串末尾的*表示消息已结束。
当我们通过Mobile将SMS发送到GSM模块时,GSM会接收该SMS并将其发送到Arduino。现在,Arduino读取此SMS并从接收的字符串中提取主要命令,并将其存储在变量中。之后,Arduino将该字符串与预定义的字符串进行比较。如果发生匹配,则Arduino通过继电器驱动器将信号发送到继电器,以打开和关闭家用电器。通过使用适当的命令,相对结果也会打印在16x2 LCD上。
在此项目中,我们使用了3个零瓦灯泡进行演示,该灯泡指示了风扇,电灯和电视。
以下是我们通过短信发送以打开和关闭风扇,电灯和电视的消息列表:
序号 |
信息 |
操作方式 |
1个 |
#A。风扇开启* |
风扇开启 |
2 |
#A。风扇关闭* |
风扇关闭 |
3 |
#A。点亮* |
点亮 |
4 |
#A。熄灭* |
灯灭 |
5 |
#A.tv开* |
电视开 |
6 |
#A.tv关闭* |
电视关闭 |
7 |
#A。全部开启* |
全部开启 |
8 |
#A。全部关闭* |
全部关闭 |
GSM模块:
GSM模块 用于许多基于GSM(全球移动通信系统)技术的通信设备中。它用于通过计算机与GSM网络进行交互。GSM模块仅了解 AT命令,并可以做出相应响应。最基本的命令是“ AT”,如果GSM响应正常,则说明运行良好,否则将响应“错误”。有各种AT命令,例如ATA用于接听电话,ATD拨打电话,AT + CMGR读取消息,AT + CMGS发送短信等。AT命令后面应跟回车符,即\ r(十六进制的0D ),例如“ AT + CMGS \ r”。我们可以使用以下命令来使用GSM模块:
ATE0-消除回声
AT + CNMI = 2,2,0,0,0
ATD
AT + CMGF = 1
AT + CMGS =“手机号码”
>>现在我们可以写留言了
>>留言后
Ctrl + Z发送消息命令(十进制26)。
十六进制中的ENTER = 0x0d
所述 SIM900 是一个完整的四频 GSM / GPRS模块 ,其支持GSM / GPRS 850/900/1800 / 1900MHz的语音,SMS和数据以低功耗性能。
电路说明
这种基于GSM的家庭自动化电路的连接非常简单,此处液晶显示器用于显示以4位模式直接连接到arduino的家用电器的状态。LCD的数据引脚,即RS,EN,D4,D5,D6,D7连接到arduino数字引脚编号6、7、8、9、10、11。GSM模块的Rx和Tx引脚直接连接到Tx和Rx分别为Arduino的引脚。GSM模块使用12伏适配器供电。5伏SPDT 3继电器用于控制LIGHT,FAN和TV。继电器通过继电器驱动器ULN2003连接到arduino引脚3、4和5,分别用于控制LIGHT,FAN和TV。
代码说明
在该项目的编程部分,首先,在编程中,我们包括用于液晶显示器的库,然后为LCD和家用电器定义数据和控制引脚。
#包括
串行通信初始化为9600 bps后,将方向指示给使用的引脚。
void setup(){lcd.begin(16,2); Serial.begin(9600); pinMode(led,OUTPUT); pinMode(风扇,输出); pinMode(Light,OUTPUT); pinMode(电视,输出);
对于数据串行地,我们已经使用两个函数接收一个是Serial.available其中检查任何串行数据是否即将来临,另一种是Serial.read读取附带串行数据。
而(Serial.available()){char inChar = Serial.read();
串行接收数据后,我们将其存储在字符串中,然后等待Enter。
void serialEvent(){while(Serial.available()){if(Serial.find(“#A。”))){digitalWrite(led,HIGH); 延迟(1000); digitalWrite(led,LOW); 而(Serial.available()){char inChar = Serial.read(); str = inChar; if(inChar =='*'){temp = 1; 返回; }
输入Enter时,程序开始比较接收到的字符串与已定义的字符串,如果字符串匹配,则使用代码中给出的适当命令执行相对操作。
void check(){if(!(strncmp(str,“ tv on”,5))){digitalWrite(TV,HIGH); lcd.setCursor(13,1); lcd.print(“ ON”); 延迟(200); } else if(!(strncmp(str,“ tv off”,6))){digitalWrite(TV,LOW); lcd.setCursor(13,1); lcd.print(“ OFF”); 延迟(200); }