Arduino (IoT): Simple Tutorial GSM Parte III

GSM Arduino Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial GSM

Veamos que mas podemos hacer cuando el numero que llama es autorizado sin necesariamente esta almacenado en una SIM.  O sea, podemos “parse” los resultados de la llamada para obtener cierta informacion.  En este caso la informacion que vamos a parse del numero que llama es precisamente el numero que nos da el Caller ID.

Requisitos:

  1. Computadora (mac)
  2. Arduino MEGA (u otra variante Arduino) o incluso Arduino clone, Edison, Raspberry…  Este tutorial en particular usa una Arduino MEGA.
  3. Modulo SIM900 GSM/GPRS
  4. Arduino IDE (https://www.arduino.cc/en/Main/Software)

Estaremos usando el modulo SIM900 GSM/GPRS para nuestra comunicación:

Arduino - SIM900 GSM_GPRS module Santiapps Marcio Valenzuela
Arduino – SIM900 GSM_GPRS

Como podemos ver, el modulo tiene un pin 5V, 2 pines GND y los típicos 2 pines para Rx y Tx.  Por ende la conexión es bastante sencillo.  Sin embargo nuevamente si vamos a subir las instrucciones a la UNO via el Serial 0 & 1 como Rx y Tx, no podremos usarlos para comunicación con el modulo Sim900 así que tendremos que definir pines de Rx y Tx via software, usando la libreria SoftwareSerial como hicimos en el tutorial WiFi.  En este caso como estamos usando la MEGA, no es necesario usar el SoftwareSerial library porque la MEGA tiene mas puertos seriales, en este caso particular como estamos conectados al 18/19, esos son los que podemos usar haciendo referencia a Serial1.  Si usáramos una Arduino UNO nos veríamos obligados a usar un puerto serial definido en software como el 7 & 8.

Las conexiones se ven así, igual que para los proyectos anteriores:

Arduino GSM SIM900 Tutorial Santiapps Marcio Valenzuela
Arduino GSM SIM900

Veamos un ejemplo sencillo:


#include "SIM900.h"
#include <SoftwareSerial.h>
char inchar;
//SoftwareSerial SIM900(7,8); //Solo usar en caso de Arduino UNO
int onoff=0; // 0 = off, 1 = on
void setup() {
Serial.begin(19200);
Serial.println("setting up");
// set up the digital pins to control
pinMode(12, OUTPUT);
pinMode(13, OUTPUT); // LEDs - off = red, on = green
digitalWrite(12, HIGH);
digitalWrite(13, LOW); // Turn ON RED LED and OFF GREEN LED
// wake up the GSM shield
SIM900power();
Serial1.begin(19200);
delay(20000); // give time to log on to network.
Serial1.print("AT+CLIP=1\r");
delay(100);
}
void SIM900power(){ // funciona para re-iniciar el modulo GSM
digitalWrite(9, HIGH);
Serial.println("9 is HIGH");
delay(1000);
digitalWrite(9, LOW);
Serial.println("9 is LOW");
delay(7000);
}
void doSomething(){ //Este metodo almacena lo que queremos hacer si la llamada es del numero que esperamos. Aquí encendemos unas LEDs
if (onoff==0){
onoff=1;
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
Serial.println("D12 high D13 low");
}
else
if (onoff==1){
onoff=0;
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
Serial.println("D12 low D13 high");
}
}
void loop() {
Serial.println("looping");
if(Serial1.available() >0)
{
Serial.println("Reading SIM");
inchar=Serial1.read();
if (inchar=='5')
{
delay(10);
inchar=Serial1.read();
if (inchar=='0')
{
delay(10);
inchar=Serial1.read();
if (inchar=='4')
{
delay(10);
inchar=Serial1.read();
if (inchar=='A')
{
delay(10);
inchar=Serial1.read();
if (inchar=='B')
{
delay(10);
inchar=Serial1.read();
if (inchar=='C')
{
delay(10);
inchar=Serial1.read();
if (inchar=='D')
{
delay(10);
inchar=Serial1.read();
if (inchar=='W')
{
delay(10);
inchar=Serial1.read();
if (inchar=='X')
{
delay(10);
inchar=Serial1.read();
if (inchar=='Y')
{
delay(10);
inchar=Serial1.read();
if (inchar=='Z')
{
Serial.println("do sometehing");
delay(10);
// Si el numero es 504-ABCD-WXYZ entonces llamamos el método para hacer algo.
doSomething();
// Esperamos un rato y volvemos a monitorear la linea para otra llamada
delay(60000);
}
}
}
}
}
}
}
}
}
}
}
}
}

Aquí estamos haciendo algo solo si el numero que llama es el que queremos, en este caso el 504-ABCD-WXYZ.

Los resultados en el monitor son asi:
setting up
9 is HIGH
9 is LOW
looping
…//Aqui entra la llamada
looping
Reading SIM
looping
Reading SIM
do something
D12 high D13 low

Que podemos hacer con esta tecnología:

  • Utilizar GPRS para transmitir datos entre nuestro proyecto Arduino y la nube.  Por ejemplo parse datos en nuestros proyectos de servicios web como twitter o servicios meteorológicos.
  • Postear datos remotamente desde nuestros proyectos así como crear proyectos que actúen como servidores de información en la nube.
  • Enviar instrucciones a proyectos y controlarlos via llamadas o SMS.

Ahora podemos dar a nuestro robot habilidades realmente avanzadas!

Arduino (IoT): Simple Tutorial Creando Melodías con Piezo Buzzer & Arduino Nano

Arduino Melodias Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial Fet, iOS & Bluno Nano

En este tutorial aprenderemos sobre la Bluno Nano y su utilidad para controlar remotamente un proyecto.

Requisitos:

  1. Computadora (mac)
  2. Arduino nano
  3. Breadboard, 1kR & Piezo Buzzer
  4. Arduino IDE (https://www.arduino.cc/en/Main/Software)

La conexión es del pin 3 de la Nano al + del buzzer.  El GND de la Nano va a tierra del buzzer a traves de un 1kR.

El código en este caso es muy sencillo:

#include "pitches.h"
int melody[] = {
  NOTE_B4, NOTE_E5, 0, NOTE_E5, 0, NOTE_E5, NOTE_E5, 0, NOTE_DS5, 0, NOTE_CS5, NOTE_CS5, 0,
  NOTE_B4, NOTE_DS5, 0, NOTE_DS5, 0, NOTE_DS5, NOTE_DS5, 0, NOTE_CS5, 0, NOTE_B4, NOTE_B4, 0,
  NOTE_GS4, NOTE_CS4, 0, NOTE_CS4, 0, NOTE_CS4, NOTE_CS4, 0, NOTE_B4, 0, NOTE_A4, NOTE_A4, 0,
  NOTE_FS4, NOTE_B4, 0, NOTE_B4, 0, NOTE_B4, NOTE_B4, 0, NOTE_AS4, 0, NOTE_GS4, NOTE_GS4, 0,
  NOTE_E4, NOTE_A4, 0, NOTE_A4, 0, NOTE_A4, NOTE_A4, 0, NOTE_G4, 0, NOTE_F4, NOTE_F4, 0,
  NOTE_D4, NOTE_G4, 0, NOTE_G4, 0, NOTE_G4, NOTE_G4, 0, NOTE_F4, 0, NOTE_DS4, NOTE_DS4, 0,
  NOTE_GS4, 0, NOTE_E4, 0, NOTE_GS4, NOTE_GS4, NOTE_B4, NOTE_A4, NOTE_GS4, NOTE_FS4
};

int noteDurations[] = {
  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 4,
  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 4,
  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 4,
  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 4,
  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 4,
  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 4,
  4, 4, 4, 4, 4, 4, 8, 4, 8, 8
};

void setup() {
  for (int thisNote = 0; thisNote < 88; thisNote++) {
    int noteDuration = 1000 / noteDurations[thisNote];
    tone(3, melody[thisNote], noteDuration);
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    noTone(3);
  }
}

void loop() {
  // ...
}

El proyecto final es así:

Proyecto Final

Arduino (IoT): Simple Tutorial GSM Parte II

GSM Arduino Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial GSM

En el tutorial anterior vimos como hacer una llamada desde el modulo SIM900.  Ahora veremos como verificar si un numero que llama esta autorizado (grabado en nuestro SIM) y si lo es, enviar mensajes de texto tipo SMS.  Esto es muy util para autenticar una llamada para ejecutar código en un proyecto Arduino.

Requisitos:

  1. Computadora (mac)
  2. Arduino MEGA (u otra variante Arduino) o incluso Arduino clone, Edison, Raspberry…  Este tutorial en particular usa una Arduino MEGA.
  3. Modulo SIM900 GSM/GPRS
  4. Arduino IDE (https://www.arduino.cc/en/Main/Software)

Estaremos usando el modulo SIM900 GSM/GPRS para nuestra comunicación:

Arduino - SIM900 GSM_GPRS module Santiapps Marcio Valenzuela
Arduino – SIM900 GSM_GPRS

Como podemos ver, el modulo tiene un pin 5V, 2 pines GND y los típicos 2 pines para Rx y Tx.  Por ende la conexión es bastante sencillo.  Sin embargo nuevamente si vamos a subir las instrucciones a la UNO via el Serial 0 & 1 como Rx y Tx, no podremos usarlos para comunicación con el modulo Sim900 así que tendremos que definir pines de Rx y Tx via software, usando la libreria SoftwareSerial como hicimos en el tutorial WiFi.

Ahora aprenderemos no solo a usar la call, sino también la sms:

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h" //Ahora si enviaremos mensajes
#include "call.h"//Usaremos llamadas
CallGSM call; //Objeto para llamadas
SMSGSM sms;   //Objeto para mensajes
char number[20];
int value=0;
void setup(){
//Serial connection.
Serial.begin(9600);
Serial.println("GSM testing.");
if (gsm.begin(2400))
Serial.println("\nstatus=READY");
else Serial.println("\nstatus=IDLE");
};
void loop(){
//Revisa estatus de numero almacenado desde pos 1 a 3
stat=call.CallStatusWithAuth(number,1,3);
Serial.println(stat);
//Revisar si numero esta autorizado en SIM
if(stat==CALL_INCOM_VOICE_AUTH){
Serial.println("Authorized Call received...");
//Cortar llamada
call.HangUp();
delay(2000);
//Enviar sms a number
sms.SendSMS(number,"Gutten tagh");
}
delay(1000); //Esperar...
//O enviar SMS automaticamente y ya...
sms.SendSMS(number,"Hola desde ArduinoHonduras");
};

Aquí estamos enviando dos mensajes de texto.  Verán que el código que envía el mensaje es sms.SendSMS() y hay 2:

  1. Uno esta al final de loop() y esta afuera del bloque IF.  Esto es porque el bloque IF lo que hace es UNICAMENTE enviar un SMS si el numero esta dentro de los números registrados en el SIM.  Eso depende de su chip SIM y si el comando sms.SendSMS() estuviera dentro del bloque IF, se ejecutaría pero si el numero NO estuviera registrado en el Address Book de su SIM no se enviaria el SMS.
  2. Otro esta adentro del IF y como explicamos solo se ejecutará si el numero que llama esta dentro de sus posiciones 1-3 del chip SIM.

En todo caso es necesario llamar al numero del chip SIM desde un celular para ejecutar el código.  Así que una vez cargado el sketch o código, hagamos la llamada al chip SIM de Arduino desde un celular.

Primero vemos algunos mensajes de debug:

GSM Shield testing.
ATT: OK
DB:ELSE
DB:CORRECT BR
RIC: OK
RIC: ATE0
ATT: +CPMS:
RIC:
+CPMS: 53,190,53,190,53,190
ATT: SHUT OK
RIC: SHUT OK
status=READY
DEBUG:SMS TEST
RIC: NO STRING RCVDATT: OK
RING
+CLIP: “+504sunumerodecelular”,145,””,,””,0
ATT: +CPBR
RIC:
+CPBR: 1,”+numerodecelular”,145,”ArduinoHN”
//Posicion 1 del SIM
ATT: +CPBR
RIC:
+CPBR: 2,”104″,129,”Educacion” //Posicion 2 del SIM
CHIAMANTE +504sunumerodecelular
SALVATO 104
ATT: +CPBR
RIC:
+CPBR: 3,”111″,129,”INHFA” //Posicion 3 del SIM
CHIAMANTE +504sunumerodecelular
SALVATO +504sunumerodecelular
Authorized Call received…
DEBUG:SMS TEST
ATT: 
>RIC: ATH
OK
AT+CMGS=”+504sunumerodecelular”

DEBUG:>
ATT: 
+CMGSRIC: Gutten tagh
+CMGS: 3

Aquí vemos que debido a que nuestro numero de celular no esta almacenado en la SIM, solo se ejecuta el código afuera del IF block.  Tenemos que usar comandos AT manuales para agregar nuestro numero al chip SIM.  El comando es: AT+CPBW=sunumero:

Serial.print(“AT+CPBW=3,\+504sunumerocelular,129,ArduinoHonduras\r”);

Pero lo mas fácil es agregarlo poniendo el chip en un celular y simplemente modificando la posición 1.

Los resultados del sms afuera del if-block se puede ver aquí:

Arduino Tutorial GSM SMS Santiapps Marcio Valenzuela
Arduino Tutorial GSM SMS

 

Y aquí el resultado del comando de sms adentro del if-block:

Arduino GSM Tutorial Enviar SMS Mensajes de Texto Santiapps Marcio Valenzuela
Arduino GSM Tutorial Enviar SMS Mensajes de Texto

Que podemos hacer con esta tecnología:

  • Utilizar GPRS para transmitir datos entre nuestro proyecto Arduino y la nube.  Por ejemplo parse datos en nuestros proyectos de servicios web como twitter o servicios meteorológicos.
  • Postear datos remotamente desde nuestros proyectos así como crear proyectos que actúen como servidores de información en la nube.
  • Enviar instrucciones a proyectos y controlarlos via llamadas o SMS desde números telefónicos autorizados.

Ahora podemos dar a nuestro robot control realmente remoto!