Pages: [1]   Go Down
Author Topic: Programación multitarea  (Read 1420 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola como están
Llevo realizando un proyecto en los cual utilizo GPS y GSM  la idea es que cuando alguien le dé un timbre al gsm responda con los datos del gps hasta ahí me funciona bien pero el problema está cuando aparte de recibir las solicitudes de datos del gps vía gsm quiero hacer un control de la velocidad constantemente con los datos del gps como podría  hacer esas dos tareas solo puedo hacer una  escucho los timbres o actualizo el gps constantemente .
Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no es posible hacerlo al mismo tiempo. pero si tu código esta optimizado veras que lo ejecuta tan rápido que es inapreciable.
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias por tu respuesta  qué opinas si lo hago de esta manera dar mayor prioridad al timbre en el  ciclo loop y atender la alarma de velocidad cada 30 segundos con la función millis()

Code:
void loop()
{

   
    if(gsm.available()>0)
    {
      if(beginGsm())
      {
          if(gpsTiny())
          {
           
            sms("q="+latitud+","+longitud+" "+velocidad,numero);
          }
          else
          {
            sms("El GPS no se encuentra disponible intentelo otra vez",numero);
          }
      }
    }
    else
    {
      if(millis()-tiempo>=30000)
      {
        tiempo=millis();
        if(gpsTiny())
        {
           
          if(vel>60.0)
          {
            infracciones++;
            sms(""+latitud+","+longitud+" ""Infracion de velocidad detectada "+velocidad,"\"xxxxxx\"");
          }
        }
       }
      }
}


« Last Edit: April 14, 2012, 12:46:38 am by edgar_soliz » Logged

COM22
Offline Offline
God Member
*****
Karma: 6
Posts: 702
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Con serial puedes medir el tiempo de los bloques, para saber más o menos tiempo que tarda en ejecutarse, es lo que hago yo con los robots para saber que partes hay que optimizar.

Code:
    if(gsm.available()>0)
    {
      debugtime = millis();
       if(beginGsm())
       {
          [...]
       }
       Serial.print(millis()-debugtime); 
       Serial.print(" ms = T1");
    }
    else
    {
      if(millis()-tiempo>=30000)
      {
        tiempo=millis();
         if(gpsTiny())
         {
           [...]
         }
       Serial.print(millis()-tiempo);
       Serial.println(" ms = T2");
       }
      }
}

La función millis() ten en cuenta que se desborda en 50 días >> http://arduino.cc/es/Reference/millis << por si haces una aplicación que este mucho tiempo encendida.

Un saludo!


Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias por su ayuda  me sirvió de mucho.
Una vez que tengo todo eso funcionado me surge un problema nuevo cuando hago el timbre al módulo GSM este me responde con los datos del GPS pero me di cuenta de que cada vez que le doy un timbre o el control de tiempo llega a los 30 segundos  arduino sufre un reset automático probé las siguientes posibilidades:

Primero que no sea cuestión de alimentación separe los módulos  con alimentación diferente para cada uno

Luego vi algo de que hay un error con el reset en la versión de arduino uno R 2 y le agregue un 1n4148 entre reset y 5V http://dreamingrobots.com/forums/viewtopic.php?f=8&t=258+

Al final creo que el problema está en la librería de tinygps (http://sundial.org/arduino/index.php/tinygps/)no sé qué causa esto pero me parece que va por ese lado esta librería usa esta forma de obtener los datos del GPS

Code:
boolean gpsTiny()
{
  bool newData = false;
  // For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (Gps.available()>0)
    {
      char c =Gps.read();
      // Serial.write(c); // uncomment this line if you want to see the GPS data flowing
      if (gps.encode(c)) // Did a new valid sentence come in?
        newData = true;       
    }
  }
   if (newData)
  {
    float flat, flon;
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
   
    flat == (TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
    flon == (TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
   
    vel=gps.f_speed_kmph();
   
                      char cadLat[10];
                      dtostrf(flat,10,6,cadLat);
                      latitud=String(cadLat);
                     
                      char cadLon[10];
                      dtostrf(flon,10,6,cadLon);
                      longitud=String(cadLon);
                     
                      char cadVel[4];
                      dtostrf(vel,4,1,cadVel);
                      velocidad="Velocidad :"+String(cadVel)+"Km/h";
                   
   

  }
      Gps.flush();
      return newData; 
}

Mi sospecha es que arduino ve el ciclo while como un ciclo infinito y resetea el arduino pero lo que no entiendo es como puede mandar el SMS  con los datos del gps una ves que los manda llega el reset
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

creo que encontré el problema del reset automático.Se debe porque estaba usando la librería #include <stdlib.h> que me facilitaba las conversiones de float a String o viceversa borrando esta parte de las conversiones se soluciona pero a qué se debe esto la razón está en este enlace http://arduino.cc/forum/index.php?action=printpage;topic=78067.0 que dice  que las variables del tipo String o arreglos consumen muchos recursos de nuestro 328P concretamente la memoria SRAM la cual es muy limitada (SRAM-->2 KB (ATmega328)).
Saludos
Logged

Pages: [1]   Go Up
Jump to: