Pages: [1]   Go Down
Author Topic: Ayuda con codigo Arduino uno + GPS + SD + SMS  (Read 3516 times)
0 Members and 1 Guest are viewing this topic.
Chile
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos.
Me he embarcado en la tarea de crear un sistema GPS tracker, la idea es que el sistema guarde el track GPS en una memoria SD, para luego sacar esta información y analizarla en otro sistema bajo ciertos parámetros establecidos los cuales me entregaran un resultado de la ruta realizada.

Adicionalmente el sistema enviara datos cada cierto tiempo vía SMS, para poder monitorear en tiempo real la posición del equipo.
Al finalizar debería quedar algo así:



Que estoy utilizando:
•   Arduino UNO R3
•   GPS Bee kit con XBee Shield
•   Arduino microSD Shield
•   Cellular Shield con SM5100B

Para el desarrollo del  proyecto me estoy basando en este gran tutorial de BricoGeek, salvo el tema de los sensores… todo el resto me es de mucha utilidad, de hecho… estoy utilizando sus códigos.



Como soy nuevo en esto, he divido el proyecto en etapas:
Etapa N°1: Conseguir leer la información del GPS… HECHO!!!.

Etapa N°2: Enviar la trama GPS a la SD. He aquí mi problema, uso el código del ejemplo de BricoGeek, pero al compilarlo salen los siguientes mensajes:

C:\Users\casa\Documents\arduino-1.0.4\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=104 -IC:\Users\casa\Documents\arduino-1.0.4\hardware\arduino\cores\arduino -IC:\Users\casa\Documents\arduino-1.0.4\hardware\arduino\variants\standard -IC:\Users\casa\Documents\Arduino\libraries\SdFat C:\Users\casa\AppData\Local\Temp\build3364636019889159244.tmp\BricoGeek_SdFatGPS_CSVSensorLogger.cpp -o C:\Users\casa\AppData\Local\Temp\build3364636019889159244.tmp\BricoGeek_SdFatGPS_CSVSensorLogger.cpp.o
In file included from C:\Users\casa\Documents\Arduino\libraries\SdFat/SdFat.h:30,
                 from BricoGeek_SdFatGPS_CSVSensorLogger.ino:16:
C:\Users\casa\Documents\Arduino\libraries\SdFat/Sd2Card.h:39:22: warning: extra tokens at end of #ifdef directive
In file included from BricoGeek_SdFatGPS_CSVSensorLogger.ino:17:
C:\Users\casa\Documents\Arduino\libraries\SdFat/SdFatUtil.h:27:22: warning: WProgram.h: No such file or directory
In file included from BricoGeek_SdFatGPS_CSVSensorLogger.ino:16:
C:\Users\casa\Documents\Arduino\libraries\SdFat/SdFat.h:294: error: conflicting return type specified for 'virtual void SdFile::write(uint8_t)'
C:\Users\casa\Documents\arduino-1.0.4\hardware\arduino\cores\arduino/Print.h:48: error:   overriding 'virtual size_t Print::write(uint8_t)'
BricoGeek_SdFatGPS_CSVSensorLogger.ino: In function 'void error(uint8_t)':
BricoGeek_SdFatGPS_CSVSensorLogger.ino:82: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino: In function 'void setup()':
BricoGeek_SdFatGPS_CSVSensorLogger.ino:109: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:113: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:117: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:121: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:132: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:135: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:136: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:140: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:146: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:152: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:154: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:160: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:168: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:174: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:180: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino: In function 'void loop()':
BricoGeek_SdFatGPS_CSVSensorLogger.ino:361: warning: only initialized variables can be placed into program memory area
BricoGeek_SdFatGPS_CSVSensorLogger.ino:381: warning: only initialized variables can be placed into program memory area
C:\Users\casa\Documents\Arduino\libraries\SdFat/SdFatUtil.h: At global scope:
C:\Users\casa\Documents\Arduino\libraries\SdFat/SdFatUtil.h:37: warning: 'int FreeRam()' defined but not used

