conversione JSON -> array

Ciao a tutti,

ho realizzato un datalogger che registra, ogni ora, i valori degli ingressi analogici su un file Logger00.csv in formato JSON
Formato dati:
{"id":xxx,"Timestamp":xxx,"Temp_in_H2O":xxx,"Temp_out_H2O":xxx,"Temp_ambient":xxx,"Temp_external":xxx, "Spare_Value":xxx}

dove xxx sono le mie variabili, fin qui tutto bene, registra correttamente su uSD il file .csv e riesco a recuperare i dati dalla pagina web mediante ajax e javascript

adesso, avendo a disposizione un "batabase" di dati in formato JSON, dovrei recuperare gli ultimi 24 record registrati ed ordinarli in un array nel seguente formato:

<javascript>
var myDataTemp_in_H2O = new Array([Temp_in_H2O[0], id[0]], [Temp_in_H2O[1], id[1]], ... [Temp_in_H2O[24], id[24]]);
var myDataTemp_out_H2O = new Array([Temp_out_H2O[0], id[0]], [Temp_out_H2O[1], id[1]], ... [Temp_out_H2O[24], id[24]]);
var myDataTemp_ambient = new Array([Temp_ambient[0], id[0]], [Temp_ambient[1], id[1]], ... [Temp_ambient[24], id[24]]);
var myDataTemp_external = new Array([Temp_external[0], id[0]], [Temp_external[1], id[1]], ... [Temp_external[24], id[24]]);
.....
</javascript>

questi array così formattati, andranno a popolare le serie di dati per la generazione del grafico corrispondente.

la libreria .js che sto utilizzando è http://www.jscharts.com/

qualche idea?

saluti
kattivik76

se non conosci la dimensione del file, dovrai leggerlo tutto, magari usando un array circolare di 24 elementi. In pratica l'indice quando arriva a 23 (da 0 a 23 sono 24 elementi) ricomincia da 0 e va a sovrascrivere i dati vecchi (do per scontato che il file sia in ordine cronologico). A questo punto, l'indice +1 (se hai trovato >=24 elementi) è il dato più vecchio della serie degli ultimi 24 record del file, che puoi stampare allegramente. come puoi vedere l'unico caso particolare è quando hai nel file meno di 24 elementi.

Io ti consiglio di leggere su file usando le strutture: per esempio:

struct dato{
int temperatura0;
int temperatura1;
int temperatura2;
int temperatura3;
};

in questo modo dovrebbe essere possibile scrivere e leggere direttamente un'intera struttura con una sola write/read. non solo; diventa facile anche fare l'array:

struct dato array[24];

la variabile di tipo struttura si dichiara:

struct dato variabile;

e si assegnano i valori così:
variabile.temperatura0 = temp;

però non so se la write e la read di arduino supportano le strutture... al massimo dovrai farti una funzioncina apposta che faccia il salto da file a struttura. In questo modo se cambi la struttura, basterà modificare solo quella funzione per aggiornare il codice.

Grazie delle info,

però io riesco già a scrivere un file di testo su arduino in formato JSON e riesco già a recuperare l'intero file da pagina web, il problema è che non ho idea di come manipolare tali dati mediante ajax/javascript ed inserirli in array che successivamente passerei alla libreria JSCharts.js

questo è il sito http://home-galliate.dyndns.org:81/ dove sto testando il webserver arduino, la mia intenzione è di poter "ordinare" questo database JSON in un formato adatto alla libreria JSCharts.js, tutto i dati JSON recuperati da pagina web si trovano in fondo alla pagina.

grazie :slight_smile:

saluti
kattivik76

Oh ma che bel progetto.
Inizio a farti i miei complimenti, stai realizzando la stessa cosa che ho in programma di realizzare io.
Inizierò a lavorarci seriamente da gennaio, ora sto sistemando ancora l'hardware, però magari le info che ho raccolto nelle settimane scorse ti potranno essere d'aiuto.

Mi pare di capire, correggimi se sbaglio, che vorresti tirare fuori un grafico delle ultime 24 ore, anche se sul log ci sono i dati di una settimana.
Se ho capito la tua intenzione, ti consiglio di provare un approccio diverso.
Dimentica jschart e passa a flot.
E' molto molto meglio.
Dai in pasto il tuo file di log, formattato json a flot, se te lo importa senza problemi credo che questo esempio possa funzionare al caso tuo.
http://people.iola.dk/olau/flot/examples/time.html
Con una funzione puoi richiamare specifici intervalli di tempo e ci pensa flot stesso ad estrapolare i dati ed a popolare il grafico per il lasso di tempo richiesto.
Dovresti solo preparare dei bottoni "Today", "Last week" "Last month" dopo aver ricavato con la funzione integrata la data attuale.

Se flot ha problemi con il tuo json, c'è un plugin per flot, extflot che dovrebbe permettere di gestire direttamente i csv.

Cmq, tienici aggiornati qui sul forum oppure scrivimi privatamente, perché sono davvero interessata a come procederà il tuo progetto.
Ti avviso già che a gennaio probabilmente ti romperò le scatole in pm per avere qualche dettaglio in più sul tuo codice :slight_smile:

E già che ci sono ti faccio quattro domandine veloci:
Che IDE usi? Che libreria per il webserver utilizzi? Come hai impaginato le temperature all'interno della pagina html? e come gestisci il refresh dei valori?

Ciao Daniela,

grazie delle info, stasera provo a vedere di riordinare i valori passati alla pagina web in modo tale da poterli utilizzare con FLOT :slight_smile:

ti allego il progetto completo sia della parte web (nella cartella SD) sia la parte sketch -> ArduinoUNO

l'IDE che sto utilizzando è la 0022, le librerie che sto usando sono:

#include <SPI.h>
#include <Ethernet.h>
#include <Flash.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <TinyWebServer.h>
#include <TimedAction.h>

:slight_smile:

fammi sapere,
saluti kattivik76

SD.rar (638 KB)

MyWebserverSD2.rar (3.16 KB)

kattivik76:
l'IDE che sto utilizzando è la 0022, le librerie che sto usando sono:
#include <TinyWebServer.h>

Mannaggia lo sapevo.
Non trovo un cavolo di webserver che funzioni con l'IDE 1.0
se per gennaio non aggiornano le lib, torno alla 22.
Ho già backportato gli sketch :\