|

Automatización del hogar basada en GSM usando Arduino

ARDUINO

Por Saddam

GSM Based Home Automation Using Arduino

El teléfono móvil es un invento revolucionario del siglo. En un principio fue diseñado para hacer y recibir llamadas y mensajes de texto, pero se ha convertido en un mundo entero desde que apareció el teléfono inteligente. En este proyecto construiremos un sistema de automatización del hogar, con el que se pueden controlar los electrodomésticos usando un simple teléfono basado en GSM, con solo enviar un SMS desde el teléfono. En este proyecto no se necesita ningún teléfono inteligente; basta con un viejo teléfono GSM para encender y apagar cualquier aparato electrónico del hogar, desde cualquier lugar. También puedes ver algunos proyectos más de automatización inalámbrica del hogar aquí: automatización del hogar controlada por control remoto IR usando Arduino, automatización del hogar controlada por Bluetooth, junto con automatización del hogar basada en DTMF y automatización del hogar controlada por PC usando Arduino.

Explicación del funcionamiento

En este proyecto, Arduino se utiliza para controlar todo el proceso. Aquí hemos usado la comunicación inalámbrica GSM para controlar los electrodomésticos. Enviamos algunos comandos como “#A.light on*”, “#A.light off*”, etc., para controlar los aparatos de corriente alterna (CA) del hogar. Después de que Arduino recibe los comandos dados a través de GSM, Arduino envía una señal a los relevadores para encender o apagar los electrodomésticos usando un controlador de relevadores (relay driver).

Componentes del circuito:

  • Arduino UNO
  • Módulo GSM
  • ULN2003
  • Relevador de 5 volts
  • Foco con portalámparas
  • Cables de conexión
  • Protoboard (bread board)
  • LCD 16×2
  • Fuente de alimentación
  • Teléfono celular
GSM Based Home Automation System Block diagram

Aquí hemos usado un prefijo en la cadena de comando que es “#A.”. Este prefijo se usa para identificar que el comando principal viene a continuación de él, y el * al final de la cadena indica que el mensaje ha terminado.

Cuando enviamos un SMS al módulo GSM desde el móvil, el GSM recibe ese SMS y lo envía a Arduino. Ahora Arduino lee este SMS, extrae el comando principal de la cadena recibida y lo almacena en una variable. Después de esto, Arduino compara esta cadena con una cadena predefinida. Si hay coincidencia, Arduino envía una señal al relevador a través del controlador de relevadores para encender y apagar los electrodomésticos. Y el resultado correspondiente también se imprime en el LCD 16×2 usando los comandos apropiados.

Aquí en este proyecto hemos usado 3 focos de cero watts para la demostración, que representan el ventilador (Fan), la luz (Light) y la TV.

A continuación se muestra la lista de mensajes que enviamos por SMS para encender y apagar el ventilador, la luz y la TV:

N.ºMensajeOperación
1#A.fan on*Ventilador ENCENDIDO
2#A.fan off*Ventilador APAGADO
3#A.light on*Luz ENCENDIDA
4#A.light off*Luz APAGADA
5#A.tv on*TV ENCENDIDA
6#A.tv off*TV APAGADA
7#A.all on*Todo ENCENDIDO
8#A.all off*Todo APAGADO

Módulo GSM:

El módulo GSM se usa en muchos dispositivos de comunicación que se basan en la tecnología GSM (Global System for Mobile Communications). Se utiliza para interactuar con la red GSM usando una computadora. El módulo GSM solo entiende comandos AT y puede responder en consecuencia. El comando más básico es “AT”; si el GSM responde OK entonces está funcionando bien, de lo contrario responde con “ERROR”. Existen varios comandos AT como ATA para contestar una llamada, ATD para marcar una llamada, AT+CMGR para leer el mensaje, AT+CMGS para enviar el SMS, etc. Los comandos AT deben ir seguidos de un retorno de carro, es decir, \r (0D en hexadecimal), como “AT+CMGS\r”. Podemos usar el módulo GSM con estos comandos:

ATE0 – Para desactivar el eco

AT+CNMI=2,2,0,0,0  <ENTER>          – Recepción de mensajes abierta automáticamente.  (No es necesario abrir el mensaje)

ATD<Número de móvil>; <ENTER>    –  hacer una llamada (ATD+919610126059;\r\n)

AT+CMGF=1 <ENTER>                       – Seleccionar el modo de texto

AT+CMGS=”Número de móvil” <ENTER> – Asignar el número de móvil del destinatario

>>Ahora podemos escribir nuestro mensaje

>>Después de escribir el mensaje

Ctrl+Z  comando para enviar el mensaje (26 en decimal).

ENTER=0x0d en HEX

GSM Module SIM900A

El SIM900 es un módulo GSM/GPRS completo de cuádruple banda (Quad-band) que ofrece un rendimiento GSM/GPRS de 850/900/1800/1900MHz para voz, SMS y datos con bajo consumo de energía.

Descripción del circuito

Las conexiones de este circuito de automatización del hogar basado en GSM son bastante sencillas; aquí se usa una pantalla de cristal líquido para mostrar el estado de los electrodomésticos, la cual está conectada directamente al Arduino en modo de 4 bits. Los pines de datos del LCD, es decir RS, EN, D4, D5, D6, D7, están conectados a los pines digitales 6, 7, 8, 9, 10 y 11 del Arduino. Y los pines Rx y Tx del módulo GSM están conectados directamente a los pines Tx y Rx del Arduino respectivamente. El módulo GSM se alimenta usando un adaptador de 12 volts. Se usan 3 relevadores SPDT de 5 volts para controlar la LUZ, el VENTILADOR y la TV. Y los relevadores están conectados a los pines 3, 4 y 5 del Arduino a través del controlador de relevadores ULN2003 para controlar la LUZ, el VENTILADOR y la TV respectivamente.