Logged

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

Este es el codigo que estoy usando.

Code:
uint8_t sensorCount = 1;
#include <SdFat.h>
#include <SdFatUtil.h>
#include <avr/pgmspace.h>

#define isdigit(x) ( x >= '0' && x <= '9')

extern uint16_t _end;

Sd2Card card;
SdVolume volume;
SdFile root;
SdFile f;

#define led1Pin 2
 
#define BUFFSIZE 73
char buffer[BUFFSIZE];
char buffer2[12];

uint8_t bufferidx = 0;
uint32_t tmp;

#define LOG_RMC  1
#define RMC_ON   "$PSRF103,4,0,1,1*21\r\n"
#define RMC_OFF  "$PSRF103,4,0,0,1*20\r\n"

#define LOG_GGA  0
#define GGA_ON   "$PSRF103,0,0,1,1*25\r\n"
#define GGA_OFF  "$PSRF103,0,0,0,1*24\r\n"

#define LOG_GSA 0
#define GSA_ON   "$PSRF103,2,0,1,1*27\r\n"
#define GSA_OFF  "$PSRF103,2,0,0,1*26\r\n"

#define LOG_GSV  0
#define GSV_ON   "$PSRF103,3,0,1,1*26\r\n"
#define GSV_OFF  "$PSRF103,3,0,0,1*27\r\n"

#define LOG_GLL 0

#define USE_WAAS   1
#define WAAS_ON    "$PSRF151,1*3F\r\n"
#define WAAS_OFF   "$PSRF151,0*3E\r\n"

#define LOG_RMC_FIXONLY 1
uint8_t fix = 0;

#define putstring(str) SerialPrint_P(PSTR(str))
#define putstring_nl(str) SerialPrintln_P(PSTR(str))

uint8_t parseHex(char c) {
    if (c < '0')  return 0;
    if (c <= '9') return c - '0';
    if (c < 'A')  return 0;
    if (c <= 'F') return (c - 'A')+10;
}

uint8_t i;

void error(uint8_t errno) {
  if (card.errorCode()) {
    putstring("Error en la SD: ");
    Serial.print(card.errorCode(), HEX);
    Serial.print(',');
    Serial.println(card.errorData(), HEX);
  }
   while(1) {
     for (i=0; i<errno; i++) {    
       digitalWrite(led1Pin, HIGH);
       Serial.println("error");
       delay(100);
       digitalWrite(led1Pin, LOW);    
       delay(100);
     }
     for (; i<10; i++) {
       delay(200);
     }      
   }
}

void setup()
{
  Serial.begin(9600);
  pinMode(10, OUTPUT);
  putstring_nl("GPSlogger BricoGeek");
  pinMode(led1Pin, OUTPUT);
   pinMode(13, OUTPUT);
  if (!card.init()) {
    putstring_nl("La inicializacion de la SD ha fallado!");
    error(1);
  }
  if (!volume.init(card)) {
    putstring_nl("No hay particion!");
    error(2);
  }
  if (!root.openRoot(volume)) {
        putstring_nl("No se puede abrir el directorio raiz");
    error(3);
  }
  strcpy(buffer, "GPSLOG00.CSV");
  for (i = 0; i < 100; i++) {
    buffer[6] = '0' + i/10;
    buffer[7] = '0' + i%10;
    if (f.open(root, buffer, O_CREAT | O_EXCL | O_WRITE)) break;
  }
  
  if(!f.isOpen()) {
    putstring("No se ha podido crear "); Serial.println(buffer);
    error(3);
  }
  putstring("escribiendo en "); Serial.println(buffer);
  putstring_nl("Preparado!");

  // escritura de la cabecera
  if (sensorCount > 6) sensorCount = 6;
  strncpy_P(buffer, PSTR("time,lat,long,speed,date,sens0,sens1,sens2,sens3,sens4,sens5"), 24 + 6*sensorCount);
  Serial.println(buffer);
  // clear print error
  f.writeError = 0;
  f.println(buffer);
  if (f.writeError || !f.sync()) {
    putstring_nl("no se pudo escribir la cabecera!");
    error(5);
  }
  
  delay(1000);
   putstring("\r\n");
#if USE_WAAS == 1
   putstring(WAAS_ON);
#else
  putstring(WAAS_OFF);
#endif

#if LOG_RMC == 1
  putstring(RMC_ON);
#else
  putstring(RMC_OFF);
#endif

#if LOG_GSV == 1
  putstring(GSV_ON);
#else
  putstring(GSV_OFF);
#endif

#if LOG_GSA == 1
  putstring(GSA_ON);
#else
  putstring(GSA_OFF);
#endif

#if LOG_GGA == 1
 putstring(GGA_ON);
#else
 putstring(GGA_OFF);
#endif
}

