Go Down

Topic: Duda: imprimir por LCD lo que me respongo al usar comandos AT. (Read 183 times) previous topic - next topic

Chusski

Buenas compañeros.

Estoy tratando de mostrar por LCD, las repuestas que me da por el serialport (softserial), al enviar comandos AT, pero no soy capaz...

Envio esto:
Code: [Select]
  enviarAT("AT+CGATT=1\r", "OK", 1000);
  enviarAT("AT+CSTT=\"movistar.es\",\"MOVISTAR\",\"MOVISTAR\"", "OK", 3000); //Definimos el APN, usuario y clave a utilizar
  enviarAT("AT+CIICR", "OK", 3000); //Activamos el perfil de datos inalámbrico
  enviarAT("AT+CIFSR", "OK", 3000); //Obtenemos una direccion ip 


Me devulve esto:
Code: [Select]
AT+CGATT=1


OK
AT+CSTT="movistar.es","MOVISTAR","MOVISTAR"

OK
AT+CIICR

OK
AT+CIFSR

2.141.143.156

AT+COPS?


+COPS: 0,0,"movistar"
AT+COPS?


+COPS: 0,0,"movistar"

OK

AT+COPS?


+COPS: 0,0,"movistar"

OK


Me gustaria porder ver las respuestas por el LCD, he intentado con codigos parecidos a este:

Code: [Select]
void printlcd()
{
 while(SIM900.available()!=0)
 {
   lcd.print(SIM900.read());   
 }
}

  enviarAT("AT+CGATT=1\r", "OK", 1000);
printlcd();
  enviarAT("AT+CSTT=\"movistar.es\",\"MOVISTAR\",\"MOVISTAR\"", "OK", 3000); //Definimos el APN, usuario y clave a utilizar
printlcd();
  enviarAT("AT+CIICR", "OK", 3000); //Activamos el perfil de datos inalámbrico
printlcd();
  enviarAT("AT+CIFSR", "OK", 3000); //Obtenemos una direccion ip
printlcd();


Pero solo salen numeros...

Muchas gracias por la ayuda^^

surbyte

Bueno, para comenzar el procedimiento

Code: [Select]
enviarAT("AT+CGATT=1\r", "OK", 1000);
esta actuando por si solo, y espera una respuesta que debe ser "OK" por 1000 mseg.
Entonces tu no tienes nada para mostrar.
No sabemos que hace

Code: [Select]
printlcd();

Porque tal como lo muestras es un procedimiento del que nada sabemos. Por eso que siempre se pide que se postee todo el código y si este supera 9k entonces solo se adjunta.

En el primer comando enviarAT seguramente tienes la opción de mostar la respuesta OK o las demas respuestas.
Solo mira en el momento que hay un Serial.print que lo hace.
Eso mismo debes presentar en el LCD.

Chusski

#2
Jan 21, 2020, 07:58 pm Last Edit: Jan 21, 2020, 08:13 pm by surbyte Reason: Agregado de etiqueta para códigos/errores
Os pego todo el código, no creí que fuera necesario perdón. Quizás puede ser un poco largo, por que estoy aprendiendo, y tengo muchos comentarios.

La idea, es poder mostrar por el LCD, la IP, y el operador, al menos.
Como aun no tengo claro como se usa el Protothreas, ni el millis, no lo estoy usando.

La sintaxis de este código:

Code: [Select]
enviarAT("AT+CGATT=1\r", "OK", 1000);

Significa esto no ?:

enviar AT+CGATT= 1 al sim900 por el serialport
Enter
esperar un OK durante 1000 mseg, por el serialport

Aquí yo pensaba, poder capturar esas respuestas y mostrarlas por la LCD.


Todo el código lo adjunto.


Muchas gracias por la ayuda, y vuestro tiempo ^^

surbyte

Vaya que te lo he explicado, repite lo que dice la función o procedimiento enviarAT() y donde encuentres Serial.print agregas un lcd.print

Esta es tu función

Code: [Select]
//---------Habilita Funion enviarAT-----------------
int8_t enviarAT(char* ATcommand, char* resp_correcta, unsigned int tiempo)
{

  //int x = 0;
  uint8_t x=0, 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);  // <== ACA DEBES AGREGAR el lcd.print

  return correcto;
}



Al final luego de  

Code: [Select]
Serial.println(respuesta);
lcd.print(respuesta);


Eso es todo!!

Chusski

Perdona surbyte, no te había entendido.

Esta función, la copie de Internet, y no la he acabado de comprender como funciona...
Intento no usar copias de Internet, sin haberlas comprendido, pero es que soy un poco cazurro para la programación, y no avanzaba...

Igualmente, si añado eso a la funciona, saldrá absolutamente todo por el LCD, como podría controlarlo para que solo salga cuando quiero?

Muchas gracias por tu ayuda, y paciencia ^^

Chusski

He añadido esto:

Code: [Select]
  String content = respuesta;
  if(content.indexOf("movistar.es") >= 0){
    lcd.setCursor ( 0, 1 );
    lcd.print("Movistar");
    delay(2000);
  }


Aunque no me acaba de convencer, por que hago un poco de trampa...

Pero no se me ocurre que hacer para detectar la IP, y que la escriba.

Muchas gracias de verdad ^^

Chusski

Para sacar la IP he añadido este código:

Pero me aparecen símbolos raros,  antes de la ip. imagino que no he extraído correctamente los números, pero en el serial monitor si lo muestra bien, aunque con mucho espacio como si hubiera presionado enter varias veces.