GSM Based Home Automation System Circuit Diagram

Descripción del código

En la parte de programación de este proyecto, primero incluimos la biblioteca para la pantalla de cristal líquido y luego definimos los pines de datos y de control para el LCD y los electrodomésticos.

#include<LiquidCrystal.h>
LiquidCrystal lcd(6,7,8,9,10,11);

#define Fan 3
#define Light 4
#define TV 5

int temp=0,i=0;
int led=13;

Después de esto, la comunicación serial se inicializa a 9600 bps y se da la dirección al pin usado.

void setup()
{
  lcd.begin(16,2);
  Serial.begin(9600);
  pinMode(led, OUTPUT);
   pinMode(Fan, OUTPUT);
    pinMode(Light, OUTPUT);
     pinMode(TV, OUTPUT);

Para recibir datos de forma serial hemos usado dos funciones: una es Serial.available que verifica si están llegando datos seriales, y la otra es Serial.read que lee los datos que llegan de forma serial.

 while (Serial.available())
      {
      char inChar=Serial.read();

Después de recibir los datos de forma serial los hemos almacenado en una cadena y luego esperamos el Enter.

void serialEvent()
 {
  while(Serial.available())
  {
    if(Serial.find("#A."))
    {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      while (Serial.available())
      {
      char inChar=Serial.read();
      str[i++]=inChar;
      if(inChar=='*')
      {
        temp=1;
        return;
      } 

Cuando llega el Enter, el programa comienza a comparar la cadena recibida con la cadena ya definida y, si la cadena coincide, se realiza la operación correspondiente usando el comando apropiado que se indica en el código.

void check()
{
   if(!(strncmp(str,"tv on",5)))
    {
      digitalWrite(TV, HIGH);
      lcd.setCursor(13,1);
      lcd.print("ON    ");
      delay(200);
    }

   else if(!(strncmp(str,"tv off",6)))
    {
      digitalWrite(TV, LOW);
      lcd.setCursor(13,1);
      lcd.print("OFF    ");
      delay(200);
    }

Código

#include<LiquidCrystal.h>
LiquidCrystal lcd(6,7,8,9,10,11);

#define Fan 3
#define Light 4
#define TV 5

int temp=0,i=0;
int led=13;

char str[15];
void setup()
{
  lcd.begin(16,2);
  Serial.begin(9600);
  pinMode(led, OUTPUT);
   pinMode(Fan, OUTPUT);
    pinMode(Light, OUTPUT);
     pinMode(TV, OUTPUT);
  
  lcd.setCursor(0,0);
  lcd.print(“GSM Control Home”);
  lcd.setCursor(0,1);
  lcd.print(”   Automaton    “);
  delay(2000);
  lcd.clear();
  lcd.print(“Circuit Digest”);
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print(“System Ready”);
  Serial.println(“AT+CNMI=2,2,0,0,0”);
  delay(500);
  Serial.println(“AT+CMGF=1”);
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(“Fan   Light  TV “);
  lcd.setCursor(0,1);
  lcd.print(“OFF    OFF   OFF “); 
}

void loop()
{
  lcd.setCursor(0,0);
  lcd.print(“Fan   Light  TV”);
  if(temp==1)
  {
    check();
    temp=0;
    i=0;
    delay(1000);
  }
}

 void serialEvent() 
 {
  while(Serial.available()) 
  {
    if(Serial.find(“#A.”))
    {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      while (Serial.available()) 
      {
      char inChar=Serial.read();
      str[i++]=inChar;
      if(inChar==’*’)
      {
        temp=1;
        return;
      } 
      } 
    }
   }
 }

void check()
{
   if(!(strncmp(str,”tv on”,5)))
    {
      digitalWrite(TV, HIGH);
      lcd.setCursor(13,1); 
      lcd.print(“ON    “);
      delay(200);
    }  
   
   else if(!(strncmp(str,”tv off”,6)))
    {
      digitalWrite(TV, LOW);
      lcd.setCursor(13,1); 
      lcd.print(“OFF    “);
      delay(200);
    }
  
    else if(!(strncmp(str,”fan on”,5)))
    {
      digitalWrite(Fan, HIGH);
      lcd.setCursor(0,1); 
      lcd.print(“ON   “);
      delay(200);
    }
 
    else if(!(strncmp(str,”fan off”,7)))
    {
      digitalWrite(Fan, LOW);
      lcd.setCursor(0,1); 
      lcd.print(“OFF    “);
      delay(200);
    }
 
    else if(!(strncmp(str,”light on”,8)))
    {
      digitalWrite(Light, HIGH);
      lcd.setCursor(7,1); 
      lcd.print(“ON    “);
      delay(200);
    }
 
    else if(!(strncmp(str,”light off”,9)))
    {
      digitalWrite(Light, LOW);
      lcd.setCursor(7,1); 
      lcd.print(“OFF    “);
      delay(200);
    } 
    
    else if(!(strncmp(str,”all on”,6)))
    {
      digitalWrite(Light, HIGH);
      digitalWrite(Fan, HIGH);
      digitalWrite(TV, HIGH);
      lcd.setCursor(0,1); 
      lcd.print(“ON     ON    ON  “);
      delay(200);
    }
 
    else if(!(strncmp(str,”all off”,7)))
    {
      digitalWrite(Light, LOW);
      digitalWrite(Fan, LOW);
      digitalWrite(TV, LOW);
      lcd.setCursor(0,1); 
      lcd.print(“OFF   OFF    OFF  “);
      delay(200);
    }     
}Video

Artículo traducido al español. Fuente original: Circuit Digest – GSM Based Home Automation using Arduino (Saddam)

Similar Posts

Deja un comentario