Ayuda con codigo Arduino uno + GPS + SD + SMS

(1/3) > >>

leoctam:
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

leoctam:
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;
    }
  }
}

leoctam:
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
;)

Sergegsx:
interesante proyecto. animo con el !

leoctam:
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  :P, 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

Navigation

[0] Message Index

[#] Next page