Saludes a todos, espero esten bien. El motivo de este post es dado que recién comienzo a usar el modulo gsm/gprs Sim900 S2-1040S-Z1K18. Lo he probado varias veces y ya he realizado con éxito llamadas y envío de sms cortos.
Ahora, pruebo la parte de conexión a internet y envio de info a una base de datos. Pero ahora que deseo enviar cierta info de una variable en especifico me he quedado corto, el modulo trabaja con comandos AT y algunos de estos comando me son nuevos.
Realice mi código, pero funciona a medias. Tengo mi base de datos en Mysql y la he probado enviándole valores desde el navegador y estos llegan bien a la base de datos, pero cuando los envío desde el arduino no sucede nada.
Adjunto mi codigo, un ejemplo de una funcion relacionada.
#include <SoftwareSerial.h> // Libreria para la comunicacion con el Modulo SIM900
SoftwareSerial SIM900(10, 11); // Configura el puerto serial para el SIM900.
//----------------- Variables a utilizar ----------------------//
//SoftwareSerial SIM900(10, 11); // Configura el puerto serial para el SIM900
String Medicion= "HOLA"; // Se inicializa la variable.
int Valor1=5;
// -----------------SIM900--------------
int respuesta;
char aux_str[50];
//--------------------- Setup General --------------------------//
void setup()
{
Serial.begin(19200);
//************* SIM900 ********//
SIM900.begin(19200); //----Configura velocidad del puerto serie para el SIM900
Serial.begin(19200); //-----Configura velocidad del puerto serie del Arduino
delay(1000);
Serial.println("Iniciando...");
iniciar();
//***********************************
}
//--------------------- Ciclo General --------------------------//
void loop()
{
//************** SIM900 *********//
while (true)
{
delay(20000);
if (SIM900.available() & (Serial.available()))
{
Serial.write(SIM900.read());
}
//**************************************************************//
}
}
//--------------------- Funciones a utilizar ---------------------//
//************* Inicio de la conexion GPRS ********//
void iniciar()
{
enviarAT("AT+CPIN?", "OK", 2000);
Serial.println("Conectando a la red...");
delay (5000);
//Espera hasta estar conectado a la red movil
while ( enviarAT("AT+CREG?", "+CREG: 0,1", 1000) == 0 )
{
}
Serial.println("Conectado a la red.");
enviarAT("AT+CSQ", "OK", 1000);
enviarAT("AT+COPS?", "OK", 1000);
enviarAT("AT+CGATT?", "OK", 1000);
enviarAT("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"", "OK", 2000);
enviarAT("AT+SAPBR=3,1,\"APN\",\"web.emovil\"", "OK", 2000);
enviarAT("AT+SAPBR=3,1,\"USER\",\"webemovil\"", "OK", 2000);
enviarAT("AT+SAPBR=3,1,\"PWD\",\"webemovil\"", "OK", 2000);
enviarAT("AT+SAPBR=1,1", "OK", 2000);
Sensores();
}
//*********************************************//
//************* LECTURA DE VARIABLES ********//
void Sensores()
{
Valor1=1145; //-------------------------------------De donde se lee la variable
Validacion();
}
//*********************************************//
//***** VALIDAR SI SE ESTA CONECTADO A LA RED *******//
void Validacion()
{
if (enviarAT("AT+CREG?", "+CREG: 0,1", 1000) == 1) //-----------Comprueba la conexion a la red
{
Serial.println("Conexion establecida Exitosamente...");
delay(500);
Serial.println("Obteniendo Mediciones...");
delay(500);
Reporte();
}
else
{
Serial.println("No hay conexion. Info Descartada.");
}
}
//*********************************************//
//***** VALIDAR QUE LOS COMANDOS FUERON ENVADOS ******//
int enviarAT(String ATcommand, char* resp_correcta, unsigned int tiempo)
{
int x = 0;
bool correcto = 0;
char respuesta[100];
unsigned long anterior;
memset(respuesta, '\0', 100); //---------------------------- Inicializa el string
delay(100);
while ( SIM900.available() > 0) SIM900.read(); //--------- Limpia el buffer de entrada
SIM900.println(ATcommand); //--------------------------- Envia el comando AT
x = 0;
anterior = millis();
// Espera una respuesta
do {
// si hay datos el buffer de entrada del UART lee y comprueba la respuesta
if (SIM900.available() != 0)
{
respuesta[x] = SIM900.read();
x++;
// Comprueba si la respuesta es correcta
if (strstr(respuesta, resp_correcta) != NULL)
{
correcto = 1;
}
}
}
// Espera hasta tener una respuesta
while ((correcto == 0) && ((millis() - anterior) < tiempo));
Serial.println(respuesta);
return correcto;
}
//*********************************************//
//*********** REPORTE A LA PAGINA PHP ********//
void Reporte()
{
enviarAT("AT+HTTPINIT", "OK", 2000);
enviarAT("AT+HTTPPARA=\"CID\",1\r\n", "OK", 2000);
enviarAT("AT+HTTPPARA=\"URL\",\"https://www.navuni.mipropia.com/Pagina1.php?Medicion=""1128""\"", "OK", 500);
delay(2000);
enviarAT("AT+HTTPACTION=0\r\n", "OK", 10000);
enviarAT("AT+HTTPTERM\r\n", "OK", 2000);
enviarAT("AT+SAPBR=0,1", "OK", 2000);
Serial.println("Enviado");
delay(3000);
}
Y el codigo de mi base de datos es el siguiente
<?php
$conexion = mysql_connect("abcde", "abcde", "abcde");
mysql_select_db("abcde", $conexion);
mysql_query("INSERT INTO `Mediciones` (`Medicion`,`Hora`,`Fecha`) VALUES ('". $_GET['Medicion'] . "', CURTIME(),CURDATE())", $conexion);
?>
Cuando pruebo mi codigo, esto es lo que obtengo en mi monitor Serie
Iniciando...
AT+CPIN="1234"
ERROR
Conectando a la red...
AT+CREG?
+CREG: 0,1
Conectado a la red.
AT+CGATT=1
OK
AT+CSTT="internet.movistar.ni","movistarni","movistarni"
ERROR
AT+CIICR
ERROR
A
AT+CREG?
+CREG: 0,1
Conexion establecida Exitosamente...
Obteniendo Mediciones...
AT+SAPBR=3,1,"CONTYPE","GPRS"
OK
AT+SAPBR=3,1,"APN","internet.movistar.ni"
OK
AT+SAPBR=2,1
+SAPBR: 1,3,"0.0.0.0"
OK
AT+HTTPINIT
OK
AT+HTTPPARA="URL","http://www.navuni.mipropia.com/Pagina1.php?
ERROR
AT+HTTPREAD=425,100
OK
AT+HTTPPARA="CID",1
OK
AT+HTTPACTION=0
ERROR
AT+HTTPTERM
OK
Enviado
No se si el problema esta en mi código, oh realmente en mis placas e incluso en mi base de datos, pero si la base de datos me recibe los datos desde el navegador omito que este ahí el error. Estaré agradecido si me aclaran algun error que tenga.
Quedo atento a sus aclaraciones, y gracias de antemano.
Saludes a todos.
Att: NAV