[SOLVED] Error al publicar datos en ubidots


#1

Hola.

Comence enviando un par de variables para ver como funcionaba su plataforma, y si, primera vez que la utilizo. Lo que me di cuenta fue de lo siguiente:

image

En la sección de date me aparece información de 1969. No entiendo como es que aparece eso. De una parte del foro había leído que el mismo ubidots generaba un tiemstamp al momento en que un dato era insertado en la plataforma, pero tambien por ser la primera vez que utilizo una plataforma iot de este tipo, solo queria que alguien me ayudara a ver si estoy haciendo algo mal, o es una configuracion o si tengo que enviar la fecha para que se publique de forma correcta. El dispositivo con el que estoy trabajando es Electron de Particle, junto con un lector OBD-II de Carloop.

Mi codigo:

// This #include statement was automatically added by the Particle IDE.
#include <Ubidots.h>

/* Minimal Carloop example app
 *
 * Reads battery voltage, counts CAN messages and report GPS position to
 * USB serial once per second
 *
 * Copyright 2016 Julien Vanier
 *
 * Distributed under the MIT license. See LICENSE.txt for more details.
 */

#include "application.h"
#include "carloop.h"

#define TOKEN "A1E-6yUjNDzgYgVnGUtvxSDneOXUFDCvp8"  // Put here your Ubidots TOKEN

Ubidots ubidots(TOKEN);

void updateCanMessageCount();
void printValuesAtInterval();
void printValues();
void printFloat(float val, bool valid, int len, int prec);
void printDateTime(TinyGPSDate &d, TinyGPSTime &t);

int LED = D7;

//float Lat;
//float Lng;

Carloop<CarloopRevision2> carloop;

int canMessageCount = 0;

void setup()
{
    Serial.begin(115200);
    carloop.begin();
    pinMode(LED, OUTPUT);
}

void loop()
{
    
    if(ubidots.sendAll(TYPE_UDP)){
        // Do something if values were sent properly
        
        carloop.update();
        updateCanMessageCount();
        printValuesAtInterval();
        
        //Serial.println("Values sent by the device");
    }
    //delay(5000);
    
}

void updateCanMessageCount()
{
    CANMessage message;
    while(carloop.can().receive(message))
    {
        canMessageCount++;
    }
}

void printValuesAtInterval() {
    static const unsigned long interval = 10000;

    static unsigned long lastDisplay = 0;
    if(millis() - lastDisplay < 10000)
    {
        return;
    }
    lastDisplay = millis();
    printValues();
}

void printValues()
{
    auto &gps = carloop.gps();
    // Ensure that the GPS state doesn't change while printing
    WITH_LOCK(gps) {
        //Serial.printf("Battery voltage: %12f ", carloop.battery());
        float bat = carloop.battery();
        
        unsigned long t = ubidots.ntpUnixTime();
        
        ubidots.add("BatV", bat, NULL, t);
        //Serial.printf("CAN messages: %12d ", canMessageCount);
        ubidots.add("CAN", canMessageCount);
        Serial.print("GPS ");
        printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
        printFloat(gps.location.lng(), gps.location.isValid(), 1, 6);
        
        float Lat = gps.location.lat();
        float Lng = gps.location.lng();
        
        ubidots.add("Lat",Lat);
        ubidots.add("Lng",Lng);
        
        
        printDateTime(gps.date, gps.time);
        Serial.printf("%6d chars, %d checksum error", gps.charsProcessed(), gps.failedChecksum());
        Serial.println("");
    }
}

void printFloat(float val, bool valid, int len, int prec)
{
    if(!valid)
    {
        while(len-- > 1)
        {
            Serial.print('*');
            digitalWrite(LED,HIGH);
            delay(100);
            digitalWrite(LED,LOW);
        }
        Serial.print(' ');
        digitalWrite(LED,HIGH);
        delay(100);
        digitalWrite(LED,LOW);
    }
    else
    {
        char format[10];
        snprintf(format, sizeof(format), "%%%d.%df", len, prec);
        Serial.printf(format, val);
        digitalWrite(LED,HIGH);
    }
}

void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
    if (!d.isValid())
    {
        Serial.print("********** ");
    }
    else
    {
        Serial.printf("%02d/%02d/%02d ", d.month(), d.day(), d.year());
    }

    if (!t.isValid())
    {
        Serial.print("******** ");
    }
    else
    {
        Serial.printf("%02d:%02d:%02d ", ((t.hour())-6), t.minute(), t.second());
    }
}

En las variables que tengo problemas son en CAN, Lat y Lng. Las tres se publican en 1969.

Halp


#2

Hola @lherrera, si el core te coloca una fecha de 1969 significa que el timestamp que estas enviando no es válido y por ello le asigna un cero, '0, a tu dot siendo esta la razón por la que ves esa fecha. Por favor asegúrate que estás enviando el timestamp en milisegundos y no en segundos, veo que tu función de imprimir la fecha va hasta segundos, agregar tres ceros al final de esa cadena podría solucionar tu problema.

También te recomiendo antes de iniciar con tu hardware, entender cómo realizar correctamente el payload y hacer algunos tests sencillos desde alguna herramienta online, este video te puede servir para ello.

Saludos.