¿Te gustaría colaborar en un proyecto de software libre? Conoce P2PSP

Arduino: activar relé con una llamada perdida

Comparte este artículo

Hace más de un año que diseñé un sistema para activar un relé mediante una llamada perdida. Para el montaje hice uso de Arduino y un módulo GSM. El post en cuestión está disponible en mi cuenta de google plus (activar relé mediante llamada). Desde entonces he recibido numerosos mensajes de personas interesadas en el proyecto, algunas de ellas necesitaban ayuda para completar el montaje y otras querían que les ayudara a adaptar el proyecto a sus necesidades. Me gustaría compartir algunas mejoras que he hecho al sistema y de paso, explicar un poco mejor el funcionamiento.

 Novedades

  • Cuando el módulo GSM se queda sin cobertura se reconecta automáticamente a la red. No es necesario reiniciarlo manualmente.
  • Alarma para evitar la manipulación del sistema.
  • Permite enviar SMS para gastar saldo (útil para SIM de prepago).
  • Arreglado el bug que reiniciaba constantemente el módulo con tarjetas SIM de OMVs

Material

Esquema

 Activar un relé mediante una llamada perdida

Como muestra el esquema, el pin 2 de arduino está conectado a tierra. Este pin de entrada será usado para disparar la alarma, de este modo, queda desactivada, puesto que se activa a nivel alto. Para habilitarla podríamos conectar un interruptor como pull up de modo que quede presionado constantemente y al liberarlo (abrir el circuito) la entrada del pin 2 se ponga a nivel alto.

NOTA:

En el esquema el módulo GSM TC35 se alimenta directamente desde Arduino pero no es lo más adecuado, ya que puede llegar a tener un consumo de hasta 2A, por tanto, es recomendable conectarlo a una fuente de alimentación distinta a la de Arduino de al menos dicha capacidad. [Gracias a Alejandro por este apunte]

Editado: El esquema ahora está actualizado para que el módulo GSM TC35 tenga su propia fuente de alimentación. (Recomendado)

Ejemplo de pulsador en modo pull up:

Pulsador modo pull up

Código

A continuación se muestra el código completo del sistema. Cabe destacar que está comentado para que sea fácil de entender.
Nota: Los números de móvil que aparecen en el código son inventados, son sólo ejemplos. El número 666554433 correspondería al administrador del sistema, la alarma avisaría a este número y se le enviará el mensaje para agotar saldo. El número 950000000 correspondería al número de control, es decir, si este número realiza una llamada al sistema esté no accionará el relé, en su lugar, enviará un sms al administrador avisando que está operativo.

Puede que el código esté desactualizado. Descarga la última versión en GitHub

/*
 * Fecha: 10/07/2013
 * Autor: Cristóbal Medina López
 * Licencia:
 * Este Software está distribuido bajo la licencia general pública de GNU, GPL. Puedes encontrar esta licencia completa en http://www.gnu.org.
 * Es gratuito, puedes copiar y utlizar el código líbremente sin cargo alguno. Tienes derecho a modificar
 * el código fuente y a distribuirlo por tu cuenta, siempre informando de la procedencia original.
 *
 * Activar relé mediante llamada de teléfono. Versión 2013.
*/

//Hacemos uso de SoftwareSerial para usar dos pines cualquiera de arduino
#include 

SoftwareSerial mySerial(5,6); //rx,tx
String inGSM; //Almacenar la informaci'on leida del modulo gsm
String numList[]={"600000000","612345678"}; //N'umeros autorizados
boolean intrusos=false;
double ttl=0; //Tiempo de vida

void setup()
{
  pinMode(9, OUTPUT); // rel'e
  pinMode(2, INPUT); // pulsador
  pinMode(11, OUTPUT); // altavoz
  pinMode(10, OUTPUT); // igt modulo gsm tc35
  mySerial.begin(9600);
  Serial.begin(9600);
  initGSM(); //iniciar el modulo gsm
}
 
void initGSM(){
  digitalWrite(9,HIGH); //desactivamos el rel'e (activo a nivel bajo)
  digitalWrite(10,LOW); //activamos el modulo gsm (activo a nivel bajo)
  Serial.println("Iniciando...");
  mySerial.print("AT+CPIN=1234\r\n"); //Enviar PIN (1234)
  delay(10000);
  mySerial.print("AT+CLIP=1\r\n"); //Activar alarma llamada
  delay(500);  
  mySerial.print("AT+CMGF=1\r\n"); //Activar modo texto
  delay(500); 
}

//Funci'on: Comprueba si el n'umero est'a autorizado
//true si tiene permiso, false si no lo tiene.
boolean isAllow(String num){
  for (int i=0;i<sizeof(numList);i++){
     if (num==numList[i])
         return true;
  }
  return false;
}

// Funci'on: Accionar rel'e
void fire(){
   digitalWrite(9,LOW);
   delay(800); //tiempo que permanece activo el rel'e
   digitalWrite(9,HIGH);
}

// Funci'on: Enviar sms
void sendSMS(){
   mySerial.print("AT+CMGS=666554433\r\n"); //Comando AT enviar SMS
   delay(1000);
   mySerial.print("Estoy operativo ;)"); //Mensaje
   delay(1000);
   mySerial.print("\x1A"); //Enviar ascii SUB  
}

void loop() {
  inGSM="";
  ttl++;
  
  //Si se detectan intrusos llamar al administrador (666554433)
  //Se ha liberado el pulsador
  if (digitalRead(2) == HIGH && intrusos==false){
      intrusos=true;
      mySerial.print("ATD666554433;\r\n");
      delay(500);
  }

  //Si intrusos, emitir sonido (alarma).
  if (intrusos){
     tone(11,800,100);
     delay(200);
  }
  
  //Leer enventos en modulo gsm
  while (mySerial.available()>0){
     delay(10);
     inGSM += (char)mySerial.read(); 
  }
  
  Serial.print(inGSM);

  //Si llamada
  if (inGSM.indexOf("RING")>-1){
      delay(1000);
      mySerial.print("AT+CHUP\r\n"); //Rechazar llamada
     
      String num;
      int inicio=inGSM.indexOf('"')+1;
      int fin=inicio+9;
      
      num=inGSM.substring(inicio,fin); //Extraer n'umero    
      
      //Si es el administrador, detener alarma.
      if (num=="666554433"){
         intrusos=false; 
      }
      
      //Si autorizado, accionar rel'e    
      if (isAllow(num)){
        fire();
      }else{ // *** Opcional ***
         // Si n'umero de control (950000000)
         if (num=="950000000"){
	   // Enviar SMS al administrador para consumir saldo.
           sendSMS();
         }
      }
  }
   
  //En caso de perder la cobertura, volver a conectarse a la red
  if (inGSM.indexOf("CREG:")>-1 && inGSM.indexOf("CREG: 0,1")==-1 && inGSM.indexOf("CREG: 0,5")==-1){
    Serial.println("Se ha perdido la cobertura, reiniciando...");
    mySerial.print("AT+CFUN=1,1\r\n");
    delay(4000);
    initGSM();
  }
    
  //Comprobar estado de la red
  if (ttl==150000){
     mySerial.print("AT+CREG?\r\n");
     ttl=0;
  }   
}

 Extra

Imagen sistema activación de relé llamada perdida

Comparte este artículo

Comentarios   

+1 # bestu 30-09-2013 12:54
Es muy interesante este proyecto. Pero me surge la duda sobre su posible viabilidad económica. ¿Has podido rentabilizarlo?
Saludos.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 08-10-2013 16:16
Cito a bestu:
Es muy interesante este proyecto. Pero me surge la duda sobre su posible viabilidad económica. ¿Has podido rentabilizarlo?
Saludos.


Actualmente existen en el mercado dispositivos que realizan funciones similares, sin embargo, arduino nos permite ser creativos y añadir funcionalidades que hagan el producto más atractivo. Sin ir más lejos, la alarma que posee esta versión es un plus.

Si tu pregunta se refiere a si yo estoy ganando dinero con este sistema, la respuesta es que no (tampoco es mi objetivo).
Si tu pregunta se refiere a si es posible ganar dinero con este sistema, mi respuesta es que probablemente lo sea.

Espero haber resuelto tu duda :-)
Un saludo!
Responder | Responder con una citación | Citar
+2 # Jose 16-12-2016 12:59
Hola. Agradeceria si alguien me manda el códio tal cual para hacer lo mismo con un modulo sim900
Por favor enviarmelo por correo si alguien lo tiene. Quiero activar y desactivar una caldera con llamada perdida con SIM 900
Responder | Responder con una citación | Citar
+2 # Alejandro 07-10-2013 21:24
Mis felicitaciones al proyecto, tengo un modulo TC35 que pensaba que no funcionaba y era por problemas en el conexionado, al hacerlo por los puertos serie del Arduino y al no ser compatibles los niveles de voltaje. Muchas gracias por compartirlo.
Responder | Responder con una citación | Citar
+1 # Cristóbal Medina 08-10-2013 16:08
Cito a Alejandro:
Mis felicitaciones al proyecto, tengo un modulo TC35 que pensaba que no funcionaba y era por problemas en el conexionado, al hacerlo por los puertos serie del Arduino y al no ser compatibles los niveles de voltaje. Muchas gracias por compartirlo.


Gracias a tí por visitar el blog y compartir tu experiencia.
Un Saludo!
Responder | Responder con una citación | Citar
+1 # Alejandro 08-10-2013 17:00
Hola, haciendo pruebas de llamada por parte del TC35 usando tu código versión 2013, me he dado cuenta que, aunque quite la alimentación del Arduino y del TC35, el móvil me sigue dando tonos de llamada del número que está en el TC35. ¿Te pasa eso a ti?
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 08-10-2013 17:22
Hola,
Si desconectas la alimentación mientras realizas la llamada y ya ha dado el primer tono puede ocurrir lo que comentas.

Si desconectas la alimentación antes de realizar la llamada me resulta algo bastante extraño a la par que curioso. Si el módulo no tiene alimentación, no está conectado a la red y por tanto, si llamas al número que está en el TC35 debería salirte la locución diciendo que está apagado o fuera de cobertura.
Si es el caso y descubres que está pasando no dudes en comentarlo por aquí.

Un Saludo!
Responder | Responder con una citación | Citar
0 # Alejandro 08-10-2013 17:42
Ocurre si quito la alimentación al proyecto cuando ya ha dado el primer tono. Pero igual no me he explicado bien, es la llamada que me realiza el TC35 la que sigo recibiendo en mi móvil aunque el TC35 esté apagado, cosa que no entiendo por qué, aunque no es tampoco muy importante pero lo investigaré.

Por cierto, según el datasheet del TC35, indica que tiene consumos de pico de 2A, y veo que lo alimentas directamente del Arduino, yo le tengo puesto un alimentador independiente, aunque no tengo claro si esos 2A de pico se producen en caso de tener una batería conectada al TC35, en todo caso también dice que en modo llamada, en GSM900, tiene un consumo de 300mA.

Según el datasheet: "It must be able to provide a peak current of about 2A for uplink transmission and account for drops on the VBATT+ line that may be caused in transmit bursts."

Si consigo algo nuevo lo comentaré en el blog.

Un saludo y gracias de nuevo.
Responder | Responder con una citación | Citar
+1 # Cristóbal Medina 08-10-2013 18:01
Si ya ha dado el primer tono puede ocurrir que la llamada permanezca activa. De igual modo ocurre si estas realizando una llamada y se te agota la batería (o la desconectas) del teléfono móvil mientras está dando tonos, esto me ha ocurrido alguna vez . Supongo que será algo relativo al repetidor de la compañía.

Con respecto al pico de 2A tienes toda la razón y olvidé comentarlo en el artículo. Según mis pruebas parece que cuando más consume es al recibir una llamada y efectivamente, yo también le tengo puesta una fuente independiente (aunque no lo he reflejado en el esquema). Voy a actualizar el artículo haciendo un apunte sobre esto.

Gracias!
Responder | Responder con una citación | Citar
0 # indio99 19-11-2013 23:56
Hola, Tengo un TC35 Revision3 y siempre me sale que no está registrado a la red y siempre está iniciando el modulo GSM.

Si comento las líneas de la comprobación del estado de la red, todo funciona perfectamente, la llamada entra, la llamada es rechazada, guarda el número que llama en la variable y la identifica si está permitido o no y en base a eso realiza las demás acciones

Lo que quiero decir es que el módulo GSM está conectado, con cobertura y operativo, pero en cuanto al comando AT+CREG? no devuelve ningún valor

En el pin IGT indicas que está activo a nivel bajo y lo pones a nivel bajo tan sólo una vez al ejecutar la función initGSM, pero después no lo vuelves a poner a nivel Alto, por que???

Ando un poco perdido, con el tema de éste módulo GSM y me es muy importante poder detectar el estado de la red y ctuar en consecuencia cuando la señal se pierda, ya que estoy montando un sistema que ha de estar días y días, diría que años sin reiniciarse ni que le tenga que reiniciar

Muchas gracias, espero que me puedan ayudar
Saludos
Responder | Responder con una citación | Citar
+3 # Alejandro 20-11-2013 09:31
Hola, el modulo TC35 necesita un impulso de al menos 100ms en el pin IGT a nivel bajo para activar dicho módulo, luego teóricamente no pasa nada porque quede en alta impedancia o a nivel alto, aunque yo modifiqué la línea con un delay de 120ms y luego puse el IGT a nivel alto por si acaso.

En relación al comando AT+CREG?, te recomiendo que conectes el modulo TC35 al PC vía puerto serie y que mediante Hyperterminal o bien Putty (mejor) accedas al módulo y trastees con los comandos AT para que veas los resultados. Puede ser que tu módulo no reconozca el comando AT+CREG?, el mío no reconoce algunos de los estándar que vienen en el PDF de Siemens.
Responder | Responder con una citación | Citar
+2 # Cristóbal Medina 20-11-2013 22:41
Tal y como dice Alejandro, en teoría no es relevante como quede IGT y en la práctica funciona correctamente de ambas formas :)

Con respecto a lo que te ocurre con el comando AT+CREG? es algo extraño, debería devolver algo, aunque sea un mensaje de error. Como bien dice Alejandro, lo mejor es que compruebes con el ordenador como se comporta el módulo cuando le envías ese comando.

Ya nos contarás que tal ha ido.
Un saludo!
Responder | Responder con una citación | Citar
0 # Indio99 23-11-2013 11:14
Hola, agradezco enormemente vuestras respuestas.
Esta semana he estado más atareado de lo esperado y no he tenido ocasión de tocar el tema. Esta tarde y mañana me pongo a ver que ocurre y comento.
Para el tema del pin IGT, creo haber probado ya antes a meterle picos de 5v y 0 y no conseguí que iniciara, sólo me iniciaba si lo derivaba a masa, es decir en vez de cambiar de 5 a 0v sólo se activaba al pasar de nada a GND es correcto eso???
Si es así puedo ponerle un transistor bipolar (que alguno tengo por casa bc548) npn que me haga el cambio de nada a masa.
Gracias nuevamente por todo, y en cuanto lo pruebe tendréis noticias mías en breve.
Saludos
Responder | Responder con una citación | Citar
+2 # Alejandro 23-11-2013 12:08
Aunque parezca algo obvio... ¿Tienes las masas del Arduino y del TC35 unidas? Han de estarlo para que los niveles lógicos y señales estén al mismo plano.

La señal IGT ha de estar a nivel bajo un mínimo de 100ms después de alimentar el TC35, sin máximo, por lo cual simplemente poniéndola a 0V debería ir. No hay que hacer ninguna circuitería especial, simplemente con la salida del Arduino se activa. Si quieres, al principio del sketch puedes ponerla a nivel alto para asegurarte el encendido, para luego bajarla con un delay de 120ms y luego volverla a subir, pero como ya te comentó Cristóbal, son procesos redundantes. Pero funciona de cualquier manera sin necesidad de nada externo. Con el sketch de Cristóbal funciona OK, partiendo de esa base puedes hacer tus propias modificaciones, pero con ese sketch lo inicia correctamente.

Y en cuanto a la compatibilidad de comandos AT con tu módulo, es MUY recomendable, sobre todo si quieres tener control sobre calidad de señal y operativa del mismo, que lo conectes vía RS232 al PC, pasando de Arduino, y que con un programa de terminal tipo Putty le envíes los comandos a pelo, en el mío había muchos que quería utilizar y que no reconocía (por ejemplo, AT+SIND). Así tomas nota de los comandos que reconoce y te familiarizas con las respuestas que da el módulo, que también pueden variar de uno a otro "chino".

Ya nos contarás.
Responder | Responder con una citación | Citar
0 # Indio99 23-11-2013 23:53
Hola de nuevo ;)
IGT asunto zanjado, todo como el esquema y el sketch y sin problemas. Cabezonería mía el no haberlo hecho así antes. Gracias

La cobertura me sigue fallando, aunque ya si veo que responde al comando AT+CREG? esto es lo que me devuelve

----------------
Iniciando
----------------
AT+CLIP=1
OK
AT+CMGF=1
OK
AT+CREG?
+CREG: 0,5

OK
Se ha perdido la cobertura, reiniciando...
AT+FUN=1,1
OK
^SYSSTART
AT+CREG?

OK
Se ha perdido la cober....... Y así continuamente.
Siempre sale un espacio entre +CREG: 0,5 y el siguiente OK
Porqué??? Puede ser la causa de lo que me pasa??
El codigo que tengo es el mismo sketch al que sólo he modificado los pines de salida y myserial por Serial1, ya que uso un arduino Mega
Responder | Responder con una citación | Citar
+2 # Cristóbal Medina 24-11-2013 22:56
Hola!
En realidad no tienes ningún problema con CREG, es culpa del código. Te explico:

Estás recibiendo +CREG: 0,5. Es una respuesta correcta que indica que estás registrado en la red como roaming. En el código no está contemplado este tipo de conexión, de modo que se reinicia porque no está registrado en la red de la operadora (home network). Por curiosidad, ¿De qué operadora es la SIM? ¿Es una OMV?

La solución es sencilla, sustituye esta línea del código:

if (inGSM.indexOf( "CREG:")>-1 && inGSM.indexOf(" CREG: 0,1")==-1){

por esta otra:

if (inGSM.indexOf( "CREG:")>-1 && inGSM.indexOf(" CREG: 0,1")==-1 && inGSM.indexOf(" CREG: 0,5")==-1){

Ya nos contarás que tal funciona, si lo hace correctamente podría actualizar el código :lol:

Un Saludo!
Responder | Responder con una citación | Citar
0 # indio99 25-11-2013 09:18
Hola de nuevo.
Si, ya al principio de mi problema no conseguía ver que valor devolvía AT+CREG? y eso me trastornó un poco, porque aunque había compilado tu sketch tal cual, lo había insertado junto al código del proyecto que estoy montando, y había un poco de conflicto porque no fui capaz en ese momento, de adaptarlo adecuadamente.
Ya todo solucionado¡¡¡, pero para colmo cuando ya estaba todo OK, resulta que como bien has dado en la tecla, uso una tarjeta sim de Simyo (OMV), y por eso también mi desconcierto al no entender que pasaba.
La modificación de la condición que has planteado es correcta, funciona estupendamente, salvo que entre CREG: y 0,1 y 0,5 hay que dejar un espacio, si no no me funciona, seguro que se te ha pasado al escribir el post, porque en la línea del sketch sin modificar lo tienes bien, con espacio entre CREG: y 0,1.
MUCHAS GRACIAS¡¡¡¡¡¡
Ya para acabar, si fuera posible que me explicaras (soy un tremendo ignorante, recién estoy empezando en esto de la programación) por qué del ==-1, es decir la primera condición
inGSM.indexOf(" CREG:")>-1 la entiendo sin problemas, lo que no entiendo es el ==-1 de las otras dos condiciones.
en mi desconocimiento hubiera empleado
if (inGSM.indexOf( "CREG:")>-1 && (inGSM.indexOf( " CREG: 0,")==1 || inGSM.indexOf(" CREG: 0,")==5)){
pero no se si así funcionaría ya le digo, que ando un poco perdido con ese ==-1 y me gustaría entenderlo.

Ha!, decir también que la modificación de su código, para estar seguro de que funcionaba correctamente, lo probé con la sim de Simyo y con una de Orange, las dos devolvieron valores 0,5 y 0,1 respectivamente y las dos funcionaron perfectamente.

Gracias
Responder | Responder con una citación | Citar
+3 # Cristóbal Medina 27-11-2013 11:23
Hola de nuevo!
La función indexOf() devuelve la posición donde se encuentra la primera aparición de la cadena especificada. Si no se encuentra, devuelve -1.
En nuestro ejemplo buscamos "CREG: 0,1" y "CREG: 0,5", como no lo encuentra nos devuelve -1 (de ahí que lo comparemos con ese valor). Por tanto, sabemos que no estamos conectados correctamente a la red.

Por cierto, gracias por probarlo. Pronto subiré la versión actualizada :-)

Un Saludo!
Responder | Responder con una citación | Citar
0 # Alejandro 12-02-2014 17:40
Cristóbal:

Creo que en esta línea que propones hay una errata:
if (inGSM.indexOf( "CREG:")>-1 && inGSM.indexOf(" CREG: 0,1")==-1 && inGSM.indexOf(" CREG: 0,5")==-1){

El segundo operador AND entre CREG: 0,1 y CREG: 0,5 debería ser un OR, tal y como ponía el compañero indio99, ¿no?. Además debería estar todo ese segundo bloque entre paréntesis, tal y como indicaba indio99, para que se cumpla cualquiera de las dos posibilidades.

Otra cosa: en mi ignorancia sobre C++ (vengo de Clipper...) no entiendo por qué buscas primero la cadena "CREG" y si está, posteriormente "CREG: 0,1". ¿No sería más directo buscar esto último?

O sea:
if (inGSM.indexOf( "CREG: 0,1")==-1 || inGSM.indexOf(" CREG: 0,5")==-1){


Gracias y un saludo.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 12-02-2014 23:10
Hola Alejando,

Aunque no lo he probado personalmente, yo creo que la línea es correcta, de hecho, #indio99 lo confirma en un comentario anterior. En lenguaje natural vendría a ser algo como:

Si se encuentra una respuesta que contienen la palabra CREG y no es CREG:0,1 y tampoco es CREG:0,5 entonces reiniciamos el módulo.

Con el código que tu propones probablemente el módulo se reiniciaría constantemente ya que la condición se haría verdadera al no encontrar CREG:0,1 o no encontrar GREG:0,5, algo que siempre ocurre. Ten en cuenta que si devuelve CREG:0,1 no devolverá CREG:0,5 y viceversa.

No obstante, te invito a que lo pruebes y nos comentes los resultados.
Un Saludo!
Responder | Responder con una citación | Citar
0 # Alejandro 14-02-2014 18:44
Cierto, se reinicia constantemente por lo que el código acertado es el tuyo.

Lo que no entiendo son dos cosas, si fueras tan amable me gustaría que me las explicaras:
1) ¿Por qué buscas primero CREG y luego CREG: 0,1? ¿No sería más lógico buscar directamente el segundo estado y si no es CREG: 0,1 ni CREG: 0,5 reiniciar?

2) Dentro del "if", entiendo que la traducción es: Reiniciamos el módulo si encuentro CREG Y además no contiene CREG: 0,1 Y además no contiene CREG: 0,5, ¿no? Por eso decía yo que sería lógico que entre el 0,1 y el 0,5 debería haber un OR y no un AND puesto que entiendo que de esa manera se deberían cumplir las tres condiciones. Estoy confundido.

Saludos.
Responder | Responder con una citación | Citar
+1 # Cristóbal Medina 16-02-2014 11:59
Hola Alejandro,

1) Busco primero CREG para asegurarme que el módulo me ha devuelto una respuesta de ese tipo. Existen otras que no son 0,1 ni 0,5. No obstante, creo que como tú dices se podría evitar esa comprobación.

2) Efectivamente, como dices, el comportamiento es ese. Deben cumplirse todas las condiciones para que entre en ese if, precisamente por eso la condición debe ser un "AND" en lugar de "OR". Nota que buscamos que no contenga esas cadenas. CREG: 0,5 y CREG: 0,1 son los únicos valores que tomaremos por validos, por tanto, si hemos recibido algún CREG que no es ninguno de los anteriores es que no estamos registrados correctamente en la red (hemos perdido la cobertura) y en consecuencia reiniciamos el módulo.

Espero haberte aclarado la duda.
Gracias por tu interés!
Responder | Responder con una citación | Citar
0 # Alejandro 20-02-2014 14:56
Hola, Cristóbal.

No lo entiendo. Algo hay que escapa de mi entender, puesto que si ejecuto este simple código para que encienda el LED del pin 13 conectado a la placa lo enciende en el caso que la cadena sea diferente, a la comparada, y lo apaga si es distinta. O sea, usando un OR. Sin embargo, usando tu código ejemplo no funciona, y hay que usar tu sentencia. No acabo de comprender por qué. Si una comparación tiene por medio un AND significa que las dos (o las tres) comparaciones han de cumplirse TODAS para que sea TRUE, sin embargo con el OR quiere decir que UNA o bien OTRA de las dos condiciones han de ser las efectivas, que sería el caso en que o bien es 0,1 o bien es 0,5, pero nunca LAS DOS a la vez. No comprendo nada.

Te agradezco la paciencia, dime por favor qué es lo que se me escapa...


Nota:
Este es el código de prueba, si metes a mano el valor de inGSM poniendo otro que no sea 0,1 ni 0,5 verás que se apaga el LED. He probado asignando a la variable inGSM tanto el tipo STRING como el tipo CHAR, ambas con idénticos resultados.

void setup(){
pinMode(13,OUTPUT);
}


void loop(){
String inGSM="CREG: 0,1"; //Valor de inGSM 'metido a mano'
digitalWrite(13 ,LOW);
if (inGSM!="CREG: 0,1" && inGSM!="CREG: 0,5"){ //Si no coincide con el valor de inGSM, enciende LED
digitalWrite(13 ,HIGH);
}
}


Gracias y un saludo.
Responder | Responder con una citación | Citar
+1 # Cristóbal Medina 27-02-2014 18:08
Hola Alejandro,
El comportamiento de los operadores AND y OR es exactamente como explicas en tu comentario.

Yo creo que el problema lo tenemos en este caso concreto. La clave está en que sólo tenemos dos casos en los cuales todo va bien, esos casos son recibir "CREG: 0,1" llamémoslo A o "CREG: 0,5" llamémoslo B, en cualquier otro caso la cosa va mal y tenemos que reiniciar el módulo.

En el código, la forma que estamos usando para implementar esto es comprobar lo que recibimos, de modo que: si no recibimos A y tampoco recibimos B [1] significa que hemos recibido cualquier otra cosa (no nos importa el qué) por tanto, algo va mal y reiniciamos el módulo.

Si usamos OR en lugar de AND podría pasar los siguiente:
Imagina que recibimos CREG: 0,5 porque usamos una SIM de una OMV, cuando llegamos a la comparación, las condiciones tomarían los siguientes valores:
inGSM.indexOf(" CREG: 0,1")==-1 => Verdadero, ya que no se ha encontrado.
inGSM.indexOf(" CREG: 0,5")==-1 => Falso, ya que si se ha encontrado.
Por tanto si hacemos Verdadero OR False da como resultado Verdadero, de modo que se reiniciaría el módulo cuando no tendría que hacerlo.

[1] No recibimos A => inGSM.indexOf(" CREG: 0,1")==-1
Y=> &&
No recibimos B => inGSM.indexOf(" CREG: 0,5")==-1

Espero haberlo explicado algo mejor :)
De todos modos, si sigues teniendo dudas no te preocupes, podemos seguir tratando este tema por email.

Un Saludo y muchas gracias por visitar el Blog!
Responder | Responder con una citación | Citar
0 # Alejandro 03-03-2014 22:58
Cierto, llevas toda la razón. No lo veía de esa manera y estaba empecinado con el OR, que me parecía lo más lógico, nunca mejor dicho.

Te agradezco mucho la atención de responderme a esa duda y dar una respuesta extensa y con intención de despejarme la duda, que lo has hecho perfectamente.

Quisiera hacer dos puntualizacione s, una que voy a eliminar en mi código el primer "CREG:" sin asignación de valores, ya que he comprobado que funciona, y la segunda es que la función indexOf, al devolver la posición en la cadena origen de la cadena a buscar, también nos dará un valor mayor que -1 en caso que la respuesta del módem por ejemplo sea "CREG: 0,18" ya que encuentra "CREG: 0,1" primeramente, obviando que hay un "8" después del "1", pero no tendría que dar ningún problema puesto que según el manual técnico, la respuesta que va a dar el módem consta de dígitos de una sola cifra y de 0 a 5.

O sea, resumiendo tanto royo por mi parte, que funcionará sin problemas tal y como lo tenías tú indicado pero lo dejaré así para entenderme yo más por mi cuenta:

if (inGSM.indexOf( "CREG: 0,1")==-1 && inGSM.indexOf(" CREG: 0,5")==-1){


Reitero mi agradecimiento. Tema zanjado. Un saludo.
Responder | Responder con una citación | Citar
+1 # indio99 27-11-2013 18:12
Hola
Gracias por la aclaración, conocía algo en referencia a indexOf() no mucho, de echo desconocía que devuelve -1 si no encuentra ningún resultado, ahora si me cuadra todo ;-)
Gracias a su código he podido terminar un proyecto que necesitaba acabarlo ya.
Eternamente agradecido, si alguna vez necesita algo, si puedo me encantaría poder ayudarle.
Saludos
Responder | Responder con una citación | Citar
+1 # Alejandro 28-11-2013 19:16
Muy interesante la información sobre los operadores OMV. No lo sabía. Gracias a ambos.

Quisiera hacer una pequeña aportación, además de comprobar el servicio con AT+CREG también hago una comprobación previa consistente en ver si está insertada la SIM y si es correcta mediante AT^SCKS, para no entrar en un bucle reiniciando el TC35 en caso que se nos haya "olvidado" poner la SIM o ésta sea defectuosa o el zócalo falle. En ese caso, muestro un mensaje en el display para que el usuario haga comprobaciones y corto la alimentación del TC35 mediante un relé para que no se lo cargue al reintroducirla, reiniciando el sistema se pone en marcha todo de nuevo.
Responder | Responder con una citación | Citar
0 # Indio99 30-11-2013 15:55
Ok, gracias por el aporte, lo voy a probar tsmbien, que todo lo que sean mejoras .... Mejor está, ademas me parece correcto comprobar si se dncuentra o no una sim antes de intentar conectar con ningún operador, que si no hay sim o está mal insertada, o es defectuosa o falla el zócalo, pues que el sistema advierta de ello, al igual que hacen los móviles al encenderlos sin sim.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 30-11-2013 20:41
Interesante lo de comprobar si está la SIM, no se me había ocurrido. Actualizaré el código con las mejoras en breve.

Muchas gracias por vuestras aportaciones!!
Responder | Responder con una citación | Citar
+1 # sandra 28-01-2014 11:05
INCREÍBLE, JUSTO LO QUE NECESITABA. Voy a ver si puedo implementarlo en mi proyecto, ayudaría mucho en el trabajo a mi padre.
Responder | Responder con una citación | Citar
0 # Javier 30-07-2014 17:54
Te he escrito tambien en el video, pero por si no lo ves.. te escribo tambien aqui.

Estoy buscando un web relay para ctivar una sirena ¿sabes dea lgo similar en arduino o como se tendría que hacer?

Gracias
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 31-07-2014 19:18
Hola Javier,

He visto tu comentario en el vídeo y he contestado allí, pero ya que está aquí también, copio y pego por si le es de utilidad a alguien más.

Sólo necesitarías un shield ethernet si ya dispones de una placa arduino uno (o similar) o podrías usar directamente la versión de arduino que incluye ethernet. Gracias a la librería ethernet de arduino podrás leer fácilmente la información que recibas a través de la red. Sobre esto seguro que existen un motón de ejemplos en la Web. No obstante, si tienes alguna duda, aquí estamos para ayudar.

Gracias por visitar el blog,
Un Saludo!
Responder | Responder con una citación | Citar
0 # fep 18-09-2014 03:26
Te felicito por tu proyecto. Esta muy bueno. Existe la posibilidad de administrar los números permitidos via mensaje de texto? Me explico. Seria posible agregar o eliminar números sin tener que modificar el código con el pc y conectarse al Ardruino?

Por favor si alguien sabe como hacerlo seria increíble.

saludos,
Responder | Responder con una citación | Citar
0 # fep 18-09-2014 03:24
Te felicito por tu proyecto. Esta muy bueno. Existe la posibilidad de administrar los números permitidos via mensaje de texto? Me explico. Seria posible agregar o eliminar números sin tener que modificar el código con el pc y conectarse al Ardruino?

Por favor si alguien sabe como hacerlo seria increíble.

saludos,
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 20-09-2014 09:24
Hola fep,
Me alegra que te guste el proyecto.
En lo referente a tu comentario, si que se podría hacer lo de administrar la lista de números. Interpretar los SMS desde el TC35 no es muy complicado y una vez que tengas el nuevo número sólo habría que añadirlo a la lista. Por otra parte, lo mejor seguramente sería tener una memoria para almacenar la lista, por ejemplo, una tarjeta sd.
Responder | Responder con una citación | Citar
0 # pet 25-09-2014 21:22
Buen proyecto. Funciona 100%. No le vendría mal poder desactivar el relé con una segunda llamada. Tambien es una pena no poder usar el 2º relé, activándolo y desactivándolo mediante una llamada, una sugerencia que no vendría mal. A ver si te animas.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 29-09-2014 10:49
Hola,
Me alegra que te guste el proyecto.
Todo lo que propones se podría llevar a cabo.
Activar mas o menos tiempo el relé es algo muy fácil de cambiar en el código. Por otro lado, para activar el segundo relé se podría, por ejemplo, esperar dos tonos o incluso hacerlo vía SMS.
Responder | Responder con una citación | Citar
0 # yecid torres 02-10-2014 20:52
hola.
muy interesado en tu proyecto..
tengo un arduino mega 2560 y una shiel m95 .. que cambios en los comandos debo hacer ... si me puedes ayuadar seria de gran ayuda .. gracias
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 04-10-2014 09:46
Hola Yecid,
Nunca he trabajado con la shield m95 pero la mayoría de los comandos AT seguramente sean comunes. Comprueba si existen todos los comandos que son usados en el código en la guía de comandos AT de tu dispositivo ( puedes encontrarla en goo.gl/vBVr3u ), si alguno no existe, debería ser suficiente con sustituirlo por un comando adecuado que se comporte de forma similar.

Gracias por mostrar interés en el proyecto!
Responder | Responder con una citación | Citar
0 # Zoe 23-11-2014 22:30
Hola esta bueno tu proyecto no entiendo lo de la llamada perdida, y porque manda un mensaje para consumir saldo, osea porque es necesario consumirle el saldo?, y la funcion que manda el sms con el comando ("AT+CMGS=\"666 554433\"\r\n"); no consume saldo???
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 27-11-2014 11:24
Hola Zoe,
En mi caso necesito consumir saldo porque la compañía telefónica no permite mantener líneas de móvil si no se hace uso de ellas. De modo que, si no gastas saldo en seis meses, dan de baja el número.

La función de enviar SMS consume saldo, gasta exactamente el coste de enviar un SMS.

Gracias por visitar el blog.
Un saludo!
Responder | Responder con una citación | Citar
0 # Angel Vinny 02-02-2015 02:43
Saludos Cristobal,

Es un proyecto muy bueno te felicito amigo, el mundo de los microcontrolado res es facinante, quisiera hacerte una pregunta, estoy trabando en un proyecto similar pero con el modulo SIM900, he podido hacer llamadas, y envío de mensajes, pero no puedo lograr recibir una llamada, ni leer mensajes entrantes, tu crees que esté mismo código funcione con SIM9000,

Agradecería tu aporte

Exitos.!
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 03-02-2015 08:20
Hola Angel,

La mayoría de los comandos AT seguramente sean comunes entre el módulo SIM900 y el TC35. Comprueba si existen todos los comandos que son usados en el código en la guía de comandos AT de tu dispositivo ( puedes encontrarla en goo.gl/QjyOYu ), en caso de no existir alguno, debería ser suficiente con sustituirlo por un comando adecuado que se comporte de forma similar.

Con respecto a la recepción de llamadas, comprueba que la alimentación que estás suministrando al módulo es suficiente.

Gracias por visitar el blog.
Saludos!
Responder | Responder con una citación | Citar
0 # jorge escobar 24-02-2015 01:41
hola,excelente el proyecto, quiero hacer algo parecido pero con bluetooth, ¿como logro activar un rele por 1 segundo y luego se desactive como para dar el pulso al motor. gracias.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 24-02-2015 09:00
Hola Jorge,

La parte de activar y desactivar el relé se hace igual que en el código que muestro en este post. Fíjate en la función fire() que se usa para activar el relé.

Con respecto a la conexión a través de Bluetooth, supongo que la idea será usar un teléfono móvil que se conecte al bluetooth de arduino. Si es así, puedes encontrar un motón de ejemplos en foros y webs que muestran cómo hacer dicha comunicación.

Suerte con tu proyecto.
Un Saludo!
Responder | Responder con una citación | Citar
0 # jorge escobar 20-03-2015 03:23
hola cristobal, disculpa que te moleste otra vez pero no puedo añadir la linea que me recomendaste, te mando el programa que tengo para que me ayudes como hacer que despues de encender el led se apague solo al segundo.
int led13=13;
int estado=0;

void setup(){
Serial.begin(96 00);
pinMode(led13,OUTPUT);
}

void loop(){
if(Serial.avail able()>0){
estado = Serial.read();
}
if (estado =='1'){
digitalWrite(le d13,HIGH);
}
if(estado=='2'){
digitalWrite(le d13,LOW);
}
}
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 21-03-2015 23:43
Hola Jorge,

El código para encenderlo durante, por ejemplo, un segundo, sería:

digitalWrite(led13,HIGH); // Encender Led
delay(1000); // Esperar un segundo (1000ms)
digitalWrite(led13,LOW); //Apagar Led
Responder | Responder con una citación | Citar
0 # Francisco 30-04-2015 16:28
Buenas tardes Cristobal,

Antes de nada, gracias por mostrarnos el código de ejemplo. Gracias por esos comentarios que tan bien vienen :) (en mi opinión, un buen programador es aquel que sabe comentar su código)

He conseguido reutilizando código de este ejemplo, y otros códigos de otros proyectos, que mi modem (SIM900) realice una llamada cuando el voltaje sea inferior a X. (con el correspondiente sensor de voltaje)

Hasta ahí, todo correcto. El problema lo tengo en que NO sé enviarle comandos AT al modem (me gustaría aprender y monitorizar el modem. Enviarle comandos y ver su respuesta, etc...). Para empezar, esta condición no se cumple:
while (Sim900Serial.a vailable()>0){
XXX
}

Y mi pregunta es ¿si el modem no está disponible/no está iniciado, como es capaz de llamarme cuando el voltaje es inferior a x?

Mil gracias.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 03-05-2015 14:22
Hola Francisco,

Serial.available() debería devolverte el número de bytes disponibles para leer en el puerto serie (donde el módulo está conectado). Por tanto, si la condición que pones no se cumple, es que no hay datos para leer del puerto serie en ese momento.

Para enviarle comandos AT al módulo sólo tienes que escribirlos en el puerto serie con: Serial.print("c omandoAT\r\n"); donde comandoAT es la instrucción AT y \r\n son los caracteres de retorno de carro y salto de línea.
Por ejemplo, el comando AT para realizar una llamada (ATD) al número 666554433 sería: Serial.print("ATD666554433;\r\n");

Puedes encontrar una guía completa de comandos AT para el módulo SIM900 en goo.gl/QjyOYu

Gracias por visitar el blog :-)
Saludos!
Responder | Responder con una citación | Citar
0 # Francisco 17-07-2015 17:21
Buenas tardes Cristobal!

Perdona por no haber podido contestar antes, por falta de tiempo paré este proyecto y vuelvo con el de nuevo.

Trataré de no extenderme, siendo lo mas breve posible.

Actualmente, tengo un skecth que lee el voltaje, y si este baja a 0v, lanzo una llamada.

Hasta ahí todo correcto. El problema reside en que, necesito algun metodo para hacer debug, puesto que si dejo el modem en standby durante unas horas o días (es totalmente aleatorio) éste deja de realizar llamadas cuando el voltaje baja. Leo el voltaje con un sensor de voltaje, y lo conecto por ejemplo a un puerto USB del pc. Cuando desconecto dicho puerto, el voltaje cae a 0v y no realiza la llamada, pese a que por consola el codigo sigue adelante y lanza el comando ATD para llamar, pero no realiza la llamada.

En resumen, me gustaría implementar algun metodo para, comprobar el estado de la cobertura, el estado del modem, etc, para intentar depurar y saber cual es el motivo por el cual pasado x horas, éste deja de llamar.

Gracias por tu tiempo.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 20-07-2015 14:39
Hola Francisco,

Lo que yo hago para el debug es usar SoftwareSerial para el módulo GSM (mySerial en el código) y Serial por defecto para hacer debug desde el "Monitor Serial" de Arduino.

Espero que te sea de ayuda.
Saludos!
Responder | Responder con una citación | Citar
0 # Francisco 20-07-2015 14:56
Hola Cristóbal,

Vale, ya entiendo, digamos que es mas comodo o versatil usar SoftwareSerial.
¿Habria forma, de mostrar por consola todo el tráfico / comandos del modem?

Al fin y al cabo, lo que trato es de configurar DTMF para darle más funcionalidad a mi proyecto. Podría valer algo así como Serial.print(mySerial.read())?

Mi intención es, cuando haga una llamada (cuando falte la electricidad), la atiendo y marco por ejemplo el 1, y de esa forma notifico al arduino que me doy por enterado de la alarma (y evitar un bucle de llamadas).

Gracias por tu ayuda.
Un saludo.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 27-07-2015 07:53
Hola,

Claro, eso es. La idea es que puedas usar SoftwareSerial para comunicarte con el módulo GSM y Serial para mostrar por consola información con el objetivo de monitorizar el funcionamiento del sistema.

Saludos!
Responder | Responder con una citación | Citar
0 # JuanAntonio 01-05-2015 09:50
Hola Crisstobal. En primer lugar muchas gracias por tu trabajo. Estoy empezando con Arduino y al compilar tu código me da un error, concretamente en las líneas que contienen &. Si me fijo en la primera línea que me da el error:
if (digitalRead(2) == HIGH && intrusos==false ){ ....
me da la sensación de que lo que hay que poner es:
if (digitalRead(2) == HIGH && intrusos==false ){ ...
pero viendo la segunda línea que tiene el & ya no lo tengo tan claro. ¿me podrías aclarar esto?.

Muchas gracias por tu dedicación.
Responder | Responder con una citación | Citar
0 # JuanAntonio 01-05-2015 09:54
Edito mi post anterior. Yo quería poner en la primera línea del if:
"if (digitalRead(2) == HIGH && intrusos==false ){ ...."
que es lo que ne sale al copiar el código
Responder | Responder con una citación | Citar
0 # JuanAntonio 01-05-2015 09:57
Vuelvo a editar mi post.
No hay forma de escribir lo que yo quiero poner donde me sale && yo quiero poner lo que sale en el código. Lo siento
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 03-05-2015 14:26
Hola Juan Antonio,

Tienes toda la razón del mundo. Lo correcto es poner && tal y como indicas en tus comentarios.

Ya está arreglado en el código, al parecer el error se debía al plugins que estoy usando para resaltar el código fuente, por alguna razón modificaba el carácter &.

Gracias por el apunte,
Un Saludo!
Responder | Responder con una citación | Citar
0 # Paco Cardenas 08-05-2015 18:38
Tal vez sea algo ingenua mi pregunta pero soy principiante en esto. Para que funcione el código, tengo quetener exactamente el mismo modulo Siemens tc35 o puedo usar el mismo código para otros módulos gsm. Yo tengo un modulo GSM de seeedstudio SIM900 seeedstudio.com/.../....
Crees que el programa lo corra también o que necesito cambiar del código para que funcione con este modulo.
Agradecería mucho tu ayuda
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 11-05-2015 07:59
Hola Paco,

La mayoría de los comandos AT seguramente sean comunes entre el módulo SIM900 y el TC35. Comprueba si existen todos los comandos que son usados en el código en la guía de comandos AT de tu dispositivo ( puedes encontrarla en goo.gl/QjyOYu ), en caso de no existir alguno, debería ser suficiente con sustituirlo por un comando adecuado que se comporte de forma similar.

Gracias por visitar el blog,
Saludos!
Responder | Responder con una citación | Citar
0 # Javier Benitez 24-06-2015 17:10
Hola Cristóbal!!
primeramente gracias por subir esta valiosa información para los que recién comienzan en este mundo de la programación en arduino como yo.

segundo quisiera hacerte una consulta mi proyecto es el siguiente quiero que al activarse tres entradas, el arduino y claro esta el modulo gsm me llaman a tres números diferentes es decir entrada uno me llame a un numero entrada dos a otro número y así sucesivamente y si al llamar a tal numero se encuentre ocupado este tenga la opción de rellamada hasta que conteste el numero y también al enviar un mensaje o una llamada el arduino me active un relé esto si se lo puede hacer gracias?
saludos
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 25-06-2015 17:08
Hola Javier,
Claro, lo que propones se puede hacer fácilmente. La parte de activar el relé la puedes obtener del código de este post. Con respecto a llamar a números de teléfono desde arduino, sería algo como esto:

mySerial.print("ATD666554433;\r\n");

Espero que te sirva de ayuda.
Gracias por visitar el blog.
Saludos!
Responder | Responder con una citación | Citar
0 # Javier Benitez 28-06-2015 02:37
muchas gracias por tu respuesta!! y le he estado dando vueltas al asunto y lo que en este momento es para mi difícil es que comando seria necesario, si al llamar a tal numero se encuentre ocupado este tenga la opción de rellamada hasta que conteste el numero!
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 01-07-2015 13:48
Hola Javier,
Se me ocurre que podrías mirar cual es la respuesta del comando ADT y ver si podrías interpretarla. La guía de comandos AT para el módulo TC35 está disponible en goo.gl/w6Gpe

Saludos!
Responder | Responder con una citación | Citar
0 # Pedro 02-07-2015 13:32
Una consulta, porque los pines de la rx y tx del modulo GSM estan en los pines PWM del Arduino.

Saludos.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 06-07-2015 08:21
Hola Pedro,
En el código estoy haciendo uso de SoftwareSerial para usar dos pines cualquiera de arduino como rx y tx. Es útil para usar los rx y tx de serie para monitorizar lo que está ocurriendo desde la consola conectada al PC o cualquier otro dispositivo.

Gracias por visitar el Blog.
Saludos!
Responder | Responder con una citación | Citar
0 # Carlos 08-07-2015 23:40
Hola Cristobal, me estoy iniciando en TODO, programación en C, modems gsm y Arduino, toda la vida me dediqué a la RF. Me interesa mucho tu proyecto para implementar una aplicación orientad a la seguridad en nuestro barrio, ya que los ladrones nos tienen a mal traer. Por ello quería consultarte si hay forma de que el dispositivo reconozca el número que está haciendo la llamada y, a su vez, mande un SMS con el número o nombre de quién llamó.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 09-07-2015 09:51
Hola Carlos,
Si,claro. Actualmente el código reconoce el número de teléfono porque lo necesita para saber si es uno de los números autorizados para activar el relé. La parte de enviar un SMS también está implementada, puedes verlo en la función sendSMS().

Gracias por visitar el blog.
Saludos!
Responder | Responder con una citación | Citar
0 # Jaime Perelló 02-11-2015 10:42
Hola Cristóbal, gracias por el estupendo post, yo lo utilizo para dar señal a un plc zelio logic mediante la activación del rele,pero tengo un problema, utilizo el nº de control para hacer consumo de la sim para que no la den de baja pero no hay manera de que me mande ningun sms, no se si hay algun error en el sketch, Lo puedes comprobar, yo llamo al nº de control, recibe la llamada, desconecta la llamada pero no envia ningun sms.

gracias y saludos
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 04-11-2015 06:29
Hola Jaime,

Inténtalo sustituyendo la función sendSMS por esta otra:

void sendSMS(){
String msg="mensaje a enviar";
mySerial.print( "AT+CMGF=1\r\n" ); //Activar modo texto
delay(500);
mySerial.print( "AT+CMGS=\"6001 11222\"\r\n"); //AT command to send SMS
delay(1000);
mySerial.print( msg); //mensaje
delay(1000);
mySerial.print( "\x1A"); //ascii SUB
delay(5000);
}

*msg es el mensaje que quieres enviar y 600111222 es el número al que se enviará el SMS.

Espero que te sea de ayuda!
Gracias por visitar el blog :)
Responder | Responder con una citación | Citar
0 # Jaime Perelló 04-11-2015 20:10
Hola Cristóbal, ya he cambiado la función y sigue igual, no manda sms, desconecta llamada pero no manda sms

saludos.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 11-11-2015 12:09
Hola,

¿Has comprobado si al menos entra al if?
Podrías probar a encender un led o escribir algo en Serial para comprobar si está accediendo a la función.

Saludos!
Responder | Responder con una citación | Citar
0 # Jesus 10-12-2015 02:34
Hola: sin duda me he quedado maravillado con esto, es un lujo de post!!!!

Yo te quería preguntar 2 cosas:

1. has probado con este módulo: Sim800l transferencia GPRS u otros distintos al que usas aquí?? Porque si bien me interesa usar tarjetas sim no quiero que el proyecto abarque mucho tamaño.

2. Si bien con lo de llamadas perdidas permites un medio de aviso "gratuito" (porque no gastas en la llamada) quería preguntarte si te imaginagabas una forma de enviar coordenadas gps por medio de sim sin costo: no se trata de ahorrar dinero (pues un sim con mensaje no es caro) pero quería preguntarte si se te habría ocurrido una forma prácticas de comunicar datos por sim sin costo.

Muchas gracias de nuevo por este post, saludos desde Perú.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 14-12-2015 19:24
Hola Jesús,

Muchas gracias por visitar el blog y por tu comentario!

Voy intentar responder a tus cuestiones:

1. He probado con este módulo y con Adafruit fona que monta un SIM800L. Sin embargo, no he probado la función de GPRS. Sólo llamadas y SMS.

2. La verdad es que no, no se me ocurre una forma de transmitir datos sin coste...

Gracias a ti por interesarte en el post,
Saludos!
Responder | Responder con una citación | Citar
0 # angel 26-12-2015 05:51
hola he visto tu vídeo y me interesa mucho solo que yo tengo una sim900 y no logro hacer que se accione ningún pin al realizar la llamada y le he cambiado los números de teléfono para que los acepte como autorizados pero no se donde estoy fallando te agradecería por tu ayuda
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 27-12-2015 12:18
Hola Ángel,

Una buena idea para averiguar que está pasando es usar el monitor serie de arduino para ir imprimiendo por pantalla los mensajes que te está devolviendo el módulo. Estoy puedes hacerlo con la librería Serial, mientras utilizas SoftwareSerial para comunicarte con el módulo.

Espero que te sea de ayuda.
Suerte!!
Responder | Responder con una citación | Citar
0 # sergio 27-12-2015 03:53
Hola jesus,

Tengo un problema con el código la tarjeta se me apaga en el momento que entra el tono esta es un sim900

Saludos
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 27-12-2015 12:23
Hola Sergio,

Es posible que se deba a un consumo del módulo que la fuente no puede soportar. Es recomendable usar una fuente de alimentación externa a arduino y sería recomendable que pueda ofrecer 2A. ¿Lo tienes montado así? Si no, quizás ese sea el problema...

Suerte con tu proyecto,
Gracias por visitar el blog!
Responder | Responder con una citación | Citar
0 # sergio 29-12-2015 04:36
Hola ya revise la fuente de alimentación y no lo es el problema se sigue presentando
la fuente es de 5volts con 2 amperes

lo que hice es reiniciar la tarjeta con comando y vuelve a encender pero esta falla me provoca que se pierda el ciclo de programación
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 29-12-2015 17:26
Hola Sergio,

Acabo de subir una versión actualizada del código a GitHub (goo.gl/epA57s), ¿Podría probar esta versión?

La idea sería conectar arduino al pc al mismo tiempo que se realizan las pruebas y comprobar los mensajes que aparecen en "Monitor Serial".

A ver si encontramos el problema...

Saludos!
Responder | Responder con una citación | Citar
0 # Angel 04-01-2016 16:10
Hola Cristobal Quiero desearte un feliz año y felicitarte por tu proyecto te comento que ya tengo un relay funcionando pero solo cuando modifico este codigo

//Si autorizado, accionar rel'e
if (isAllow(num)){
fire();
}
por este,

//Si autorizado, accionar rel'e
if ((num)){
fire();
}
el problema es que con el segundo código se acciona desde cualquier numero,lo que significa que no acciona con la lista de números autorizados, al colocar el código original no se acciona ningún relay, el resto del código esta a la perfección, me gustaría saber si se podrá solucionar ese inconveniente ya que me interesa para abrir la puerta de un garaje y lo ideal es que solo se active con números autorizados
gracias por tu ayuda
Responder | Responder con una citación | Citar
0 # Angel 04-01-2016 16:22
Me olvidaba este es el mensaje que me sale desde el com serial al realizar la llamada desde cualquier numero con el primer o segundo código es exactamente el mismo mensaje, embargo como te comentaba solo con el segundo código logro activar el relay

RING

+CLIP: "53409439043",129,"",,"",0
AT+CHUP

OK

obviamente el numero de teléfono lo he modificado para ponerlo es el foro
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 05-01-2016 09:57
Hola Angel,

Cuando se llama a la función isAllow() lo que hace esta función es recorrer la lista de números (numList) y compararla con el número recibido (num). En caso de existir coincidencia devuelve true para entrar en ese if. Con la modificación que tu has hecho siempre devolverá true, por eso siempre se activa.

Para intentar resolver el problema comprueba que el número de la lista coincide exactamente con el número que recibes en num. Para ello, justo antes del if que has puesto puedes escribir:

Serial.println(num);

Así podrás comprobar si la variable num, tal y como es de esperar, contiene el número correctamente extraído de la cadena.

En el código, se extrae un número de 9 dígitos comenzando justo después del símbolo ". ¿Cuántos dígitos tiene el número de teléfono?
Si tiene más de 9 sólo tendrías que cambiar la línea:

int fin=inicio+9;

Espero que te sea de ayuda,
Saludos!
Responder | Responder con una citación | Citar
0 # Angel 05-01-2016 13:20
hola Cristobal

Gracias por tu ayuda me sirvió de mucho,
justamente era por el numero de dígitos del numero que llama en mi caso es 10 números pero al momento ya esta funcionando
Responder | Responder con una citación | Citar
0 # Jorge 27-01-2016 16:32
Hola Cristobal !!

Acabo de ver tu increible proyecto , y es justo lo que necesitaba

pero tengo un problema , ella radica en el hecho de que en mi modulo gsm 800C y nhduino no activa el relé y este hecho me tiene algo nervioso y al estar comenzando no se mucho del tema

apreciaria mucho que me ayudaras con mi problema :)
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 01-02-2016 09:30
Hola Jorge,

Comprueba que tu relé se activa a nivel bajo.
También puedes poner un Serial.println( "Activando Relé") en la primera línea del método fire() y comprobar desde el monitor que todo se está ejecutando según lo previsto.

Suerte con tu proyecto,
Saludos!
Responder | Responder con una citación | Citar
0 # Jorge 01-02-2016 11:20
Crisotbal!

muchas gracias!!
era un problema de alimentacion , agradezco tu respuesta.
Responder | Responder con una citación | Citar
0 # Angel 04-02-2016 03:40
Hola Cristobal

nuevamente molestando,
he estado usando tu código para abrir un motor de garaje, de un conjunto multifamiliar, que me ha funcionado de maravilla, pero ya comenzaron los inconvenientes, en la fila donde están los números de teléfonos autorizados, parece que ya no se puede ingresar mas usuarios, al momento si ingreso uno mas ya no me funciona no se como podria solucionar este problema ya que aun faltan mas usuarios sin ingresar,

por otro lado tengo dos tipos de números unos que son de los teléfonos móviles que tienen 10 dígitos y de números fijos que tienes solo 9 dígitos y este es el otro problema

espero no incomodarte y me puedas ayudar a solucionarlo, ojala sea posible
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 07-02-2016 16:59
Hola Angel,

Con respecto a la cantidad de usuarios, ¿Cuántos números necesitas autorizar?
Igual hacer uso de char* en lugar de String podría ayudar.

Por otra parte, acerca del problema de números de 9 o 10 cifras, así rápidamente se me ocurre que podrías hacer algo como:

int inicio=inGSM.in dexOf('"')+1;
int fin=inGSM.index Of('",')+1;

num=inGSM.subst ring(inicio,fin ); //Extraer n'umero

Si no me equivoco, de esta forma obtendrías el número indistintamente , tanto si es de 9 o 10 dígitos. Seguramente hay una mejor forma de hacer esto, como por ejemplo, mediante expresiones regulares.

Espero que te sea de ayuda!
Responder | Responder con una citación | Citar
0 # Andrés González 19-02-2016 02:45
String num;
int inicio=inGSM.in dexOf('"')+1;
int fin=inicio+9;

num=inGSM.substring(inicio+5,fin);

AL AGREGAR EL +5 QUE SE MUESTRA ARRIBA ELIMINAMOS LOS PRIMEROS NÚMEROS DE CELULAR. ASÍ PODEMOS GUARDAR MÁS NÚMEROS EN LA MEMORIA.

ANTES: 6621 00 01 01
DESPUÉS: 0 01 01

EL PROGRAMA LEE EL NÚMERO COMPLETO, PERO SOLO COMPARA LOS ÚLTIMOS 5 DÍGITOS.

ESPERO LES SIRVA DE AYUDA.
Responder | Responder con una citación | Citar
0 # Ricardo 07-03-2016 12:34
Enhorabuena por tu trabajao y gracias por compartirlo.
He iniciado las pruebas para experimentar a partir de tú proyecto. Tengo un TC35 de SIEMENS sin pin IGT. Cuenta con un botón Start GSM ¿Debo comentar la linea de código donde se activa GSM mediante el pin 10?
No obstante realizaré pruebas y las comentaré posteriormente. Gracias mil.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 07-03-2016 18:56
Hola Ricardo,

Si no tiene el pin no será necesaria la línea, así que si, puede comentar sin más donde se haga referencia a ese pin.

Muchas gracias por visitar el blog, esperamos tus comentarios. Recuerda que si quieres hacer alguna mejora al código también puedes hacerlo a través de GitHub en github.com/.../...

Suerte con el proyecto!
Responder | Responder con una citación | Citar
0 # Julio Krauss 14-04-2016 05:20
hola cristobal una consulta, hay que configurar aparte el tc35? y lo otro en la parte del código en los números autorizados, esos son los que me aran funcionar el rele ? saludos
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 15-04-2016 07:07
Hola Julio,

No, no hay que hacer nada especial con el tc35. Simplemente hacer las conexiones tal y como se muestra en el esquema.

Con respecto a los números autorizados, efectivamente, esos son los que tienen permitido accionar el relé. Si la llamada proviene de un número que no está en la lista, el relé no se activará.

Gracias por visitar el blog,
Saludos!
Responder | Responder con una citación | Citar
0 # Julio Krauss 14-04-2016 20:28
otra consulta Cristobal, cual serial la cantidad máxima de usuarios autorizados ?
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 15-04-2016 07:09
Pues la verdad es que no lo he comprobado. No sabría decirte.
Responder | Responder con una citación | Citar
0 # juan 06-05-2016 04:40
BUENAS, QUERIA SABER, QUIEN ES EL NUMERO QUE ACTIVA EL RELE?, SERIAN LOS NUMEROS "AUTORIZADOS" O SERIA EL NUMERO DEL "ADMINISTRADOR" , ES DECIR, LOS NUMEROS AUTORIZADOS PUEDEN ACTIVAR DIRECTAMENTE EL RELE??, TAMBIEN QUERIA PREGUNTARTE CUAL ES EL "TEXTO" DEL SMS QUE HAY QUE ENVIAR PARA ACTIVAR EL RELE?, Y CUAL ES EL "TEXTO" DEL SMS QUE HAY QUE ENVIAR PARA DESACTIVAR EL RELE?. TAMBIEN QUERIA PREGUNTARTE SI EL RELE PUEDE SER DESACTIVADO MEDIANTE UN SENSOR, ES DECIR CUANDO EL SENSOR LLEGUE HASTA UN VALOR ENTONCES EL RELE SE DESACTIVARIA INDEPENDIENTEME NTE DE ENVIAR EL SMS PARA DESACTIVARLO?, ES DECIR QUIERO QUE LA DESACTIVACION DEL RELE SE HAGA CON EL SENSOR Y CON EL SMS (LA QUE OCURRA PRIMERO)??. EN REALIDAD LO QUE QUIERO HACER ES ENCENDER Y APAGAR UNA BOMBA DE AGUA QUE LLENA UN TANQUE, TODO ESTO LO QUIERO HACER MEDIANTE SMS, A SU VEZ, LE QUIERO PONER UN SENSOR AL TANQUE PARA QUE ME DETECTE SI EL TANQUE ESTA LLENO O NO, Y SI ESTA LLENO ENTONCES DETECTAR ESTO CON UN SENSOR Y DESACTIVAR EL RELE ES DECIR LA BOMBA DE AGUA, EN ESTE CASO EL USUARIO SE OLVIDÓ DE MANDAR EL SMS PARA DESACTIVAR EL RELE. Y A SU VEZ SI EL SENSOR NO DETECTÓ QUE EL TANQUE ESTA LLENO Y EL USURIO IGUALMENTE QUIERE APAGAR LA BOMBA, ENTONCES EL USUARIO ENVIARÍA UN SMS PARA DESACTIVAR EL RELE. ESPERO TU RESPUESTA, DESDE YA MUCHAS GRACIAS
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 09-05-2016 07:24
Hola Juan,

Los números autorizados son los números que pueden activar directamente el relé.

En el código actual el relé se activa mediante la llamada telefónica, aunque podrías modificarlo para activarlo mediante SMS y desactivarlo con un sensor como mencionas.

Puedes leer los SMS del módulo activando la alerta de SMS y el modo texto:

mySerial.print("AT+CMGF=1\r\n"); //Activar modo texto
delay(500);
mySerial.print("AT+CNMI=3,3,0,0\r\n"); //Activar alerta SMS
delay(500);

Con eso, cuando reciba un SMS el módulo lo enviará directamente a la salida por donde está escuchando Arduino. Recibirá algo como esto:

OK
+CTM: "+34600000000", "+34123456789", "14/01/18,16:43:00+01",5
Esto es un mensaje de texto

Lo único que te quedaría sería extraer de ahí la información que necesites y actuar en consecuencia.

Espero que te sea de ayuda,
Gracias por visitar el blog!
Responder | Responder con una citación | Citar
0 # julio krauss 09-05-2016 23:29
Cristobal la ultima pregunta, si uso otro modulo gsm tengo que cambiar el codigo? saludos
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 10-05-2016 07:53
Hola Julio,

La mayoría de módulos GSM funcionan mediante comandos AT y suelen ser casi idénticos. Por tanto, lo normal es que el código sea el mismo o prácticamente igual. Para ello, lo mejor es revisar la guía de comandos AT que acepta cada módulo y comprobar que todos los que usas están disponibles (o cambiar alguno si es necesario).

Saludos!
Responder | Responder con una citación | Citar
0 # arturo 29-07-2016 00:48
hola me ha servido mucho tu blog, como puedo utilizar los numeros autorizados guardados en la memoria SIM, e utilizado
ATD>SM3
pero no consigo hacer llamadas
Saludos!
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 30-08-2016 09:58
Hola Arturo,

El comando ATD>SM3 no está soportado en todos los módulos gsm. ¿Cuál es el que estás usando? Lo ideal es que compruebes el comando en la guía de comandos AT de tu dispositivo.

Gracias por visitar el blog y siento la tardanza en responder.

Saludos!
Responder | Responder con una citación | Citar
0 # Ivan 12-09-2016 04:05
Hola Amigo, me encanto tu proyecto, felicitaciones. Te quería consultar: Es posible crear una aplicación web que se conecte con el dispositivo ya que mi idea es ir registrando acá los números que quiero autorizar, asociarlos al nombre de la persona y así poder tener el registro de quien entra y sale, ademas de tener la opción de eliminar el numero cuando corresponda (usuario con acceso temporal).Para lo anterior necesitaría un plan de datos asociado a la sim?.
Lo segundo es saber cuanto es la cantidad de números para registrar que aguanta el dispositivo....
Desde ya muchas gracias por tu respuesta
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 18-09-2016 21:04
Hola Ivan,

Claro, con un módulo GSM/GPRS podría conectarte a Internet sin ningún problema siempre que tengas un plan de datos asociado a la SIM.

La cantidad de números depende del Arduino que utilices. En cualquier caso eso no debe ser un impedimento porque podrías usar un dispositivo de almacenamiento externo, como por ejemplo, una tarjeta SD.

Espero que tengas éxito con tu proyecto.
Gracias por visitar el blog.

Saludos!
Responder | Responder con una citación | Citar
0 # Martin 20-01-2017 14:37
Buenas tardes, enhorabuena por tu proyecto, es justo lo que estaba buscando, yo quiero adaptarlo para arrancar un motor de una cochera, yo entiendo algo de electricidad pero de electrónica no tengo ni idea, por lo que veo seria montar los 3 módulos y conectarlos a la centralita del motor (actualmente tengo un pulsador manual y un receptor para abrir con un mando, el que quedaría de adorno) mi duda esta en toda la programación todos esos códigos y "comandos" como se configura y donde.
Muchas gracias de antemano.
Responder | Responder con una citación | Citar
+1 # Cristóbal Medina 23-01-2017 17:49
Hola Martin,

El código se ejecuta en una placa arduino a la cual hay conectado un módulo GSM, en esta caso, el TC35. El relé también está conectado a las salidas de arduino. Este relé es que haría la función del pulsador para abrir la cochera.

Espero que te sea de ayuda.
Saludos!
Responder | Responder con una citación | Citar
0 # Martin Pérez Llamas 18-02-2017 23:55
Bueno, ya he recibido todos los componentes y he adquirido mi tarjeta sim, ya conecte todos los cables como se indica en el esquema. El modulo GSM me funciona bien, pero con el arduino y los relés no he sido capaz, me he descargado el programa de arduino para meter el codigo lo he metido, pero de la placa solo se encienden 2 luces y de los reles ninguna, no se que estoy haciendo mal. Adjunto en enlacesd e las plaas adquiridas, muchas gracias de antemano.
amazon.es/.../...
amazon.es/.../...
amazon.es/.../...
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 20-02-2017 08:21
Hola Martin,

Recuerda que el módulo de relés tienes que alimentarlo (GND y VCC) y usar IN1 e IN2 para accionar cada uno de los relés. Comprueba si se accionan a nivel alto o bajo, dependiendo de cómo se accione tendrías que cambiar LOW por HIGH (y viceversa) en la función fire().

Con respecto al arduino, sólo debe encenderse el LED de power.

Un Saludo!
Responder | Responder con una citación | Citar
0 # Martin Pérez Llamas 21-02-2017 11:44
Lo tengo todo conectado como en el esquema, del arduino se enciende la luz de power y una que pone L. Y la placa de los relés no da señales de vida
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 21-02-2017 17:27
Hola Martin,

Se me ocurre que pruebes por separado el relé. Para ello simplemente carga un script sencillo que active y desactive el relé conectado a un pin (por ejemplo el 8). Algo como esto:

int rele = 8 ;

void setup()
{
pinMode(rele, OUTPUT) ;
}
void loop()
{
digitalWrite(re le, HIGH);
delay(1000);
digitalWrite(re le, LOW);
delay(1000);
}

Espero los resultados de la prueba ;)
Saludos!
Responder | Responder con una citación | Citar
0 # Martin Pérez Llamas 22-02-2017 15:48
hola Cristobal he modificado el codigo y al compilarlo ya no me da error aunque modulo arduino no responde correctamenta, de dejo el codigo por si puedes echarme una mano en algun posible error.

//Hacemos uso de SoftwareSerial para usar dos pines cualquiera de arduino
#include


SoftwareSerial mySerial(5,6); //rx,tx
String inGSM; //Almacenar la informaci'on leida del modulo gsm
String numList[]={"631 111111","622222 222","643333333 "}; //N'umeros autorizados
boolean intrusos=false;
double ttl=0; //Tiempo de vida

void setup()
{
pinMode(9, OUTPUT); // rel'e
pinMode(2, INPUT); // pulsador
pinMode(11, OUTPUT); // altavoz
pinMode(10, OUTPUT); // igt modulo gsm tc35
mySerial.begin( 9600);
Serial.begin(96 00);
initGSM(); //iniciar el modulo gsm
}

void initGSM(){
digitalWrite(9, HIGH); //desactivamos el rel'e (activo a nivel bajo)
digitalWrite(10 ,LOW); //activamos el modulo gsm (activo a nivel bajo)
Serial.println( "Iniciando...") ;
mySerial.print( "AT+CPIN=1234\r \n"); //Enviar PIN (1234)
delay(10000);
mySerial.print( "AT+CLIP=1\r\n" ); //Activar alarma llamada
delay(500);
mySerial.print( "AT+CMGF=1\r\n" ); //Activar modo texto
delay(500);
}

//Funci'on: Comprueba si el n'umero est'a autorizado
//true si tiene permiso, false si no lo tiene.
boolean isAllow(String num){
for (int i=0;i0){
delay(10);
inGSM += (char)mySerial. read();
}

Serial.print(in GSM);

//Si llamada
if (inGSM.indexOf( "RING")>-1){
delay(1000);
mySerial.print( "AT+CHUP\r\n"); //Rechazar llamada

String num;
int inicio=inGSM.in dexOf('"')+1;
int fin=inicio+9;

num=inGSM.subst ring(inicio,fin ); //Extraer n'umero

//Si es el administrador, detener alarma.
if (num=="63222222 2"){
intrusos=false;
}

//Si autorizado, accionar rel'e
if (isAllow(num)){
fire();
}else{ // *** Opcional ***
// Si n'umero de control (98222222)
if (num=="98222222 "){
// Enviar SMS al administrador para consumir saldo.
sendSMS();
}
}
}

//En caso de perder la cobertura, volver a conectarse a la red
if (inGSM.indexOf( "CREG:")>-1 && inGSM.indexOf(" CREG: 0,1")==-1 && inGSM.indexOf(" CREG: 0,5")==-1){
Serial.println( "Se ha perdido la cobertura, reiniciando..." );
mySerial.print( "AT+CFUN=1,1\r\ n");
delay(4000);
initGSM();
}

//Comprobar estado de la red
if (ttl==150000){
mySerial.print( "AT+CREG?\r\n") ;
ttl=0;
}
}

*he modificado los numeros de telefono por numeros aleatorios incluido los de los comentarios

un saludo
Responder | Responder con una citación | Citar
+1 # Cristóbal Medina 23-02-2017 12:14
Hola,

En este enlace hay disponible una versión del código más actualizada: código activar rele llamada

Eliminé cosas como la alarma para hacerlo más simple. Prueba con este código y si te devuelve algún error no dudes en comentarlo.

Saludos!
Responder | Responder con una citación | Citar
0 # Martin Pérez Llamas 08-03-2017 10:55
Buenos dias cristóbal, lo intento con el codigo que me proporcionaste (github.com/.../ver2013.ino) pero me da este error. El arduino y los relés funcionan correctamente, ya los probe con el ejemplo básico blink.
Espero que me puedas ayudar.

Arduino:1.8.1 (Windows 10), Tarjeta:"Arduin o/Genuino Uno"

C:\Users\martin\AppData\Local\Temp\arduino_modified_sketch_81791\sketch_mar08a.ino:14:22: fatal error: TimerOne.h: No such file or directory

#include

^

compilation terminated.

exit status 1
Error compilación en tarjeta Arduino/Genuino Uno.
Responder | Responder con una citación | Citar
0 # Martin Pérez Llamas 08-03-2017 11:22
Problema solucionado, añadí esta libria github.com/.../TimerOne, compila bien pero sigue sin funcionar. No se que puede pasar.
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 09-03-2017 09:44
Hola,

Aunque ya lo hemos hablado, lo dejo por aquí:

Intenta depurar el código usando el Monitor Serial del IDE de Arduino. Como se está usando SoftwareSerial para la comunicación con el módulo GSM, podrás comunicarte con el monitor sin problemas. Esto te ayudará a depurar. Puedes imprimir en el monitor usando Serial.println("cadena")

Suerte!
Responder | Responder con una citación | Citar
0 # Luis 08-03-2017 17:32
Hola Cristobal, me parece excelente tu proyecto, te tengo algunas preguntas que espero puedas ayudarme,quiero montar el proyecto para abrir el porton de mi comunidad, el detalle es que necesito almacenar almennos 1500 números, deseo incluirlos a travez de un sms con una clave mas el número a incluir o eliminar, esto para evitar que agregen números que no esten autorizados. Como puedo hacer estasdos cosas, tener capasidad para 1500 números y poder agregarlos con a travez de sms.
Tengo una arduino uno y una SIM900
Gracias
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 09-03-2017 09:48
Hola Luis,

Como comenté un poco más arriba, se pueden activar en el módulo la alerta de SMS y el modo texto:

mySerial.print("AT+CMGF=1\r\n"); //Activar modo texto
delay(500);
mySerial.print("AT+CNMI=3,3,0,0\r\n"); //Activar alerta SMS
delay(500);

Con eso, cuando reciba un SMS el módulo lo enviará directamente a la salida por donde está escuchando Arduino. Recibirá algo como esto:

OK
+CTM: "+34600000000", "+34123456789", "14/01/18,16:43:00+01",5
Esto es un mensaje de texto

Lo único que te quedaría sería extraer de ahí la información que necesites.

Con respecto a almacenar una gran cantidad de números, y para no perder la información podría almacenarlo en una memoria externa. Una opción podría ser usando una shield de tarjetas SD.

Gracias por visitar el blog!
Responder | Responder con una citación | Citar
0 # andy 13-04-2017 02:16
hola tengo el modulo gsm sim800l se comunica bien con el arduino po el puerto serial pero n ose conecta a la red e intentado con distintas operadores tigo,claro estoy en colombia y n ose conecta a la red solo uno vez aparecio por unos segundos registrado y se desconecto lo otro es que se calienta mucho no se si eso sea normal muchas gracias
Responder | Responder con una citación | Citar
0 # Benjamín 14-04-2017 01:09
Una consulta conecte mi SIM800 con mi Arduino pero aun no entiendo como recibo los códigos de AT como son AT + CPIN? entre otros es necesaria una programación previa
Responder | Responder con una citación | Citar
0 # Karla Tovar 14-11-2017 01:05
Hola, una consulta, tengo un TC35 revision 4 pero nunca se conecta a una red, puede ser por la compañía del SIM que estoy usando? o la antena esta dañada? me urge! si alguien pudiera ayudarme por favor
El resultado de AT+CREG? es 1,2
Responder | Responder con una citación | Citar
0 # Angel Duran 08-12-2017 16:14
Estimado Cristobal

Yo hice uso de tu post y logre lo que buscaba que era activar un relay mediante una llamada, te comento que me funciona a la perfeccion, gracias por tu aporte especialmente a los que no sabemos de programacion, ahora tengo un nuevo proyecto espero sea posible y me puedas ayudar, la idea es poder activar dos relay de la misma forma pero la diferencia es que necesito que un numero por ejemplo 099444444 active el relay uno y el numero 09955555 active el relay dos obviamente los numeros ingresados solo son de ejemplo, si esto es posible desde ya agradezco tu ayuda

saludos y exitos en tus proyectos
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 10-12-2017 20:01
Hola Angel,
Claro que es posible. Sólo tendrías que duplicar el método fire cambiando el pin al correspondiente para el rele2 (o pasar el pin como parámetro a la función). Después, en el if donde se comprueba si está permitido tendrías que diferenciar entre los dos números que te interesan y llamar al método fire correspondiente.
Gracias por visitar el blog!
Responder | Responder con una citación | Citar
0 # Angel Duran 11-12-2017 00:11
Gracias por tu ayuda voy a probar a ver si tengo exito

Saludos
Responder | Responder con una citación | Citar
0 # Miguel 22-12-2017 00:29
Hola te queria preguntar como conecto mi arduino ino a una targeta sim 900 y si es compatible con el codigo que tienes en el fora gracias espero tu respuesta o alguin que me ayude
Responder | Responder con una citación | Citar
0 # Andrés 07-09-2018 14:16
Hola, este código funcionaria para el SIM900?
Responder | Responder con una citación | Citar
0 # Cristóbal Medina 10-09-2018 07:33
Hola,
Como ya respondí en algunos comentarios anteriores, los comandos AT para el módulo SIM900 y el TC35 son muy similares. Sólo tenéis que comprobar que los que actualmente aparecen en el código son compatibles con vuestro módulo aquí: goo.gl/QjyOYu

Gracias por visitar el blog,
Un saludo.
Responder | Responder con una citación | Citar

Escribir un comentario


Código de seguridad
Refescar

Suscripción RSS

feed-image Blog