Go Down

Topic: Mandar coordenadas por mensaje con Arduino Shield SIM900 (Read 205 times) previous topic - next topic

ivangaer

Aug 23, 2019, 01:34 pm Last Edit: Sep 13, 2019, 05:17 am by surbyte Reason: nuevo problema
Hola, tengo un problema con mi software el cual es que cuando el modulo MPU6050 detecta movimiento en miprograma no todas las veces avanza hasta la funcion para enviar el mensaje de las coordenadas del gps, solo pone hasta donde dice "se mueve" y activa la alarma en un parpadeo. quisiera saber como hacer que vuelva a preguntar a la funcion si que esta dentro de la misma funcion si, Ademas tengo un problema con el SIM900 nose si encuentra señal me pueden mandar un programa de como testear eso?
Code: [Select]

#include <Wire.h>
#include <MPU6050.h>
#include <SoftwareSerial.h>//incluimos SoftwareSerial
#include <TinyGPS.h>//incluimos TinyGPS
MPU6050 mpu;
TinyGPS gps;//Declaramos el objeto gps
SoftwareSerial serialgps(4,3);//Declaramos el pin 4 Tx y 3 Rx
SoftwareSerial SIM900(7, 8); // Configura el puerto serial para el SIM900
//Numero del chip claro: +595 982165904
//Declaramos la variables para la obtención de datos
//Declaramos la variables para la obtención de datos
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long chars;
unsigned short sentences, failed_checksum;
void setup()
{
Serial.begin(9600);
 
Serial.println("Initialize MPU6050");
while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
{
Serial.println("Error");
delay(1000);
}
pinMode(13, OUTPUT);
 
mpu.setThreshold(2);
  SIM900.begin(9600); //Configura velocidad del puerto serie para el SIM900
  Serial.begin(9600); //Configura velocidad del puerto serie del Arduino
  //Serial.println("Iniciando Programa");
  delay (1000);
  SIM900.println("AT+CPIN=\"1111\""); //Comando AT para introducir el PIN de la tarjeta
  delay(5000); //Tiempo para que encuentre una RED

  //Serial.begin(9600);//Iniciamos el puerto serie
  serialgps.begin(9600);//Iniciamos el puerto serie del gps
  //Imprimimos:
  Serial.println("");
  Serial.println("GPS GY-GPS6MV2 Leantec");
  Serial.println(" ---Buscando senal--- ");
  Serial.println("");
}

 
void loop()
{
Vector rawGyro = mpu.readRawGyro();
Vector normGyro = mpu.readNormalizeGyro();
float normal_x = normGyro.XAxis;
float normal_y = normGyro.YAxis;
float normal_z = normGyro.ZAxis;
Serial.print(" Xnorm = ");
Serial.print(normal_x);
Serial.print(" Ynorm = ");
Serial.print(normal_y);
Serial.print(" Znorm = ");
Serial.println(normal_z);
 
if((abs(normal_x) + abs(normal_y) + abs(normal_z)) > 100){
digitalWrite(13, HIGH);
Serial.println("Se mueve");
  {
  while(serialgps.available())
    {
    int c = serialgps.read();
    if(gps.encode(c))  
    {
      float latitude, longitude;
      gps.f_get_position(&latitude, &longitude);
      Serial.print("Latitud/Longitud: ");
      Serial.print(latitude,5);
      Serial.print(", ");
      Serial.println(longitude,5);

      gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
      Serial.print("Fecha: "); Serial.print(day, DEC); Serial.print("/");
      Serial.print(month, DEC); Serial.print("/"); Serial.print(year);
      Serial.print(" Hora: "); Serial.print(hour, DEC); Serial.print(":");
      Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC);
      Serial.print("."); Serial.println(hundredths, DEC);
      Serial.print("Altitud (metros): ");
      Serial.println(gps.f_altitude());
      Serial.print("Rumbo (grados): "); Serial.println(gps.f_course());
      Serial.print("Velocidad(kmph): ");
      Serial.println(gps.f_speed_kmph());
      Serial.print("Satelites: "); Serial.println(gps.satellites());
      Serial.println();
      gps.stats(&chars, &sentences, &failed_checksum);
      
      Serial.println("Enviando SMS...");
      SIM900.print("AT+CMGF=1\r"); //Comando AT para mandar un SMS
      delay(1000);
      SIM900.println("AT+CMGS=\"+595994795858\""); //Numero al que vamos a enviar el mensaje
      delay(1000);
      SIM900.println(latitude);// Texto del SMS
      delay(100);
      SIM900.println(longitude);// Texto del SMS
      delay(100);
      SIM900.println((char)26);//Comando de finalizacion ^Z
      delay(100);
      SIM900.println();
      delay(5000); // Esperamos un tiempo para que envíe el SMS
      Serial.println("SMS enviado");
    }
    
  }
  }
}else{
digitalWrite(13, LOW);
Serial.println("No se mueve");
}
 
