Estimados, tengo el siguiente problema,
Tengo conectado un arduino a un shield sim900: sim 900
Compilo el Sketch y subo el mismo al arduino, logro comunicarme correctamente enviando y recibiendo sms. El arduino esta conectado al usb y con una fuente externa. El sim 900 no.
Desconcecto el usb y todo funciona correctamente. Envio y recibo mensajes. Ahora bien, desconecto la fuente del arduino y todo se apaga, vuelvo a conectar la fuente menos el usb, prendo el sim 900 hasta que parpadee 2 segundos, y todo parace ok.
El problema está en que el sim 900 deja de recibir mensajes. y la unica solución es volver a cargar el sketch.
Alguna sugerencia?? desde ya muchas gracias,
Saludos
Juan
Primero el sim900 no tiene memoria asi que eso de que vuelves a cargar el sketch es lo mismo que resetearas el Arduino. De ninguna manera volver a subir el sketch sacará al sistema del estado o loop en el que se encuentra.
Lo que sorprende es que no hayas publicado el código porque tu problema aparente estar ahi. Algo en tu código pone al sistema en un loop del que no puede salir y por eso al reiniciarlo eso desaparece.
Estimado, con respecto al loop y por que mientras la corriente está ok no entra en loop??? de todas formas paste mi codigo para dar una idea mejor. el mismo está recortado,
void setup()
{
pinMode(ledPIN5 , OUTPUT);
pinMode(ledPIN4 , OUTPUT);
digitalWrite(ledPIN5 , HIGH);
digitalWrite(ledPIN4 , HIGH);
// digitalWrite(7,HIGH);
delay(1000);
Serial.begin(9600); // for serial monitor
mySerial.begin(19200); // for GSM shield
mySerial.print("AT+CMGF=1\r"); // set SMS mode to text
delay(100);
mySerial.print("AT+CNMI=2,2,0,0,0\r");
// blurt out contents of new SMS upon receipt to the GSM shield's serial out
delay(100);
pinMode(13, OUTPUT);
pinMode(myRelee, OUTPUT);
pinMode(myRelee2, OUTPUT);
digitalWrite(myRelee, HIGH);
digitalWrite(myRelee2, HIGH);
tiempoEnviado = 0;
tiempoActual = 0;
finRiego = 1;
finRiego2=1;
valor_humedad=0;
foto = 0;
foto2=0;
blinkRele1=0;
blinkRele2=0;
buffer = "";
automatico=0;
notificaciones = 0;
}
void loop()
{
//digitalWrite(ledPIN4 , HIGH);
//digitalWrite(ledPIN5 , HIGH);
// guardo valor de luz : valor de referencia menor de 300 + 2 horas
if (blinkRele1==1)
{
digitalWrite(ledPIN4, HIGH);
delay(1000);
digitalWrite(ledPIN4, LOW);
delay(1000);
}else
{
digitalWrite(ledPIN4, HIGH);
}
if (blinkRele2==1)
{
digitalWrite(ledPIN5, HIGH);
delay(500);
digitalWrite(ledPIN5, LOW);
delay(500);
}else
{
digitalWrite(ledPIN5, HIGH);
}
valorLDR= analogRead(pinLDR);
//Serial.println(valorLDR);
delay(5000);
char SerialInByte;
// Now we simply display any text that the GSM shield sends out on the serial monitor
if(mySerial.available() >0)
{
//-------------------------------------------
buffer = "";
readSIM900A();
//-------------------------------------------
//Habilita las notificaciones por SMS
int elementoNotiOn = buffer.indexOf("NOTI-ON"); //para encender notificaciones
if (elementoNotiOn>=0)
{
//
notificaciones = 1; //habilita notificaciones
mensaje_sms("NOTI-ON");
}
int elementoNotiOf = buffer.indexOf("NOTI-OFF"); //para encender notificaciones
if (elementoNotiOf>=0)
{
notificaciones = 0; //deshabilita notificaciones
}
String readSIM900A()
{
while (mySerial.available())
{
char c = mySerial.read();
buffer.concat(c);
delay(10);
}
return buffer;
//elimina los sms
mySerial.print("AT+CMGDA=\"");
mySerial.println("DEL ALL\"");
}
Tu codigo esta incompleto, hay variables que no veo donde las defines.
No entiendo porque lo posteaste separado en 3 partes.
Podemos leer un código completo sin problemas. Digo esto porque no entiendo porque lo separaste en 3 y no explicas nada.
A ver, no malentiendas nada. Mi único reproche es que no estan las variables ni librerías que usas.
Yo cuando analizo un código no quiero capturar 3 y unirlo yluego darme cuenta que no compila.
No necesito hacerlo para saber que eso ocurrirá.
EDITO: En tu rutina
String readSIM900A() {
while (mySerial.available()) {
char c = mySerial.read();
buffer.concat(c);
delay(10);
}
return buffer;
//elimina los sms
mySerial.print("AT+CMGDA=\"");
mySerial.println("DEL ALL\"");
}
Las ultimas dos instrucciones no se ejecutan porque ya le diste return buffer.
Estimado, dejo mi codigo. Lo que si velo también luego de hacer varias pruebas y aislando todo el codigo innicesario, es que el sim900 no termina de inicializar muchas veces, no me devuelve el monitor el siguiente out:
AT+CMGF=1
OK
AT+CNMI=2,2,0,0,0
OK
que cuando estos mensajes lo tengo si me funciona todo ok, sucede a partir de quitar la alientación al arduino y volver a encender todo.
a continuación les paso el código utilizado,
#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8);
//led control
const int ledPIN5 = 5; //rele1
const int ledPIN4 = 4; //rele2
int blinkRele1 = 0;
int blinkRele2 = 0;
//------------ gsm
char incoming_char=0;
String smsRecibo;
int largo;
String mensaje;
String buffer;
String mensajeRecibido;
int automatico;
int apagado;
int apagado2;
int enciendeAutomatico;
int notificaciones;
//captura de nro recibido
String nroDetectado;
//-------------
//------------- rele
int myRelee = 2; //rele1
int myRelee2 = 3; //rele2
int rele2;
//------------
//------------Humedad
const int sensorPin = A0;
const int sensorPin1 = A1;
int valor_limite = 500;
String enciendoHumedad;
int valor_humedad; //guarda el porcentaje enviado de humedad
int porcentaje_humedad;
float promedio;
int foto = 0;
int foto2=0;
//-------------
//--------------tiempo
unsigned long tiempoActual=0;
unsigned long tiempoEnviado=0;
unsigned long tiempoInicio=0;
unsigned long tiempoDiferencia=0;
int finRiego;
unsigned long tiempoInicio2=0;
int finRiego2 = 0;
unsigned long rele2TiempoActual=0;
unsigned long rele2HoraMensaje = 0;
long previousMillis = 0;
long interval;
long interval2;
//---------fotoresistencia---
// Pin analogico de entrada para el LDR
int pinLDR = 5;
// Variable donde se almacena el valor del LDR
int valorLDR = 0;
//----------------------
void setup()
{
Serial.begin(9600); // for serial monitor
mySerial.begin(19200); // for GSM shield
mySerial.print("AT+CMGF=1\r"); // set SMS mode to text
delay(100);
mySerial.print("AT+CNMI=2,2,0,0,0\r");
pinMode(ledPIN5 , OUTPUT);
pinMode(ledPIN4 , OUTPUT);
digitalWrite(ledPIN5 , HIGH);
digitalWrite(ledPIN4 , HIGH);
// digitalWrite(7,HIGH);
// delay(1000);
// blurt out contents of new SMS upon receipt to the GSM shield's serial out
delay(100);
pinMode(13, OUTPUT);
pinMode(myRelee, OUTPUT);
pinMode(myRelee2, OUTPUT);
digitalWrite(myRelee, HIGH);
digitalWrite(myRelee2, HIGH);
tiempoEnviado = 0;
tiempoActual = 0;
finRiego = 1;
finRiego2=1;
valor_humedad=0;
foto = 0;
foto2=0;
blinkRele1=0;
blinkRele2=0;
buffer = "";
automatico=0;
notificaciones = 0;
}
void loop()
{
//digitalWrite(ledPIN4 , HIGH);
//digitalWrite(ledPIN5 , HIGH);
// guardo valor de luz : valor de referencia menor de 300 + 2 horas
if (blinkRele1==1)
{
digitalWrite(ledPIN4, HIGH);
delay(1000);
digitalWrite(ledPIN4, LOW);
delay(1000);
}else
{
digitalWrite(ledPIN4, HIGH);
}
if (blinkRele2==1)
{
digitalWrite(ledPIN5, HIGH);
delay(500);
digitalWrite(ledPIN5, LOW);
delay(500);
}else
{
digitalWrite(ledPIN5, HIGH);
}
valorLDR= analogRead(pinLDR);
//Serial.println(valorLDR);
delay(5000);
char SerialInByte;
// Now we simply display any text that the GSM shield sends out on the serial monitor
Serial.println("antes del if"+mySerial);
//-inicializo
//-----------
if(mySerial.available() >0)
{
Serial.println("adentro");
//-------------------------------------------
buffer = "";
readSIM900A();
Serial.println("hola"+buffer);
//-------------------------------------------
//Habilita las notificaciones por SMS
int elenotion = buffer.indexOf("NOTI-ON"); //para encender notificaciones
Serial.println("int"+elenotion);
if (elenotion>=0)
{
//
Serial.println("adentro noti antes de mensaje");
notificaciones = 1; //habilita notificaciones
mensaje_sms("NOTI-ON");
}
int elementoNotiOf = buffer.indexOf("NOTI-OFF"); //para encender notificaciones
if (elementoNotiOf>=0)
{
notificaciones = 0; //deshabilita notificaciones
}
} // fin serial read sms
}
//-------------Fin--------------------------------------------
}
//lee los characteres del mensaje y los mete en un buffer
String readSIM900A()
{
Serial.println("lyebdo antes");
buffer = "";
while (mySerial.available())
{
Serial.println("lyebdo");
char c = mySerial.read();
buffer.concat(c);
delay(10);
}
return buffer;
//elimina los sms
mySerial.print("AT+CMGDA=\"");
mySerial.println("DEL ALL\"");
}
void mensaje_sms(String mensaje)
{
//capturaNroEnviado();
//String nroEnvio ='"AT+CMGS=\"'+ nroDetectado+'\""';
if (notificaciones == 1)
{
Serial.println("Enviando SMS...");
mySerial.print("AT+CMGF=1\r"); //Configura el modo texto para enviar o recibir mensajes
delay(1000);
//mySerial.println(nroEnvio); //Numero al que vamos a enviar el mensaje
mySerial.println("AT+CMGS=\"+59898616054\""); //Numero al que vamos a enviar el mensaje
delay(1000);
mySerial.println("FUNCION Recibida. DOMUM-1: "+mensaje); // Texto del SMS
delay(100);
mySerial.println((char)26); //Comando de finalización ^Z
delay(100);
mySerial.println();
delay(5000); // Esperamos un tiempo para que envíe el SMS
// Serial.println("SMS enviado");
}
}
void capturaNroEnviado()
{
//Serial.println("captura nro enviado"+mensajeRecibido+"-");
int elementoComilla = mensajeRecibido.indexOf('5');
// Serial.println("elementoComilla "+elementoComilla);
int elementoSegundaComilla = mensajeRecibido.indexOf('"',elementoComilla);
//Serial.println("elementoSegundaComilla "+elementoSegundaComilla);
nroDetectado = mensajeRecibido.substring(elementoComilla,21);
Serial.println(nroDetectado);
delay(100);
}
Hay una secuencia para iniciarlo que no veo.
Tienes que activar un pin que establece el proceso de incialización en PWRKEY. Ver [link](http://SIM800 PWRKEY - Automatic start)
PWRKEY debe permanecer 1 seg en LOW para que el SIM900 arranque. Lo haces manual o lo haces automático
Si no estas haciendo esto, entonces lo que pasa es que cuando alimentas, o subes el código de algún modo esta pasando. No tengo claro como ocurre en tu caso pero mira esta guía y a ver si te ayuda a entenderlo. GSM SIM900 ARDUINO DAILY SMS MESSAGE
Estimado, gracia por tu respuesta. Te comento que el power key lo estoy haciendo manual, lo dejo presionado un segundo y listo. El proceso para arrancar es el siguiente:
Conecto el arduino por usb
Conecto el alimentador al arduino
Presiono el power key
Compilo y subo el código
El sistema funciona perfecto.
Desenchufo usb y alimentación, vuelvo a enchufar alimentación.
El sistema deja de recibir mensajes.
Conecto usb y subo nuevamente el sketch, aquí sucede en algunos casos que tengo que apagar el sim900, encenderlo y luego presionar el power key. Y recién ahi funciona todo.
Todo para por el POWEY, lee mas al respecto y verás que lo estas subestimando.
Un pin de tu arduino debería comandar el control de POWERKEY para que en el setup le des ese segundo que requiere.
Como comentaba luego perder la energia y volver a conectar, debo subir el sketch, el serial del sim 900 no esta available, apago el sim900 y enciendo el sim900 y luego presiono el power key y ahi, si empieza a funcionar.
Si se sube el código al arduino y en el sim900 no se había presionado el power key este no funciona.
Por lo tanto confirmo lo que mencionaba subtype (muchas graicias!!!).
Ahora bien estoy luego de investigar como prender automaticamente el sim900, me encontré con que algunos sueldan. soldadura para encender por software
En mi caso que uso:
No veo donde se debe soldar?? o capaz que para este modelo no es necesario.
Alguno se topó con esto??
Gracias
Dice que acá debes soldar pero... mi placa es diferente y no se como será la tuya
Near C6 and J15 you have 2 points. You need to solder it. Before soldering yon can hold wire on one of it (down pin , during code execution).
Cerca de C6 y J15 tienes 2 puntos (pads). Necesitas soldarlos. Antes de soldaros coloca un cable en uno de ellos. (pin a LOW, durante la ejecución del código)
Tienes dos pads que debes puentear, o sea unirlos y agrega un cable, cable que ira a un pin con el que le daras las instrucciones que se leen antes en el setup y asunto terminado.
gracias, se entendió, paso link del componente que yo tengo,
lo extraño de este sim900, es que esos dos puntos que el otro tiene, están "pegados entre si"
Si estan pegados ya esta soldados. O revisa con un multimetro su continiudad.
Ahora busca a ver si algun pin de los conectores que veo estan en contacto con estos dos pads. Justamente es lo que buscas. Un pin en el conector donde poner un cable y unirlo a un pin de tu arduino.
En mi SIM808 tengo una distribución difernente (son placas distintas) pero junto al boton de PWRKEY tengo una leyenda que dice D9 que es habitualmente el pin que se usa. Mira si en tu caso tienes algo similar.
Yo leo
DT.... 2.8V
DCD.. RI
RTS... CTS
D9.... RST
Estimado, para ese sim900 lo que hice fue, como este es apilable, fue ubicar el Pin9 en el sim900, luego poner un cable macho - macho al Pin9 del arduino.
Y probar....
El resultado fue positivo, el código que utilizo es para hacer el prendido automatico por software es:
void setup()
{
Serial.println("configurando..");
powerUpOrDown();
Serial.begin(9600); // for serial monitor
mySerial.begin(19200); // for GSM shield
delay(1000);
mySerial.print("AT+CMGF=1\r"); // set SMS mode to text
delay(1000);
mySerial.print("AT+CNMI=2,2,0,0,0\r");
}
Estimados, lamentablemente luego de haber realizado mi ultimo post, luego de varias pruebas con e arduino y el sim900, hoy el proyecto no funciona.
Lo extraño es lo siguiente, anteriormente el power key por software que realizaba se realizaba muy rápido y el sistema quedaba esperando, hoy por hoy veo que el arduino demora en levantar el sistema y el prendido del sim pareceria mas lento.
Dejo mi código para ver si ven algo que les parece que no es correcto, aunque el mismo no tuvo cambios, el hardware se empezo a comportar distinto.
Una variable a esto fue que le cargue a este arduino otro código y luego este, puede estar pasando que haya quedado algo corrupto en la carga??? El ide no dio errores en la subida del sketch.
Nota: modifique ahora para hacer el post del código el teléfono.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8);
//led control
const int ledPIN5 = 5; //rele1
const int ledPIN4 = 4; //rele2
int blinkRele1 = 0;
int blinkRele2 = 0;
//------------ gsm
char incoming_char=0;
String smsRecibo;
int largo;
String mensaje;
String buffer;
String mensajeRecibido;
int automatico;
int apagado;
int apagado2;
int enciendeAutomatico;
int notificaciones;
//captura de nro recibido
String nroDetectado;
//-------------
//------------- rele
int myRelee = 2; //rele1
int myRelee2 = 3; //rele2
int rele2;
//------------
//------------Humedad
const int sensorPin = A0;
const int sensorPin1 = A1;
int valor_limite = 500;
String enciendoHumedad;
int valor_humedad; //guarda el porcentaje enviado de humedad
int porcentaje_humedad;
float promedio;
int foto = 0;
int foto2=0;
//-------------
//--------------tiempo
unsigned long tiempoActual=0;
unsigned long tiempoEnviado=0;
unsigned long tiempoInicio=0;
unsigned long tiempoDiferencia=0;
int finRiego;
unsigned long tiempoInicio2=0;
int finRiego2 = 0;
unsigned long rele2TiempoActual=0;
unsigned long rele2HoraMensaje = 0;
long previousMillis = 0;
long interval;
long interval2;
//---------fotoresistencia---
// Pin analogico de entrada para el LDR
int pinLDR = 5;
// Variable donde se almacena el valor del LDR
int valorLDR = 0;
//----------------------
void setup()
{
Serial.println("configurando..");
//powerUpOrDown();
Serial.begin(9600); // for serial monitor
mySerial.begin(19200); // for GSM shield
delay(1000);//era 100
mySerial.print("AT+CMGF=1\r"); // set SMS mode to text
delay(1000); //era100
mySerial.print("AT+CNMI=2,2,0,0,0\r");
/*
pinMode(ledPIN5 , OUTPUT);
pinMode(ledPIN4 , OUTPUT);
digitalWrite(ledPIN5 , HIGH);
digitalWrite(ledPIN4 , HIGH);
*/
pinMode(13, OUTPUT);
//pinMode(myRelee, OUTPUT);
//pinMode(myRelee2, OUTPUT);
//digitalWrite(myRelee, HIGH);
//digitalWrite(myRelee2, HIGH);
tiempoEnviado = 0;
tiempoActual = 0;
finRiego = 1;
finRiego2=1;
valor_humedad=0;
foto = 0;
foto2=0;
blinkRele1=0;
blinkRele2=0;
buffer = "";
automatico=0;
notificaciones = 0;
}
void loop()
{
char SerialInByte;
//-inicializo
//-----------
if(mySerial.available() >0)
{
buffer = "";
readSIM900A();
Serial.println("Luego de leer buferrr "+buffer);
//Habilita las notificaciones por SMS
int elenotion = buffer.indexOf("NOTI-ON"); //para encender notificaciones
Serial.println("Luego variable "+elenotion);
if (elenotion>=0)
{
notificaciones = 1; //habilita notificaciones
mensaje_sms("NOTI-ON");
}
int elementoNotiOf = buffer.indexOf("NOTI-OFF"); //para encender notificaciones
if (elementoNotiOf>=0)
{
notificaciones = 0; //deshabilita notificaciones
}
}
}
//lee los characteres del mensaje y los mete en un buffer
String readSIM900A()
{
Serial.println("readSImm");
while (mySerial.available())
{
char c = mySerial.read();
buffer.concat(c);
delay(10);
}
return buffer;
}
void mensaje_sms(String mensaje)
{
//capturaNroEnviado();
//String nroEnvio ='"AT+CMGS=\"'+ nroDetectado+'\""';
if (notificaciones == 1)
{
Serial.println("Enviando SMS...");
mySerial.print("AT+CMGF=1\r"); //Configura el modo texto para enviar o recibir mensajes
delay(1000);
//mySerial.println(nroEnvio); //Numero al que vamos a enviar el mensaje
mySerial.println("AT+CMGS=\"+xxxxxxxxx\""); //Numero al que vamos a enviar el mensaje
delay(1000);
mySerial.println("FUNCION Recibida. DOMUM-1: "+mensaje); // Texto del SMS
delay(100);
mySerial.println((char)26); //Comando de finalización ^Z
delay(100);
mySerial.println();
delay(5000); // Esperamos un tiempo para que envíe el SMS
Serial.println("SMS enviado");
}
}
void capturaNroEnviado()
{
//Serial.println("captura nro enviado"+mensajeRecibido+"-");
int elementoComilla = mensajeRecibido.indexOf('5');
// Serial.println("elementoComilla "+elementoComilla);
int elementoSegundaComilla = mensajeRecibido.indexOf('"',elementoComilla);
//Serial.println("elementoSegundaComilla "+elementoSegundaComilla);
nroDetectado = mensajeRecibido.substring(elementoComilla,21);
Serial.println(nroDetectado);
delay(100);
}
void eliminaSMS()
{
//elimina los sms
mySerial.print("AT+CMGDA=\"");
mySerial.println("DEL ALL\"");
}
void powerUpOrDown()
{
pinMode(9, OUTPUT);
digitalWrite(9,LOW);
delay(1000);
digitalWrite(9,HIGH);
delay(5000);
//digitalWrite(9,LOW);
//delay(3000);
}