void loop()                    
{
  //Serial.println(Serial.available(), DEC);
  char c;
  uint8_t sum;
  
  if (Serial.available()) {
    c = Serial.read();
    //Serial.print(c, BYTE);
    if (bufferidx == 0) {
      while (c != '$')
        c = Serial.read();
    }
    buffer[bufferidx] = c;

    //Serial.print(c, BYTE);
    if (c == '\n') {
      //putstring_nl("EOL");
      //Serial.print(buffer);
      buffer[bufferidx+1] = 0;
    
      if (buffer[bufferidx-4] != '*') {
        // no hay checksum?
        Serial.write('*');
        bufferidx = 0;
        return;
      }
      // calcula checksum
      sum = parseHex(buffer[bufferidx-3]) * 16;
      sum += parseHex(buffer[bufferidx-2]);
      
      // comprueba checksum
      for (i=1; i < (bufferidx-4); i++) {
        sum ^= buffer[i];
      }
      if (sum != 0) {
        //putstring_nl("error de checksum");
        Serial.write('~');
        bufferidx = 0;
        return;
      }
      //Serial.println(buffer);
      if (strstr(buffer, "GPRMC")) {
        char *p = buffer;
        p = strchr(p, ',')+1;
        p = strchr(p, ',')+1;
        
        if (p[0] == 'V') {
          digitalWrite(led1Pin, LOW);
          fix = 0;
        }
        else {
          digitalWrite(led1Pin, HIGH);
          fix = 1;
        }
      }

#if LOG_RMC_FIXONLY
      if (!fix) {
          Serial.write('_');
          bufferidx = 0;
          return;
      }
#endif
      
      Serial.println();
      Serial.print("Secuencia NMEA recibida: ");
      Serial.print(buffer);
  
      // buscando los datos
      // encuentra el tiempo
      char *p = buffer;
      p = strchr(p, ',')+1;
      buffer[0] = p[0];
      buffer[1] = p[1];
      buffer[2] = ':';
      buffer[3] = p[2];
      buffer[4] = p[3];
      buffer[5] = ':';
      buffer[6] = p[4];
      buffer[7] = p[5];
      // ignoramos milisegundos
      buffer[8] = ',';
      
      p = strchr(buffer+8, ',')+1;

      p = strchr(p, ',')+1;
      // encuentra latitud
      p = strchr(p, ',')+1;

      buffer[9] = '+';
      buffer[10] = p[0];
      buffer[11] = p[1];
      buffer[12] = ' ';
      strncpy(buffer+13, p+2, 7);
      buffer[20] = ',';
      
      p = strchr(buffer+21, ',')+1;
      if (p[0] == 'S')
        buffer[9] = '-';
      
      // encuentra longitud
      p = strchr(p, ',')+1;
      buffer[21] = '+';
      buffer[22] = p[0];
      buffer[23] = p[1];
      buffer[24] = p[2];
      buffer[25] = ' ';
      strncpy(buffer+26, p+3, 7);
      buffer[33] = ',';
      
      p = strchr(buffer+34, ',')+1;
      if (p[0] == 'W')
        buffer[21] = '-';
      
      // encuentra velocidad
      p = strchr(p, ',')+1;
      tmp = 0;
      if (p[0] != ',') {
        // convertimos la velocidad (viene en nudos)
        while (p[0] != '.' && p[0] != ',') {
          tmp *= 10;
          tmp += p[0] - '0';
          p++;      
        }
        tmp *= 10;
        if (isdigit(p[1]))
          tmp += p[1] - '0';
        tmp *= 10;
        if (isdigit(p[2]))
        tmp += p[2] - '0';

        tmp *= 185; //la convertimos en km/h

      }
      tmp /= 100;
      
      buffer[34] = (tmp / 10000) + '0';
      tmp %= 10000;
      buffer[35] = (tmp / 1000) + '0';
      tmp %= 1000;
      buffer[36] = (tmp / 100) + '0';
      tmp %= 100;
      buffer[37] = '.';
      buffer[38] = (tmp / 10) + '0';
      tmp %= 10;
      buffer[39] = tmp + '0';
      
      buffer[40] = ',';
      p = strchr(p, ',')+1;
      // skip past bearing
      p = strchr(p, ',')+1;
      //mod para evitar problemas cuando falta algun dato (bill greiman)
      uint8_t date[6];
      for (uint8_t id = 0; id < 6; id++) date[id] = p[id];
      // formatea la fecha asi 2001-01-31
      buffer[41] = '2';
      buffer[42] = '0';  // en el año 2100 esto no funcionara XD
      buffer[43] = date[4];
      buffer[44] = date[5];
      buffer[45] = '-';
      buffer[46] = date[2];
      buffer[47] = date[3];
      buffer[48] = '-';
      buffer[49] = date[0];
      buffer[50] = date[1];
      buffer[51] = 0;
 
      if(f.write((uint8_t *) buffer, 51) != 51) {
         putstring_nl("no se ha podido escribir fix!");
      return;
      }
      Serial.print("Datos escritos en la SD: ");
      Serial.print(buffer);
      
      f.writeError = 0;      
////AQUI SE AÑADE LA INFORMACION DE LOS SENSORES/////

      for (uint8_t ia = 0; ia < sensorCount; ia++) {
        Serial.print(',');   //escribimos por serie
        f.print(',');        //escribimos en el archivo
        uint16_t data = analogRead(ia);
        Serial.print(data);  //escribimos por serie
        f.print(data);       //escribimos en el archivo
      }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////      
      
      Serial.println();
      f.println();
      if (f.writeError || !f.sync()) {
         putstring_nl("no se ha podido escribir el dato!");
         error(4);
      }
      bufferidx = 0;
      return;
    }
    bufferidx++;
    if (bufferidx == BUFFSIZE-1) {
       Serial.write('!');
       bufferidx = 0;
    }
  }
}
« Last Edit: May 04, 2013, 09:56:50 pm by leoctam » Logged

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

