在本文中,我们将发布一个非常有用的家庭应用程序-基于GSM的家庭自动化使用Arduino.该项目包括a16×2液晶模块用于显示家用电器的状态。您可以通过手机发送短信来改变连接设备的状态(打开或关闭)。收到短信命令后通过GSM模块, arduino将改变SMS中提到的设备的状态(打开/关闭)。

项目目标

  • 通过GSM将连接的设备状态发送/监控到指定的手机号码。
  • 通过短信接收命令后,更改设备的状态(开/关)。
  • 通过16×2 LCD模块显示设备状态。

注意:-为了演示,我们使用3个LED来代表3种不同的设备。我们还连接了一个12伏直流电机作为第四个设备。你可以把这些LED换成真正的电灯泡、电机、风扇、电视、冰箱等设备。您应该使用适当的支持电路将这些设备连接到下面给出的电路图。

让我们开始构建我们的项目-基于GSM的家庭自动化使用Arduino。

电路图-使用Arduino的家庭自动化

Circuit_diagram_arduino_home_automation

如图所示组装电路!下面将解释重要的联系。

这里我们使用的是SIM900 GSM模块。GSM模块与arduino之间的通信是串行的。这种连接的问题是,在Arduino编程时使用串行端口从Arduino IDE加载程序。如果在布线中使用这些引脚,程序将无法成功加载到Arduino。所以你必须把电线断开处方Tx每次将程序刻录到Arduino时。一旦程序加载成功,您就可以重新连接这些引脚并使系统工作。

为了避免这个困难,我使用了另一种方法,即使用Arduino的两个数字引脚进行串行通信。我们需要为这种方法选择Arduino的两个使能PWM的引脚。所以我选择引脚9和10(这是PWM启用引脚)。这种方法是通过Ardunio的SoftwareSerial Library实现的。SoftwareSerial是Arduino的一个库,可以通过Arduino的其他数字引脚进行串行数据通信。该库复制硬件功能并处理串行通信任务。这将有助于程序员使用硬件串行引脚进行调试。

注意:- - - - - -阅读我们的完整教程GSM模块与Arduino接口

电路的另一部分是Arduino与16×2 LCD的接口.JHD162A是这里使用的LCD模块。JHD162A是一款基于日立HD44780驱动的16×2液晶模块。JHD162A有16个引脚,可以在4位模式(仅使用4条数据线)或8位模式(使用所有8条数据线)下工作。这里我们使用4位模式的LCD模块。为了方便Arduino和LCD模块之间的通信,我们使用了Arduino内置的库< LiquidCrystal.h >-这是为使用日立HD44780芯片组(或兼容芯片组)的LCD模块编写的。

为了演示家用电器的工作原理,我们使用了三个LED灯泡和一个直流电机。这些连接到阿兰的A0- A3引脚,微型蜂鸣器连接到A4。蜂鸣器会在收到有效短信后发出哔哔声。这里我们使用的是12V直流电机,它不能直接从Arduino板驱动(Arduino的电流能力非常有限)。因此,这里使用BC547晶体管来驱动直流电机。

程序/代码-家庭自动化使用Arduino