delay(10);
}

surbyte

Empiezo a la inversa. El SIM tiene un comando AT que devuelve el nivel RSSI de la señal, buscalo en la hoja de datos del SIM900.

Luego de recibir el "se mueve" tienes esto


Code: [Select]
Serial.println("Se mueve");
  {
  while(serialgps.available())
    {
    int c = serialgps.read();
    if(gps.encode(c)) 


Entras un un loop que no termina JAMAS si es que esta recibiendo datos del buffer... eso puede ser un problema en tu caso.
Que tal si pones algo como un flag que le diga... envio datos pero.. si pasa determinado tiempo o se activa esta bandera dejo de hacerlo?

Lo que no entiendo es si llega a "se mueve" y luego no hace nada mas por que veo muchos Serial.print que deberían ejecutarse, ocurre eso o no?

surbyte

Acabo de leer que el moderador del foro en inglès borró hilos tuyos repetidos y ahora me encuentro con que también tenías iniciado este.

Bueno mi estimado  ivangaer debes leer de modo inmediato las normas del foro porque si yo me hubiera enterado de tu cross post en el foro inglés sumado a este, ya estarías en problemas por acumulación de faltas.

Ahora no repitas este error!!

El hilo del que hablo https://forum.arduino.cc/index.php?topic=635578.0

ivangaer

Ahora el problema y el programa es otro dejenme ponerles al tanto
Code: [Select]
#include <Wire.h>
#include <MPU6050.h>
#include <SoftwareSerial.h>//incluimos SoftwareSerial
#include <TinyGPS.h>//incluimos TinyGPS
MPU6050 mpu;
TinyGPS gps;//Declaramos el objeto gps
SoftwareSerial serialgps(4,3);//Declaramos el pin 4 Tx y 3 Rx
SoftwareSerial SIM900(7, 8); // Configura el puerto serial para el SIM900
//Numero del chip claro: +595 982165904
//Declaramos la variables para la obtención de datos
//Declaramos la variables para la obtención de datos
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long chars;
unsigned short sentences, failed_checksum;
void setup()
{
Serial.begin(9600);
 
Serial.println("Initialize MPU6050");
while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
{
Serial.println("Error");
delay(1000);
}
pinMode(13, OUTPUT);
 
mpu.setThreshold(2);
  SIM900.begin(9600); //Configura velocidad del puerto serie para el SIM900
  Serial.begin(9600); //Configura velocidad del puerto serie del Arduino
  //Serial.println("Iniciando Programa");
  delay (1000);
  SIM900.println("AT+CPIN=\"1111\""); //Comando AT para introducir el PIN de la tarjeta
  delay(5000); //Tiempo para que encuentre una RED

  //Serial.begin(9600);//Iniciamos el puerto serie
  serialgps.begin(9600);//Iniciamos el puerto serie del gps
  //Imprimimos:
  Serial.println("");
  Serial.println("GPS GY-GPS6MV2 Leantec");
  Serial.println(" ---Buscando senal--- ");
  Serial.println("");
}

 
void loop()
{
    while(serialgps.available())
    {
    int c = serialgps.read();
    if(gps.encode(c)) 
    {
      float latitude, longitude;
      gps.f_get_position(&latitude, &longitude);
      Serial.print("Latitud/Longitud: ");
      Serial.print(latitude,5);
      Serial.print(", ");
      Serial.println(longitude,5);

      gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
      Serial.print("Fecha: "); Serial.print(day, DEC); Serial.print("/");
      Serial.print(month, DEC); Serial.print("/"); Serial.print(year);
      Serial.print(" Hora: "); Serial.print(hour, DEC); Serial.print(":");
      Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC);
      Serial.print("."); Serial.println(hundredths, DEC);
      Serial.print("Altitud (metros): ");
      Serial.println(gps.f_altitude());
      Serial.print("Rumbo (grados): "); Serial.println(gps.f_course());
      Serial.print("Velocidad(kmph): ");
      Serial.println(gps.f_speed_kmph());
      Serial.print("Satelites: "); Serial.println(gps.satellites());
      Serial.println();
      gps.stats(&chars, &sentences, &failed_checksum);
     
Vector rawGyro = mpu.readRawGyro();
Vector normGyro = mpu.readNormalizeGyro();
float normal_x = normGyro.XAxis;
float normal_y = normGyro.YAxis;
float normal_z = normGyro.ZAxis;
Serial.print(" Xnorm = ");
Serial.print(normal_x);
Serial.print(" Ynorm = ");
Serial.print(normal_y);
Serial.print(" Znorm = ");
Serial.println(normal_z);



if((abs(normal_x) + abs(normal_y) + abs(normal_z)) > 100){
digitalWrite(13, HIGH);
Serial.println("Se mueve");
      String(latitude,5);
      String(longitude,5);
      Serial.println("Enviando SMS...");
      SIM900.print("AT+CMGF=1\r"); //Comando AT para mandar un SMS
      delay(1000);
      SIM900.println("AT+CMGS=\"+595994795858\""); //Numero al que vamos a enviar el mensaje
      delay(1000);
      SIM900.println("Tu Mochila se Ah movido, enviando coordenadas");// Texto del SMS
      delay(100);
      SIM900.println(latitude,5);// Texto del SMS
      delay(100);
      SIM900.print(",");
      SIM900.print(longitude,5);// Texto del SMS
      delay(100);
      SIM900.println(hundredths, DEC);// Texto del SMS
      delay(100);
      SIM900.println(gps.f_altitude());// Texto del SMS
      delay(100);
      SIM900.println(gps.f_course());// Texto del SMS
      delay(100);
      SIM900.println(gps.f_speed_kmph());// Texto del SMS
      delay(100);
     
      digitalWrite(13, LOW);
      delay(300);
      digitalWrite(13, HIGH);
      SIM900.println((char)26);//Comando de finalizacion ^Z
      delay(100);
      SIM900.println();
      delay(5000); // Esperamos un tiempo para que envíe el SMS
      Serial.println("SMS enviado");
   
   
 
 
}else{
digitalWrite(13, LOW);
Serial.println("No se mueve");
}
 
delay(10);
}
}
}

Bueno el problema de ahora es que el Modulo SIM900 no envia los mensajes, verifique que si tiene señal con un comando AT y probando si al llamar tenia tono pero no manda mensajes, querria saber como puedo solucionarlo y que podrian ser los problemas.

ivangaer

Hice un cambio con un poco de investigacion y utilice el comando String, me podrian decir si lo use de manera correcta?
Code: [Select]

#include <Wire.h>
#include <MPU6050.h>
#include <SoftwareSerial.h>//incluimos SoftwareSerial
#include <TinyGPS.h>//incluimos TinyGPS
MPU6050 mpu;
TinyGPS gps;//Declaramos el objeto gps
SoftwareSerial serialgps(4,3);//Declaramos el pin 4 Tx y 3 Rx
SoftwareSerial SIM900(7, 8); // Configura el puerto serial para el SIM900
//Numero del chip claro: +595 982165904
//Declaramos la variables para la obtención de datos
//Declaramos la variables para la obtención de datos
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long chars;
unsigned short sentences, failed_checksum;
void setup()
{
Serial.begin(9600);
 
Serial.println("Initialize MPU6050");
while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
{
Serial.println("Error");
delay(1000);
}
pinMode(13, OUTPUT);
 
mpu.setThreshold(2);
  SIM900.begin(9600); //Configura velocidad del puerto serie para el SIM900
  Serial.begin(9600); //Configura velocidad del puerto serie del Arduino
  //Serial.println("Iniciando Programa");
  delay (1000);
  SIM900.println("AT+CPIN=\"1111\""); //Comando AT para introducir el PIN de la tarjeta
  delay(5000); //Tiempo para que encuentre una RED

  //Serial.begin(9600);//Iniciamos el puerto serie
  serialgps.begin(9600);//Iniciamos el puerto serie del gps
  //Imprimimos:
  Serial.println("");
  Serial.println("GPS GY-GPS6MV2 Leantec");
  Serial.println(" ---Buscando senal--- ");
  Serial.println("");
}

 
void loop()
{
    while(serialgps.available())
    {
    int c = serialgps.read();
    if(gps.encode(c)) 
    {
      float latitude, longitude;
      gps.f_get_position(&latitude, &longitude);
      Serial.print("Latitud/Longitud: ");
      Serial.print(latitude,5);
      Serial.print(", ");
      Serial.println(longitude,5);

      gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
      Serial.print("Fecha: "); Serial.print(day, DEC); Serial.print("/");
      Serial.print(month, DEC); Serial.print("/"); Serial.print(year);
      Serial.print(" Hora: "); Serial.print(hour, DEC); Serial.print(":");
      Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC);
      Serial.print("."); Serial.println(hundredths, DEC);
      Serial.print("Altitud (metros): ");
      Serial.println(gps.f_altitude());
      Serial.print("Rumbo (grados): "); Serial.println(gps.f_course());
      Serial.print("Velocidad(kmph): ");
      Serial.println(gps.f_speed_kmph());
      Serial.print("Satelites: "); Serial.println(gps.satellites());
      Serial.println();
      gps.stats(&chars, &sentences, &failed_checksum);
     
Vector rawGyro = mpu.readRawGyro();
Vector normGyro = mpu.readNormalizeGyro();
float normal_x = normGyro.XAxis;
float normal_y = normGyro.YAxis;
float normal_z = normGyro.ZAxis;
Serial.print(" Xnorm = ");
Serial.print(normal_x);
Serial.print(" Ynorm = ");
Serial.print(normal_y);
Serial.print(" Znorm = ");
Serial.println(normal_z);



if((abs(normal_x) + abs(normal_y) + abs(normal_z)) > 100){
digitalWrite(13, HIGH);
Serial.println("Se mueve");
      String latitud (latitude,5);
      String longitud (longitude,5);
      Serial.println("Enviando SMS...");
      SIM900.print("AT+CMGF=1\r"); //Comando AT para mandar un SMS
      delay(1000);
      SIM900.println("AT+CMGS=\"+595994795858\""); //Numero al que vamos a enviar el mensaje
      delay(1000);
      SIM900.println("Tu Mochila se Ah movido, enviando coordenadas");// Texto del SMS
      delay(100);
      SIM900.println(latitud);// Texto del SMS
      delay(100);
      SIM900.print(",");
      SIM900.print(longitud);// Texto del SMS
      delay(100);
      digitalWrite(13, LOW);
      delay(300);
      digitalWrite(13, HIGH);
      SIM900.println((char)26);//Comando de finalizacion ^Z
      delay(100);
      SIM900.println();
      delay(5000); // Esperamos un tiempo para que envíe el SMS
      Serial.println("SMS enviado");
   
   
 
 
}else{
digitalWrite(13, LOW);
Serial.println("No se mueve");
}
 
delay(10);
}
}
}

ivangaer

Solucionado, el ultimo programa tiene la solucion

Go Up