Bueno… las otras etapas del proyecto son:

Etapa N°3, Enviar información vía SMS a un servidor implementado con “Open GPS Tracking System
Etapa N°4, Implementar el servidor Open GPS Tracking System para recibir el SMS con la info del equipo GPS.

Pero bueno… estas etapas las llevare a cabo cuando solucione el problema de compilación del código anterior, espero me puedan ayudar los más entendidos en la materia.

Saludos
smiley-wink
Logged

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

interesante proyecto. animo con el !
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/

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

Gracias Sergegsx

Bueno... de tanto darle vuelta al asunto... decidí cambiar y probar otro código que se me acomoda más y lo veo un poco mas sencillo que el anterior. (Extraido de este tutorial)

Code:
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <stdlib.h>
#include <SD.h>

File dataFile;
TinyGPS gps;
SoftwareSerial nss(3, 4); // GPS 3(tx) 4 (rx)

static char databuffer[20];
int CS = 11;
int led = 13;

//Definiciones de cadenas

String SD_date_time = "invalid"; // Fechas y Hora
String SD_lat = "invalid"; // Latitud
String SD_lon = "invalid"; // Longitud
String SD_vel = "invalid"; // Velocidad
String SD_cur = "invalid"; // Curso (Rumbo)
String SD_gra = "invalid"; // Grados (respecto al GPS)