#include  #include  #define bulb1_pin A0 #define bulb_2Pin A1 #define bulb_3Pin A2 #define fanPin A3 #define buzzerPin A4液晶lcd(13,12,5,4,3,2);SoftwareSerial gsm(10、11);int i = 0;字符串incomingString="",设备="";字符字符,但[100]= " ";boolean bulb1_status = false, bulb_2Status = false, bulb_3Status = false, fanStatus = false;长previous_millis = 0;void setup() {Serial.begin(9600);lcd.begin(16日2);gsm.begin (9600); pinMode(bulb_1Pin,OUTPUT); pinMode(bulb_2Pin,OUTPUT); pinMode(bulb_3Pin,OUTPUT); pinMode(fanPin,OUTPUT); pinMode(buzzerPin,OUTPUT); digitalWrite(bulb_1Pin,LOW); digitalWrite(bulb_2Pin,LOW); digitalWrite(bulb_3Pin,LOW); digitalWrite(fanPin,LOW); digitalWrite(buzzerPin,LOW); lcd.clear(); lcd.setCursor(0,0); lcd.print(" GSM BASED "); lcd.setCursor(0,1); lcd.print(" HOME AUTOMATION"); delay(2000); } void send_deviceStatus() { gsm.println("AT+CMGF=1"); buzzer(2); gsm.println("AT+CMGS=\"+918129613637\"\r"); buzzer(2); gsm.print("BULB 1 "); if(bulb_1Status==true) gsm.println("ON \n"); if(bulb_1Status==false) gsm.println("OFF \n"); gsm.print("BULB 2 "); if(bulb_2Status==true) gsm.println("ON \n"); if(bulb_2Status==false) gsm.println("OFF \n"); gsm.print("BULB 3 "); if(bulb_3Status==true) gsm.println("ON \n"); if(bulb_3Status==false) gsm.println("OFF \n"); gsm.print("FAN "); if(fanStatus==true) gsm.println("ON \n"); if(fanStatus==false) gsm.println("OFF \n"); buzzer(2); gsm.println((char)26); buzzer(2); gsm.println("AT+CNMI=2,2,0,0,0"); buzzer(2); } void buzzer(int k) { int j; for(j=0;j 2000) { previous_millis = millis(); if(i==0){ lcd.setCursor(0,1); lcd.print(" BULB 1 "); if(bulb_1Status==true) lcd.print("ON "); if(bulb_1Status==false) lcd.print("OFF ");} if(i==1){ lcd.setCursor(0,1); lcd.print(" BULB 2 "); if(bulb_2Status==true) lcd.print("ON "); if(bulb_2Status==false) lcd.print("OFF ");} if(i==2){ lcd.setCursor(0,1); lcd.print(" BULB 3 "); if(bulb_3Status==true) lcd.print("ON "); if(bulb_3Status==false) lcd.print("OFF ");} if(i==3){ lcd.setCursor(0,1); lcd.print(" FAN "); if(fanStatus==true) lcd.print("ON "); if(fanStatus==false) lcd.print("OFF ");} i++; } if(gsm.available()) { if(gsm.read()=='*') { while(!gsm.available()){} incomingString += gsm.readStringUntil('#'); // Serial.println(incomingString); } } if(incomingString.equals("B1ON")) { lcd.setCursor(0,0); lcd.print(" SMS RECEIVED "); lcd.setCursor(0,1); lcd.print(" BULB 1 ON "); buzzer(5); bulb_1Status = true; goto top;} if(incomingString.equals("B2ON")) { lcd.setCursor(0,0); lcd.print(" SMS RECEIVED "); lcd.setCursor(0,1); lcd.print(" BULB 2 ON "); buzzer(5); bulb_2Status = true; goto top;} if(incomingString.equals("B3ON")) { lcd.setCursor(0,0); lcd.print(" SMS RECEIVED "); lcd.setCursor(0,1); lcd.print(" BULB 3 ON "); buzzer(5); bulb_3Status = true; goto top;} if(incomingString.equals("FON")) { lcd.setCursor(0,0); lcd.print(" SMS RECEIVED "); lcd.setCursor(0,1); lcd.print(" FAN ON "); buzzer(5); fanStatus = true; goto top;} if(incomingString.equals("B1OFF")) { lcd.setCursor(0,0); lcd.print(" SMS RECEIVED "); lcd.setCursor(0,1); lcd.print(" BULB 1 OFF "); buzzer(5); bulb_1Status = false; goto top;} if(incomingString.equals("B2OFF")) { lcd.setCursor(0,0); lcd.print(" SMS RECEIVED "); lcd.setCursor(0,1); lcd.print(" BULB 1 OFF "); buzzer(5); bulb_2Status = false; goto top;} if(incomingString.equals("B3OFF")) { lcd.setCursor(0,0); lcd.print(" SMS RECEIVED "); lcd.setCursor(0,1); lcd.print(" BULB 1 OFF "); buzzer(5); bulb_3Status =false; goto top;} if(incomingString.equals("FOFF")) { lcd.setCursor(0,0); lcd.print(" SMS RECEIVED "); lcd.setCursor(0,1); lcd.print(" FAN OFF "); buzzer(5); fanStatus = false; goto top;} if(incomingString.equals("STATUS")) { lcd.setCursor(0,0); lcd.print(" SMS RECEIVED "); lcd.setCursor(0,1);lcd.print(" SENDING STATUS ");send_deviceStatus(); goto top;} } } }

该程序不断地检查来自GSM模块的串行数据的可用性。当有新消息到达时,GSM模块采用软件串行方式将新消息传递给控制器。控制器将从到达的数据中解码命令,并将其存储在名为"incomingString”。解码通过简单地获取字符之间的字符串来完成‘*’“#”.发送方必须在这些字符之间发送所有命令,以便从控制器获得适当的响应。的“incomingString”变量然后与保存的字符串(例如。“B1ON”)通过使用Arduino内置函数(incomingString.equals(" B1ON ");).如果此函数的输出为true,则消息中提到的设备的状态将相应地改变。

我们可以从世界任何地方查看所有设备的状态,只需发送“*状态#”。控制器接收到字后,将所有连接设备的状态发送到指定的手机号码。一个用户定义的函数,即send_deviceStatus ()在程序中声明用于执行此操作。一旦接收到关键字,程序将调用这个函数。其中编写了配置GSM模块所需的AT命令和手机号码。

作者

13评论

  1. 亚历克斯

    好像代码有问题,你能再检查一下吗?

  2. vinoth

    我需要arduino GSM灯泡控制短信命令格式

  3. vinoth

    我需要基于3个灯泡控制项目的arduino短信发送格式

  4. 唐纳德

    我使用SIM900屏蔽arduino uno我无法获得arduino uno和gsm之间的通信

  5. 科恩

    你好,先生,请我不懂编码,你可以带我通过一步一步的过程,我不懂编码一般

  6. 达沃

    有史以来最好的项目

  7. Sohail安瓦尔

    很好,但我无法理解编码。我想做一个项目,如果我通过短信发送灯,那么led应该打开,如果我发送灯,那么led应该关闭。我使用的是sim900a GSM模块,请给我发送代码。

  8. 迈克alonge

    你好,我很高兴见到你
    我用一般的逻辑来描述代码
    大多数人都是变性人
    节目内容:
    Collect2.exe:error: ld returned 1exit status
    退出状态1
    arduino/genuino编译错误

  9. 玛丽

    你可以用什么命令来打开所有的设备

  10. 怎样才能阻止其他人发送命令?在没有加密的情况下,有什么能阻止我向你的号码发送命令?古玩。

    • 我说的加密是指安全。

    • 照Vj

      改变设备状态的命令是在编程期间设置的。只有程序员才知道。这样一来,它就安全了。您可以通过使设备只响应来自特定号码的消息来增加它。这可以通过添加更多的步骤来实现。首先,必须将num存储在一个字符串变量中。然后将其与接收到命令的num进行比较。

Baidu