Arduino (IoT): Simple Tutorial GSM Parte I

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial GSM

GSM (Global System for Mobile) es una tecnología de comunicación remota.  GSM nos permite comunicación de voz y datos (GPRS – General Packet Radio Service).  Primero experimentaremos con llamadas telefónicas.  Finalmente pasaremos a transmisión de datos via GPRS.

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 el caso de la MEGA conectamos el Rx al pin 18 y el Tx al pin 19.  NOTA: La libreria traer varios archivos y algunos con la instrucción especifica de comentar/des-comentar ciertas lineas especialmente entre el uso de la UNO vs la MEGA.  Esto es debido a que la UNO utilizar los pines 0 & 1 como los Hardware Serial para Tx & Rx mientras que la MEGA usa varios pines distintos (especificamente el 18 & 19).  Por ejemplo los archivos HWSerial & GSM contienen varias secciones donde se explica cuales lineas comentar o des-comentar.  También es posible que sea necesario incrementar un timeout para dar mas chance a que el modulo SIM900 se logre conectar a la red.

Arduino Tutorial GSM Santiapps Marcio Valenzuela
Arduino Tutorial GSM

Veamos un ejemplo sencillo:

#include "SIM900.h" //libreria para el modulo
#include <SoftwareSerial.h>
#include "call.h" //Acceso a funciones de llamada
CallGSM call; //Creamos un objeto de llamada
char number[]="+50499991234"; //almacenaremos un numero a llamar
void setup(){
Serial.begin(9600); //Iniciamos el monitor
if (gsm.begin(2400))//Iniciamos el modulo gsm
Serial.println("\nstatus=READY");
else Serial.println("\nstatus=IDLE");
};
void loop(){
if(call.CallStatus()!= CALL_ACTIVE_VOICE){
// Si no hay llamada activa...
Serial.println("Call");
call.Call(number); //Llamamos usando call.Call()
delay(10000);//Esperamos 10mil milisegundos
}
}

Aquí estamos haciendo una llamada con la función .Call() del objeto call que creamos al inicio.  Asegurarte que tu linea tenga saldo.  Deja la SIM900 conectada un rato mientras se logra registrar a la red de Tigo/Claro.  Puede ser necesario poner la chip SIM en un teléfono para asegurarse que se logra conectar a la red de tu proveedor e incluso lo ideal es confirmar haciendo una llamada con el chip SIM ingresado.  Una vez verificado, procede a instalar la chip SIM en tu modulo SIM900 y sube el código a la UNO.

Al correr el codigo deberiamos ver en el Monitor Serial algunos comandos de debug como:

ATT, RIC, OK

ELSE, CORRECT BR, ATE0

CPMS, SHUT OK, Status=ready

Call o Call Active…

Ese proyecto se puede ver aquí:

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 Estación Ambiental Parte I

Arduino Honduras Santiapps Marcio Valenzuela
Arduino Honduras

Tutorial Estación Ambiental: Parte I

En este tutorial combinaremos 2 habilidades electrónicas que hemos aprendido:

  1. Colectar datos en sensores digitales
  2. Comunicar datos via WiFi

Incorporaremos una habilidad distinta que no es precisamente de Arduino pero si de IoT.  La habilidad de recibir datos en un servidor en la web.

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. Wifi Shield & WiFi Library
  4. Grove Shield con Sensor CO2 y/o Dust Sensor
  5. Servidor PHP (hay servicios gratuitos de php por ejemplo: http://www.000webhost.com/) o Parse.com
  6. Arduino IDE (https://www.arduino.cc/en/Main/Software)
Arduino TinySine WiFi Grove Air Monitor
Arduino TinySine WiFi Grove Air Monitor

 

Aquí tenemos la Arduino UNO debajo de la TinySine WiFi inter-conectada a la Grove Shield.

Lo que vamos a querer hacer es tomar muestras cada 100,000 ms usando el Dust Sensor y postear la data a un servidor usando php & MySQL como base de datos.  En mi caso particular tengo un servidor con MySQL database y una pagina sencilla de código php para recibir datos de un cliente y grabarlos a la base de datos.  Los servicios PHP por lo general son gratis.  Con un código como este puedes recibir datos e un cliente y postearlo a la base de datos:

<?php
$conex = mysql_connect("localhost", "usuario", "clave");
if(!$conex){
die("Couldn't connect to the server...<br />".mysql_error());
}
$db = mysql_select_db("test", $conex);
if(!$db){
die("Couldn't connect to the database...<br />".mysql_error());
}
$dato1 = $_POST['dato1'];
$dato2 = $_POST['dato2'];
$sql = "INSERT INTO example (co2,dust,fuente) VALUES ('$dato1','$dato2',"Arduino")";
$res = mysql_query($sql, $conex);
?>

También podríamos usar un servicio mas especializado como Parse.com.  Para Parse.com puedes usar un código sencillo como jQuery así:

Parse.initialize(“APPKEY”, “JSKEY”);
var TestObject = Parse.Object.extend(“TestObject”);
var testObject = new TestObject();
testObject.save({foo: “bar”}, {
success: function(object) {
$(“.success”).show();
},
error: function(model, error) {
$(“.error”).show();
}
});
Pero regresemos al proyecto en mano.  La idea es poder postear datos a un servidor, ya sea a traves de php o jquery.  Asi que veamos como usar WiFi para comunicar datos a un servidor via HTTP.  Estas son funciones mas avanzadas y por ende usaremos nuevamente una library.  La library es una serie de archivos de código que agrupan las funciones mas comunes de un dispositivo (sensor o WiFi o BT) para darle al programador una serie de funciones amigables con cuales interactuar.

Veamos el codigo por partes:

int pin = 8;
unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms = 30000;
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;
#include <WiFlyHQ.h>
#include <SoftwareSerial.h>
SoftwareSerial wifiSerial(2,3);
WiFly wifly;
String data;
const char mySSID[] = "linksys";
const char myPassword[] = "miclave";
const char site[] = "miservidor.com";
void terminal();

Aquí iniciamos las mismas constantes de antes cuando usamos el sensor de Dust pero adicionalmente iniciamos algunas constantes para el WiFly module.  Hacemos otras cosas en el setup que imprimen datos del modulo y su estado al Monitor Serial.

Veamos el código completo aqui…

Arduino WiFi Dust Grove Sensor

Los resultados deberían poderse verificar tanto en el Monitor Serial como en la base de datos configurada para recibir los datos.  Si los datos aparecen en el Monitor Serial pero no en la base de datos, seguramente tiene alguna problema con la comunicación HTTP y deberá revisar los logs de su servidor para verificar lo que el servidor esta recibiendo de la MEGA y lo que responde.  Ademas puede verificarse los ingresos a la base de datos con un simple php query al MySQL db:

id: 46 – Name: Arduino 3885
id: 47 – Name: Arduino 4413
id: 48 – Name: Arduino 4047
id: 49 – Name: Arduino 2619
id: 50 – Name: Arduino 2938
id: 51 – Name: Arduino 5090
id: 52 – Name: Arduino 2858
id: 53 – Name: Arduino 3181
id: 54 – Name: Arduino 2842
id: 55 – Name: Arduino 2498
id: 56 – Name: Arduino 4518

Ok ahora nuestro robot tiene la habilidad de tomar muestras de aire.  Deberemos incorporarle el código para muestra el CO2 también para poderlo reportar al servidor.