String dataString = "";


static void gpsdump(TinyGPS &gps);
static bool feedgps();
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

void setup()
{
pinMode(CS, OUTPUT);
pinMode(led, OUTPUT);

// Interfaces seriales
  Serial.begin(115200);
  nss.begin(9600); //Velc de Tx del GPS Bee v1.2
  
// Conexi�n a la tarjeta SD
if(!SD.begin(CS));
{
Serial.println("Fallo de tarjeta SD");
return;
}

  // Impresion en el monitor serial del Arduino
  Serial.print("Chile Nav System Tracking ");
  Serial.println(TinyGPS::library_version());
  Serial.println("by Leonel Fuentes");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = ");
  Serial.println(sizeof(TinyGPS));
  Serial.println();        
  Serial.println("Sats HDOP Latitud  Longitud  Fix  Fecha      Hora      Fecha Alt     Curso Velc Grados  Distanc Curso Grados  Chars Sentences Checksum");
  Serial.println("          grados   grados    Age                        Age  (m)     --- del  GPS ----  ----  hacia WP  ----  RX    RX        Fail");
  Serial.println("--------------------------------------------------------------------------------------------------------------------------------------");
}

void loop()
{
  bool newdata = false;
  unsigned long start = millis();

  // Every second we print an update
  while (millis() - start < 1000)
  {
    if (feedgps())
      newdata = true;
  }

  gpsdump(gps);
  
  // Escritura de la info en la SD
  dataString = SD_date_time + "," + SD_lat + "," + SD_lon + "," + SD_vel + "," + SD_cur + "," + SD_gra;
  if(SD_date_time != "invalid")
digitalWrite(led, HIGH);
  else
digitalWrite(led, LOW);

// Abriendo el archivo CSV para grabar los datos
File dataFile SD.open("ruta.csv", FILE_WRITE);
if (dataFile)
{
dataFile.println(dataString);
Serial.println(dataString);
dataFile.close();
}
else
{
Serial.println("\nNo se puede abrir el archivo ruta.csv!");
}
}

static void gpsdump(TinyGPS &gps)
{
  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  static const float LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
  gps.f_get_position(&flat, &flon, &age);
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 5, 1); // Latitud
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 5, 2); // Longitud
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);

  print_date(gps); // Fecha y Hora

  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 8, 2, 0);
  print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2, 0);
  print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2, 0);
  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
  print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0UL : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : TinyGPS::course_to(flat, flon, 51.508131, -0.128002), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2, 0);
  print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

  gps.stats(&chars, &sentences, &failed);
  print_int(chars, 0xFFFFFFFF, 6);
  print_int(sentences, 0xFFFFFFFF, 10);
  print_int(failed, 0xFFFFFFFF, 9);
  Serial.println();
}

static void print_int(unsigned long val, unsigned long invalid, int len)
{
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
  else
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0)
    sz[len-1] = ' ';
  Serial.print(sz);
  feedgps();
}

static void print_float(float val, float invalid, int len, int prec, int SD_val)
{
  char sz[32];
  if (val == invalid)
  {
    strcpy(sz, "*******");
    sz[len] = 0;
if (len > 0)
 sz[len-1] = ' ';
    for (int i=7; i<len; ++i)
sz[i] = ' ';
    Serial.print(sz);
if(SD_val == 1) SD_lat = sz;
    else if(SD_val == 2) SD_lon = sz;
  }
  else
  {
    Serial.print(val, prec);
    if (SD_val == 1) SD_lat = dtostrf(val,10,5,databuffer);
    else if (SD_val == 2) SD_lon = dtostrf(val,10,5,databuffer);
int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1);
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(" ");
  }
  feedgps();
}