Code: [Select]
int8_t enviarAT(char* ATcommand, char* resp_correcta, unsigned int tiempo)
{

  //int x = 0;
  uint8_t x=0, 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);
  String content = respuesta;
  if(content.indexOf("movistar.es") >= 0){
    lcd.setCursor ( 0, 1 );
    lcd.print("Movistar");
    delay(2000);
    }else {
     
  }
  if (content.indexOf("AT+CIFSR") >= 0) { //comprobar si "content" contiene XXXX
    char *strtok(char *str1, const char *str2); //
    char *resultado =NULL;
    char str [100];
    content.toCharArray(str, 101);
    char delimitarores[] = "R";
    resultado = strtok(str, delimitarores);//extrar de str lo que hay despues de "delimitadores" y borra lo anterior con "NULL"
    char *ip1, *ip2, *ip3, *ip4;
    char ipall[15];
    ip1 = strtok( NULL, "." ); // extrae lo que hay delante de "."
    ip2 = strtok( NULL, "." );
    ip3 = strtok( NULL, "." );
    //strtok( NULL, ip3 ); //Saltar palabra,letra, o simbolo etc...XXX
    ip4 = strtok( NULL, ip3); // estrae lo que hay detras de ip3
    strcpy(ipall,ip1);// copia el contenido de ip1 a ipall
    strcat(ipall,".");// añade el contenido de ip2 a ipall + ip1 etc...
    strcat(ipall,ip2);
    strcat(ipall,".");
    strcat(ipall,ip3);
    strcat(ipall,".");
    strcat(ipall,ip4);
    lcd.setCursor ( 0, 1 );
    lcd.print( ipall);
    delay(2000);
  }
 
  return correcto;
}


Muchas gracias^^

surbyte

Ahhh te he entendido mal. Vamos de nuevo.
Qué quieres ver: cada respuesta o solo algunas?

Si solo quieres ver la IP y alguna cosa mas eso es fácil de separar.

Chusski

Buenas surbyte.
Hice lo que me comentaste, y añadí condiciones para que a veces, si aveces no, saliera por pantalla.
Al final conseguí mas o menos, detectar cuando dice el operador y lo escribí por pantalla añadiéndolo yo. Como eso no vale para la IP, al final conseguí separar los números, pero no he conseguido quitarle los símbolos raros, que diría que son ENTREs '\n' ...


Code: [Select]
//---------Habilita Funion enviarAT-----------------
int8_t enviarAT(char* ATcommand, char* resp_correcta, unsigned int tiempo)
{
  //int x = 0;
  uint8_t x=0, correcto = 0;
  char respuesta[250];
  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 {
    if (SIM900.available() != 0){// si hay datos el buffer de entrada del UART lee y comprueba la respuesta
        respuesta[x] = SIM900.read();
        x++;
      if (strstr(respuesta, resp_correcta) != NULL){// Comprueba si la respuesta es correcta
        correcto = 1;
      }
    }
  }
  // Espera hasta tener una respuesta
  while ((correcto == 0) && ((millis() - anterior) < tiempo));
  Serial.println(respuesta);
  String content = respuesta;
//  if (content.indexOf("AT+CIICR") >= 0) {
//    if (content.indexOf("ERROR") >= 0) {
//      memset(respuesta, '\0', 100); // Inicializa el string
//      power_off();
//      delay(2000);
//      resetFunc();
//    }
//  }
//  if (content.indexOf("AT+CIFSR") >= 0) {
//    if (content.indexOf("ERROR") >= 0) {
//      memset(respuesta, '\0', 100); // Inicializa el string
//      power_off();
//      delay(2000);
//      resetFunc();
//    }
//  }
  if(content.indexOf("movistar.es") >= 0){
    lcd.setCursor ( 0, 1 );
    lcd.print("Movistar");
    delay(2000);
    }else {
  }
  if (content.indexOf("AT+CIFSR") >= 0) { //comprobar si "content" contiene XXXX
    char *strtok(char *str1, const char *str2); //
    char *resultado =NULL;
    char str [100];
    content.toCharArray(str, 101);
    char delimitarores[] = "'\n'";
    resultado = strtok(str, delimitarores);//extrar de str lo que hay despues de "delimitadores" y borra lo anterior con "NULL"
    char *ip1, *ip2, *ip3, *ip4;
    char ipall[15];
    String ipall2;
    //ip1 = strtok(str,ip1);
    //Serial.println(ip1);
    //lcd.print(ip1);
    strtok( NULL, "'\n'" ); //Saltar palabra,letra, o simbolo etc...XXX
    ip1 = strtok( NULL, "." ); // extrae lo que hay delante de "."
    ip2 = strtok( NULL, "." );
    ip3 = strtok( NULL, "." );
    ip4 = strtok(NULL, "'\n'"); // estrae lo que hay detras de ipall
    strcpy(ipall,ip1);// copia el contenido de ip1 a ipall
    strcat(ipall,".");// añade el contenido de ip2 a ipall + ip1 etc...
    strcat(ipall,ip2);
    strcat(ipall,".");
    strcat(ipall,ip3);
    strcat(ipall,".");
    strcat(ipall,ip4);
    Serial.println(ipall);
    lcd.setCursor ( 0, 1 );
    lcd.print( ipall);
    delay(2000);
  }
  return correcto;
}
//---------Funion enviarAT--------------------------

surbyte

Este es el comando que te ayudará

Code: [Select]
Serial.println(content.substring(content.indexOf("AT+CSTT=\"")+9, content.indexOf("\",\"")));

Go Up