Buenos días,
Escribo al foro para buscar asesoría al respecto, realice un programa sencillo para apagar y prender un led por medio de un SMS usando la SIM900.
El sistema opera pero al pasar ciertas horas de estar conectado, deja de recibir los mensajes para apagar o encender el led.
Yo le timbro a la SIM900 y en el puerto serio observo RING, quiere decir que hay señal.
En realidad no entiendo porque no recibe los mensajes después de cierto tiempo de uso, me toca reiniciarlo desconectando la fuente de alimentación y que arranque de nuevo.
adjunto el programa
tal vez los mensajes quedan en cola..... saludos
************************************************************+
#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); // Configura el puerto serie para el SIM900
char incoming_char = 0; //Variable que guarda los caracteres que envia el SIM900
String mensaje = "";
int LED = 12 ;
int listo=11;
void setup()
{
pinMode( LED, OUTPUT) ; // LED como salida
pinMode(listo,OUTPUT);
inicializaSIM900();
}
void loop()
{
if (SIM900.available() > 0)
{
incoming_char = SIM900.read(); //Guardamos el carácter del GPRS
Serial.print(incoming_char); //Mostramos el carácter en el monitor serie
mensaje = mensaje + incoming_char ; // Añadimos el carácter leído al mensaje
}
identifica_SMS();
}
void inicializaSIM900()
{
digitalWrite(9, LOW); // Descomentar para activar la alimentación de la tarjeta por Software
delay(1000);
digitalWrite(9, HIGH);
delay (6000);
SIM900.begin(19200); //Configura velocidad del puerto serie para el SIM900
Serial.begin(19200); //Configura velocidad del puerto serie del Arduino
Serial.println("OK");
delay (10000);
//SIM900.println("AT + CPIN = \"0000\""); //Comando AT para introducir el PIN de la tarjeta
//delay(25000); //Tiempo para que encuentre una RED
//Serial.println("PIN OK");
SIM900.print("AT+CMGF=1\r"); //Configura el modo texto para enviar o recibir mensajes
delay(1000);
digitalWrite(listo, HIGH);
delay(100);
}
void identifica_SMS()
{
int led_on = mensaje.indexOf("Encender");
int led_off = mensaje.indexOf("Apagar");
if (led_on >= 0)
{
digitalWrite( LED, HIGH) ;
Serial.println("\nLED ENCENDIDO");
mensaje = "" ; //Bórralo para la próxima vez
delay(200);
mensaje_sms();
}
if (led_off >= 0)
{
digitalWrite( LED, LOW) ;
Serial.println("\nLED APAGADO");
mensaje = "" ; //Bórralo para la próxima vez
delay(200);
mensaje_sms1();
}
}
void mensaje_sms()
{
SIM900.print("AT+CMGF=1\r"); // AT command to send SMS message
delay(100);
SIM900.println("AT+CMGS=\"573183852090\""); // recipient's mobile number, in international format
delay(100);
SIM900.println("foco encendido"); // message to send
delay(100);
SIM900.println((char)26); // End AT command with a ^Z, ASCII code 26 //Comando de finalizacion
delay(100);
SIM900.println();
delay(5000); // Tiempo para que se envie el mensaje
Serial.println("SMS sent successfully");
}
void mensaje_sms1()
{
SIM900.print("AT+CMGF=1\r"); // AT command to send SMS message
delay(100);
SIM900.println("AT+CMGS=\"573183852090\""); // recipient's mobile number, in international format
delay(100);
SIM900.println("foco apagado"); // message to send
delay(100);
SIM900.println((char)26); // End AT command with a ^Z, ASCII code 26 //Comando de finalizacion
delay(100);
SIM900.println();
delay(5000); // Tiempo para que se envie el mensaje
Serial.println("SMS sent successfully");
}
*************************************************************************+
PRUEBA___SOLO_RECIBIR_Y_ENVIAR_SMS.ino (2.8 KB)
Good Morning,
Write a forum to seek advice on this, make a simple program to turn off and turn on a phone by SMS using the SIM900.
The system operates but after spending certain hours of being connected, it stops receiving the messages to turn the LED off or on.
I call the SIM900 and in the port I seriously note RING, it means there is a signal.
Actually I do not understand why I do not have the messages after a certain time of use, I have to restart it by disconnecting the power supply and start it again.
I attach the program
Maybe the messages are queued ..... Greetings
Hola Humberto te invito a que leas las normas del foro y edites tu post
Te dejo como hacerlo.
Tu consulta fue movida del foro en inglés a este foro porque no puedes escribir en español en el foro en inglés.
La otra consulta es un duplicado de esta, y por eso fue borrada también.
Lee las Normas del foro
Luego ve a More (abajo a la derecha), click, luego Modify y estas en modo EDICION.
Si tienes que editar un código -> Selecciona todo el código y click en </> arriba del emoticon.
**Si tienes que editar un enlace -> Selecciona el enlace. Copialo al portapapeles. Click en el eslabón (ver abajo) y sigue los pasos que habras visto al leer las normas. **
Las imagenes deben verse, si usas un adjunto con botón derecho del mouse capturas el enlace de la imagen y luego cuando editas lo pegas con la etiqueta de imagen
Las 4 reglas básicas que debes respetar y cumplir
- Enlaces con etiquetas
- imagenes con etiquetas
- códigos con etiquetas
- No respondas mensajes con 120 sin movimientos que además te dicen Warning en letras rojas.
Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.
- No escribir con mayúsculas ni título ni el cuerpo del mensaje.
- No doble postees. Si inicias un tema no puedes empezar otro similar en la misma sección, en otra sección o en otro idioma.
Ya te había indicado que esos errores son síntomas de mal uso de las variables Strings, las cuales no debes estar inicializando a cero para que dejen de crecer.
Debes chequear la memoria disponible, busca Arduino FreeRam o Memory Available y hay una pequeña rutina que agregas y te va diciendo por Monitor Serie cuanta memoria tienes, seguramente en algun momento te quedas sin memoria.
Por lo que veo en tu código (mal posteado, usa etiquetas </>) es que solo tienes una variable String mensaje y tmb observo que la pones a cero con mensaje = "";
Revisa si las condiciones se estan cumpliendo y si no cabe la posiblidad de que algo haga que mensaje crezca de tamaÑo hasta consumirse toda la SRAM.
se puede realizar algo para que no guarde en la memoria los mensajes que se envían, para así no tener problemas?
También puede ser que no tenga bastante corriente, yo casi me vuelvo loco con eso y era culpa del transformador 9v
Tengo un problema con la sim900 el programa empieza a trabajar bien apaga y enciende el LED por medio de SMS; pero al transcurrir el tiempo le envió el sms a la sim900 pero no ejecuta la acción.
En ese momento yo le timbro a la sim900 y en el puerto serial si registra los RING.
Consulte en el FORO de arduino y alguien me opino esto " Ya te había indicado que esos errores son síntomas de mal uso de las variables Strings, las cuales no debes estar inicializando a cero para que dejen de crecer. ".
La verdad no se que hacer, ojala poder contar con tu ayuda.
#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); // Configura el puerto serie para el SIM900
char incoming_char = 0; //Variable que guarda los caracteres que envia el SIM900
String mensaje = "";
int LED = 12 ;
int listo=11;
void setup()
{
pinMode( LED, OUTPUT) ; // LED como salida
pinMode(listo,OUTPUT);
inicializaSIM900();
}
void loop()
{
if (SIM900.available() > 0)
{
incoming_char = SIM900.read(); //Guardamos el carácter del GPRS
Serial.print(incoming_char); //Mostramos el carácter en el monitor serie
mensaje = mensaje + incoming_char ; // Añadimos el carácter leído al mensaje
}
identifica_SMS();
}
void inicializaSIM900()
{
digitalWrite(9, HIGH); // Descomentar para activar la alimentación de la tarjeta por Software
delay(1000);
digitalWrite(9, LOW);
SIM900.begin(19200); //Configura velocidad del puerto serie para el SIM900
Serial.begin(19200); //Configura velocidad del puerto serie del Arduino
Serial.println("OK");
delay(30000); //Tiempo para que encuentre una RED
SIM900.print("AT+CMGF=1\r"); //Configura el modo texto para enviar o recibir mensajes
delay(1000);
SIM900.print("AT+CNMI=2,2,0,0,0\r"); // Saca el contenido del SMS por el puerto serie del GPRS
delay(1000);
digitalWrite(listo, HIGH);
delay(200);
SIM900.print("AT+CMGDA=\"");
SIM900.println("DEL ALL\"");
}
void identifica_SMS()
{
int led_on = mensaje.indexOf("on");
int led_off = mensaje.indexOf("off");
if (led_on >= 0)
{
digitalWrite( LED, HIGH);
Serial.println("\nLED ENCENDIDO");
mensaje = "" ; //Bórralo para la próxima vez
delay(200);
mensaje_sms();
}
if (led_off >= 0)
{
digitalWrite( LED, LOW) ;
Serial.println("\nLED APAGADO");
mensaje = "" ; //Bórralo para la próxima vez
delay(200);
mensaje_sms();
}
}
void mensaje_sms()
{
SIM900.print("AT+CMGF=1\r"); // AT command to send SMS message
delay(100);
SIM900.println("AT+CMGS=\"5xxxxxxxxxx\""); // recipient's mobile number, in international format
delay(100);
SIM900.println("OK_EJECUTADO"); // message to send
delay(100);
SIM900.println((char)26); // End AT command with a ^Z, ASCII code 26 //Comando de finalizacion
delay(100);
SIM900.println();
delay(100); // Tiempo para que se envie el mensaje
//Serial.println("SMS sent successfully");
}
Ya tienes un hilo abierto en el foro en inglés.
CUando lo cierres, entonces puedes abrir este con el mismo tema, antes no, porque se considera un posteo cruzado o cross-post.
Moderador: Editado. El autor solicitó que se cerrara el hilo en inglés y reabriera este.
Bueno como te puse en el hilo en inglés, usa esta librería GSM SIM900/908 Library
Es muy buena, jamás me ha fallado con estos módulos.
si, tu me dices que use esas librerías pero debo cambiar algo en el programa?
la sim900 la tengo alimentada con una fuente de 18 vdc de 2.1 A
Bien, un poco alta la tensión pero el regulador del SHIELD SIM900 lo tolera.
Bueno, concentrémosnos en un solo hilo Humberto_Jimenez. porque no solo eran dos sino 3 los que tenias abiertos.
Cierro el otro y seguimos aca.
OK, mire las librerías que me recomendaste, pero debo modificar algo en el programa.
Claro, no son lo mismo, pero comienza con el demo SMS, luego ajustalo a tu telefono y de a poco verás que es sumamente fácil.