static void print_date(TinyGPS &gps)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE)
  {
    Serial.print("*******    *******    ");
SD_date_time = "invalid";
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d   ",
    day, month, year, hour, minute, second); //configuracion formato fecha y hora
    Serial.print(sz);
SD_date_time = sz;
  }
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  feedgps();
}

static void print_str(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  feedgps();
}

static bool feedgps()
{
  while (nss.available())
  {
    if (gps.encode(nss.read()))
      return true;
  }
  return false;
}

Por lo menos ahora me aparecen menos mensajes  smiley-razz, he estado leyendo mucha información... pero no logro dar con el problema. Estos son los mensajes que aparecen al compilar:

CST.ino: In function 'void loop()':
CST:95: error: expected initializer before 'SD'
CST.ino: In function 'void gpsdump(TinyGPS&)':
CST.ino:111: warning: unused variable 'date'
CST.ino:111: warning: unused variable 'time'
CST.ino: At global scope:
CST.ino:39: warning: 'void print_float(float, float, int, int)' declared 'static' but never defined


Se que estoy haciendo algo mal... pero no logro visualizar cual es el error.

Desde ya... agradecidos por vuestra ayuda.

Saludos
Leoctam
« Last Edit: May 04, 2013, 09:59:37 pm by leoctam » Logged

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

bueno pues sin leerme todo el codigo creo que puedo ayudarte al menos en algo

mira aqui llamas a la libreria
Code:
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <stdlib.h>
#include <SD.h>

y aqui llamas a una instancia de la libreria

Code:
File dataFile;
TinyGPS gps;
SoftwareSerial nss(3, 4); // GPS 3(tx) 4 (rx)
si te fijas no lo haces para el SD


y aqui inicias cada componente
Code:
SD.begin(CS)
etc

espero que esto te ayude

pd. me hace gracia como decías.. "desde ya" gracias jeje
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/

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

Gracias por la ayuda Sergegsx, pero me di cuenta que mi error pasaba por otra linea:

File dataFile SD.open("ruta.csv", FILE_WRITE);

La modifique a:

File dataFile = SD.open("ruta.csv", FILE_WRITE);

Y ahora el programa compila sin problemas. Me esta dando problemas la SD que a veces no graba todos los datos... pero antes de ver ese inconveniente, me estoy dedicando a tratar de enviar el dato de velocidad, que en este codigo lo tiene "gps.f_speed_kmph()".

dataString = SD_date_time + "," + SD_lat + "," + SD_lon + "," + gps.f_speed_kmph();

Estoy tratando de enviarlo asi a la SD... pero al compilar me sale el siguiente error:


error: ambiguous overload for 'operator+' in 'operator+(((const StringSumHelper&)((const StringSumHelper*)operator+(((const StringSumHelper&)((const StringSumHelper*)operator+(((const StringSumHelper&)((const StringSumHelper*)operator+(((const StringSumHelper&)((const StringSumHelper*)operator+(((const StringSumHelper&)(& StringSumHelper(((const String&)((const String*)(& SD_date_time)))))), ((const char*)",")))), ((const String&)((const String*)(& SD_lat)))))), ((const char*)",")))), ((const String&)((const String*)(& SD_lon)))))), ((const char*)",")) + gps.TinyGPS::f_speed_kmph()'


Alguna idea???

Saludos
 smiley-cool
Logged

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

He estado modificando a prueba y error... y al parecer el tema pasa por el tipo de dato (según yo).

datastring lo declaro como un string, y la variable de velocidad es un float, pero solo al dejar la velocidad y declarar "datastring" como float, la velocidad se guarda sin problemas

float dataString = 0;
dataString = gps.f_speed_kmph();

Los errores me los da cuando trato de enviar la fecha/hora, longitud y latitud, que estan declaradas como:

String SD_date_time = "sin datos"; // Fecha - Hora
String SD_lat = "sin datos"; // Latitud
String SD_lon = "sin datos"; // Longitud

Como lo puedo hacer para enviar la variable float de velocidad a la cadena de datos que deseo grabar en la SD???

Saludos
 smiley-cool
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

¿Entiendo que quieres convertirlo a cadena legible? Creo que lo más sencillo es utilizar sprintf.
Logged

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

¿Entiendo que quieres convertirlo a cadena legible? Creo que lo más sencillo es utilizar sprintf.

Exacto... y como quedaria la sentencia ocupando sprintf???

Saludos
 smiley-cool
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Busca en internet información concreta sobre "c printf" o "c sprintf" y los formatos que admiten. Básicamente su uso es sprintf(char *buffer,char *cadena,[variable1,variable2...]). Por ejemplo:
Code:
float a=5.6;
float b=6.8;
int c=-632;
char *d="juan"
char buffer[100];
sprintf(buffer,"%02.3f,%03.2f,%05d,%s",a,b,c,d);
tras la instrucción sprintf, la cadena buffer contendría aproximadamente "05.600,006.80,00632,juan".
Digo aproximadamente, porque no lo he probado, porque al convertir decimal a float tal vez pierdas precisión en los decimales, y porque ahora mismo no estoy muy seguro de los modificadores de formato % (por eso te digo que busques y pruebes). Teóricamente con un solo sprintf podrías construir la cadena de texto entera con todas las variables y sus separadores, lista para enviar, aunque primero deberás convertir a cadena las variables "raras" (date, por ejemplo).
Logged

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

Gracias por tu ayuda noter. Me sirvio para saber que buscar en internet... de tanto leer y investigar me quedo el siguiente codigo:

Code:
String SD_speed_kmph = "Sin datos"; 
String SD_rumbo = "Sin datos";  

String dataString = "*Sin Datos*";

  SD_speed_kmph = dtostrf(gps.f_speed_kmph(),6, 2, buffer_velc);
  SD_rumbo = dtostrf(gps.f_course(),6, 2, buffer_rumb);
  dataString = SD_date_time + "," + SD_lat + "," + SD_lon + "," + SD_speed_kmph + "," + SD_rumbo;

Al verificar el "dataString" por el monitor serial... me imprime perfecto la cadena de datos que necesito enviar a la SD.

Ahora continuare con mi proximo "detalle"... smiley-razz La tarjeta SD no me esta grabando los datos. Seguire investigando y comentare mis avances.

Saludos
 smiley-cool
« Last Edit: May 22, 2013, 12:02:02 pm by leoctam » Logged

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

jajajajaja... error de novato, fui iluminado y empecé a revisar el datasheet del shield SD y me he dado cuenta que CS utiliza el puerto 8.

int CS = 8;

Y ahora la SD funciona perfecto!!!!.

Continuare con la funcionalidad de enviar los datos vía SMS... ahí les voy comentando mis avances.


Saludos
 smiley-cool
Logged

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

Hola a todos.

Nuevamente por aquí... He estado testeando la grabación de la tarjeta SD, pero a ratos la SD empieza a grabar basura, siendo que la trama GPS se recibe correctamente, ya que monitoreo tanto lo que se recibe del GPS como lo que se graba en la SD.



La única solución que tengo hasta ahora es apretar el botón reset de la placa, pero esa no es la idea... la idea es que al detectar esa "basura", deje de escribirla en la SD (ya encontré la manera de que no grabe data cuando el GPS aun no tome posición).

Estuve leyendo por ahí... y al parecer no existe (o mejor dicho... no a sido 100% comprobada efectivamente) alguna forma de realizar un reseteo por software cuando se detecte alguna condición.

Cuál sería el problema??? Algún micro corte que afecta a la SD???

Bueno... lo concreto es... que tengo que encontrar la manera de que cuando se detecte esta "basura", no se grabe en la SD y que el programa se corrija con algún tipo de reseteo (por ejemplo).

Alguno de Uds. tiene alguna idea... o se ha topado con algún problema similar.

Espero sus comentarios.

Saludos
 smiley-cool



Logged

Pages: [1]   Go Up
Jump to: