Encender LED con Arduino NANO y GSM SIM800L

Buen dia, soy nuevo en el foro, me presento, Raymundo Vega de Hermosillo, Sonora, Mexico.

Tengo bastante tiempo buscando información y programas para realizar un proyectito de una Alarma con GSM, tengo adelantado bastante pero me atore un buen en el apartado del GSM y los mensajes.

Después de mucho probar y probar y probar infinidad de programas, ninguno me resulto (busque en ingles y español en infinidad de foros) y me di a la tarea de escribirlo con partes de diferentes programas y probar hasta lograr el resultado deseado, asi que si alguien esta utilizando el mismo modulo o parecido y quiere realizar un proyecto similar les presento mi código.

Para empezar, hay que revisar puntos cruciales para hacer funcionar esto.

Fuente de energía del modulo: Yo lo tengo conectado para pruebas con un simple diodo de uso común, para que baje el voltaje aprox. a 4.3 volts, tomando 5v de una fuente de computadora. Si no tomamos la energía de una fuente de min. 2 amperes, el modulo solo contestara bien a los comandos de configuración, pero al momento de querer mandar un mensaje, leerlo o realizar una llamada, simplemente no lo hara. Incluso pudiera ser que ni siquiera se conecte a la red.

Puerto serial: Hay que conectar el modulo a un puerto Serial por software, y solo a pines que puedan ser utilizados para este fin, yo lo tengo con SoftwareSerial a un Arduino NANO a los pines 10 y 11.

Pines del modulo: VCC conectado a 4-4.3 voltios 2 amp., GND de la fuente utilizada debe ser conectado junto al GND del Arduino (hay personas que se les olvida este punto), TX al RX del Arduino, RX al TX del Arduino. Listo ! No hay que conectar nada al RST.

Después de tener listo el hardware hay que tomar en cuenta algunos puntos del código, los comandos AT. Para que funcione siempre hay que mandar Retorno de carro y Nueva linea, con las letras \r\n.

Para empezar lo primero que hay que mandar al modulo es la palabra AT, cuando hacemos esto el modulo activa la función Auto Baud Rate y la ajusta automáticamente al que estemos utilizando, recomiendo 9600.
Después hay que decirle al modulo que escribiremos en modo de texto simple con la funcion AT+CMGF=1.
Después hay que definir las opciones de aviso de mensajes entrantes con la funcion AT+CNMI=1,2,0,0,0. En bastantes foros vi otras opciones pero esta es la que me funciono, ya que al llegar el mensaje este sale directamente por el TX del modulo sin ni siquiera solicitarlo, solo hay que agarrarlo en una variable.

Vi en varias partes que con la funcion AT+CMGR=1 pediamos los mensajes, pues no sirve, ya que los mensajes al tener notificaciones estos salen directamente por el TX y el modulo no los guarda en ningun lado. Para guardarlos hay que apagar las notificaciones con el comando AT+CNMI=0,0,0,0,0 perooo hay que usar el comando AT+CMGL para recuperarlos pero no me funciono. Asi que no hay que utilizarlo.

Tambien vi que usan las variables char para comparar los datos del mensaje. NO funciona. Hay que utilizar la funcion readString para poder guardar el texto completo y despues analizarlo con la funcion indexOf para encontrar la palabra deseada.

Otra cosa muy importante, al guardar el texto en la variable String, solo hay que hacer eso dentro del if, nada mas, por que si agregas otro comando dentro, pienso son problemas de velocidad, el texto se pierde y solo aparecen simbolos y caracteres sin sentido. En este paso solo hay que preguntar si hay datos en el SoftwareSerial y si los hay guardarlos en la variable String. Ya con la variable podemos hacer las comparaciones y demas pero FUERA del if.

Sin mas les dejo el codigo que me funciono.
NOTA estoy trabajando para que solo funcione el activado con ciertos numeros de celular que yo agregare, por el momento funciona con cualquiera y no se por que, pero si agregas alguna clave despues del On o utilizas una palabra "secreta" solo funcionara si mandas la palabra "secreta".

Cuando tenga terminado el proyecto subire tambien el codigo, funciona con un sensor pir DSC modificado con un transmisor de RF de 433 MHZ. En este codigo ya implemente el envio de mensajes y llamadas del modulo GSM.

probador.ino (443 Bytes)

Pues con la novedad que ya hice funcionar el código completo, pero me surgió un grandisimo problema.

Por no tener cuidado y tener todo en el aire haciendo pruebas, pues que se sueltan los 5 Volts y le entran directo al modulo! Adiós modulo y a esperar el repuesto :frowning:

Antes de terminarlo estuve batallando con un conflicto que se genera a usar las librerías SoftwareSerial y VirtualWire juntas, ahí por si quieren utilizarlas juntas en algún sketch tomen en cuenta que la librería VirtualWire utiliza los puertos 10, 11 y 12 por default, los cuales son los mas comúnmente utilizados para Rx y Tx al usar SoftwareSerial. Un simple cambio de pines y woala.

Posterior a chamuscar el modulo el código funciono perfectamente, envías el mensaje "On 12345" y "Off 12345" para encender y apagar la alarma. Si esta activada enciende el led 13, y pasa a un subprograma llamado alarma el cual revisa si el sensor PIR envía el dato de activo o batería baja. Si el sensor se activa la alarma llama al numero previsto y envía un mensaje de texto. Si la batería del sensor PIR se baja, también envía un mensaje avisando.

Les dejo el código por si alguien quiere utilizarlo, me falta subir el codigo del transmisor que va en el sensor PIR, tambien faltaría implementar una salida para una sirena con diferente numero de tonos para diferenciar el activado, desactivado y la alarma en si.

Les debo las fotos, las subiré en cuanto las tenga en el pc, también estoy trabajando en la fuente ininterrumpida para este sistema, basada en una pila de ácido de 12V.

PD. Si lo quieren utilizar no olviden bajarse las librerias SoftwareSerial y VirtualWire!!

RECEPTORALARMA.ino (2.16 KB)

Código para el transmisor.

La batería que uso para el sensor es un PowerBank de esos para cargar celulares! Después de algún tiempo quebrando me la cabeza pensando como alimentarlo se me ocurrió esta idea y funciono perfectamente, con los leds indicadores dura aprox. 1 semana y media y después a cargar. Después de las pruebas los quitare haber cuanto dura, y posiblemente después, implementar algún tipo de standby para que dure mas la batería.

Por lo cual al ser una fuente Boost la pila es de 3.7 volts y pueden ser leídos directamente por un pin analógico del Arduino.

transmisorbien.ino (701 Bytes)

Hola ray9043, Gracias por tomarte el tiempo de publicar tus incidencias, muy importante a la hora de tener un historial de tus resultados.

Estoy por adquirir este modulo para unos experimentos, aca en Venezuela es bastante costoso, asi que hay que aplicarle todas las precauciones necesarias para protejerlo :smiling_imp:

Para la alimentacion, te recomiendo construyas una fuente de poder basada en el LM317 y la ajustes para la tension exacta que requiere el modulo, la solucion del diodo en serie, este...digamos que no es la mejor para este caso.

Suerte!

Habras buscado y buscado pero no encontraste lo debido!!
Esta librería SIM900/908 Arduino Library resuelve tu alarma de manera fácil.

Con un LM317 dudo que puedas entregar la corriente necesaria para tu Shield (Requiere una fuente de 2A
)a menos que uses un transitor de paso de corriente. Igualmente no uso nada que no sea Switching por una cuestion de disipadores y eficiencia.

SoftwareSerial esta integrada al IDE desde hace tiempo, no hay que bajarla y hacerlo solo genera problemas.

surbyte:
[...snip...]
Con un LM317 dudo que puedas entregar la corriente necesaria para tu Shield (Requiere una fuente de 2A) a menos que uses un transitor de paso de corriente. Igualmente no uso nada que no sea Switching por una cuestion de disipadores y eficiencia.[...snip...]

No conocemos el nivel de conocimiento o destrezas que tenga el OP en electronica, obviamente el regulador conmutado es mucho mas eficiente, la contraprestacion es que puede ser dificultoso de implementar si no sabes lo que estas haciendo :confused:

En principio siempre recomiendo a mis estudiantes el uso del LM317, porque:

Es ubicuo,
Es barato,
Es facil de implementar (solo dos resistencias en el peor caso!).
Ofrece muy buena regulacion de la carga (cerca del 1% en las versiones mas modernas).

Aunque, como tu precisamente lo señalas, desperdicia potencia por su naturaleza de diseño.

En cuanto a la corriente que es capaz de entregar, 1,5 Amps puede que no sea suficiente para esta aplicacion en particular....Quizas trabaje un poco en eso si me decido a adquirir el modulo.

Por cierto, existe una version de mayor potencia del LM317, el LM350, disponible en encapsulado plastico TO-220 y metalico TO-3.

Hola, aca hay una pagina con una biblioteca y ejemplos Sim800l library