[RISOLTO] Scrivere sul file di testo txt

Ciao a tutti, sono nuovo sul forum, e sono quasi alle prime armi su arduino. Arrivo subito al dunque: per la tesi ho dovuto implemetare degli sketch per acquisire i dati da un gps ( ho usato la libreria tinygps) ed imu ( accellerometro ho fatto io il codice ed anche il giroscopio, per il magnetometro ho utilizzato la liberia HMC5883L). Fin qui tutto ok nessun problema, inoltre i dati ricevuti sono stampati a monitor attraverso la serial, ma dovrei continuare, ovvero dovrei salvre i dati (quindi le varibili in cui ho i dati) su un file di testo andrebbe bene un txt. Ma leggendo su google, forum ecc... ho capito che non è possibile direttamente, dovrei usare dei server web, ecc..un'altra opzione ho visto che sarebbe salvare i dati su la sd attraverso la sheild (che non ho e non posso comprare). Questi 2 rimedi che ho trovato non vanno bene per le mie esigenze. Vorrei salvare i dati semplicemente su un file di testo txt e possibilmente senza troppi problemi XD, ci sono determitati comandi o librerie che fanno ciò???.
Grazie a tutti per l'aiuto!!!

PS: ho pensato una 3 possibilità, ovvero utilizzare la EEPROM che per il mio arduino mega2560 è di 4KB, basta per i dati che dovrei salvare?

Ciao

normalmente come scrivi tu la soluzione per un datalogger è dotarlo di una memoria sd e scrivere lì i dati... perché non è compatibile con le tue esigenze? Come è pensato il tuo progetto? Se ad es. fosse sempre connesso al PC potresti pensare di inviare i dati via seriale ad un programma in ascolto (seriale "filo" o anche link bluetooth-xbee...)

Puoi anche usare la EEPROM interna (o aggiungere una EEPROM i2c più capiente) ma per ottenere alla fine un file di testo avresti comunque bisogno di uno sketch che "esporta" i dati immagazzinati mandandoli ad un PC o a una SD...

davids01:
i dati ricevuti sono stampati a monitor attraverso la serial,

Monitor del PC immagino
Se cosi' e' usa un terminale che consenta di archiviare quanto riceve
Su windows io lo faccio con HyperTerminal
Se poi devi salvarli senza essere connesso ad un terminale allora devi andare di SD o simili come gia suggerito

ovvero dovrei salvre i dati (quindi le varibili in cui ho i dati) su un file di testo andrebbe bene un txt. Ma leggendo su google, forum ecc... ho capito che non è possibile direttamente, dovrei usare dei server web, ecc..un'altra opzione ho visto che sarebbe salvare i dati su la sd attraverso la sheild (che non ho e non posso comprare).

Detto così sembra che senza ethernet non puoi, in realtà la ethernet servirebbe per leggere da remoto i dati, potresti anche avere un modulo solo SD ed estrarre la scheda per leggere i file txt

Non so perchè tu non possa comprarla e non è affar mio (metà hobby però l'hai comprato), comunque costa 29 euri una ethernet shield + SD slot e gli hobbies ... si sa costicchiano http://store.arduino.cc/it/index.php?main_page=product_info&cPath=11&products_id=199

solo SD

puoi anche saldare i fili su un adattatore per micro sd estraibile, non è proprio il massimo della tecnologia ma si può fare

ciao

Io uso Processing, allego uno sketch che dovrebbe fare bal caso tuo:

// Scrittura su file da Arduino
import processing.serial.*;
Serial mySerial;
PrintWriter output;

void setup() {
  mySerial = new Serial( this, Serial.list()[1], 9600 );  // seleziona la porta seriale di Arduino e la velocità
  mySerial.bufferUntil('\n'); // Buffer seriale fino a new line
  output = createWriter( "dati.txt" );  // Nome file dati (lo scrive dove risiede il programma)
}

void draw() {
  // Imposta dati con data e tempo
  int gi = day();    // giorno
  int me = month();  // mese
  int an = year();   // anno
  int se = second(); // secondi 
  int mn = minute(); // minuti 
  int or = hour();   // ore 

  if (mySerial.available() > 0 ) {
    String value = mySerial.readStringUntil('\n');   // legge dati da seriale fino a new line 
    if ( value != null ) {
      // scrive dato tempo oppure aggiungere anche data
      String s = String.valueOf(or)+":"+String.valueOf(mn)+"."+String.valueOf(se)+" ";  
      output.print( s );

      output.print( value );   // scrive su file lettura da seriale da Arduino

    }
  }
}

// Esce dal programma alla pressione di qualsiasi tasto
void keyPressed() {
  output.flush(); // Scrive i dati rimanenti su file
  output.close(); // Chiude il file
  exit(); // Esce dal programma
}

innanzitutto vi ringrazio a tutti per le risposte. spiego a tutti che non posso comprare altri dispositivi, perchè quelli che ho mi sono stati dati dall'università per fare questo progetto e non ci sono fondi per comprare altro materiale.
Quindi per questo motivo ho scartato le soluzioni che richiedono l'acquisto di altre sheild.
L'unica soluzione che mi sembra più conosona è quella di amario57, ma vorrei capire bene al sintassi, ovvero:
-import processing.serial.*; è una libreria?

  • l'oggetto Serial mySerial; la seguente dichiarazione, come funziona trovo qualche manuale? fa parte del processing.serial*?
  • riguardo la porzione di programma che scrive, non ci ho capito molto....
    ----- String value = mySerial.readStringUntil('\n'); // legge dati da seriale fino a new line (scusami ma non sto capendo se legge da seriale non deve lggere di continuo???
    ----- output.print( value ); // scrive su file lettura da seriale da Arduino (in poche parole è questo il comando)

dove posso trovare altr informazioni su questa libreria (se è una libreria)?dovrei aggiungerle alla tesi...

Grazie ancora a tutti

amario57 ho visto adesso processing è un software aggiuntivo, quindi non si può fare dal software arduino. Anche se l'ho installato e sembra uguale all'ide di arduino, che cambia?...si risce a leggere anche dall'interfaccia I2C? oppure scrivere direttamente il contenuto delle variabili che ho riempito leggendo dall'interfaccia i2c

PS: mi sono dimenticato di dire, che stampo a monitor, intendo quello del pc, arduino è sempre collegato al pc

Acquisizione_gps_interr.ino (2.25 KB)

Appunto, tutto quello che tu "stampi a video", cioè scrivi su seriale il programma in Processing lo scrive su file.
Naturalmente non devi avere l'IDE di Arduino caricato, ma solo il programma in Processing.

perfetto ho capito, quindi avrei potuto fare tutto con processing sena usare l'ide di arduino...Inoltre ti chiedevo se posso utilizzare il salvataggio dei dati sull'interfaccia I2C, oppure se devo utilizzare il salvataggio delle variabili(che contengono i dati provenienti dall'I2C)...

Un altra domanda se metto il codice che ho creato per l'ide di arduino dentro processing, funziona? oppure devo cambiare il linguaggio?

Credo che con Processing tu non possa leggere direttamente le variabili I2C, ma devi sempre scriverle su seriale per poterle poi avere a disposizione per essere salvate su file.

e poi comunque lo sketch per arduino come lo scrivi ? sempre di arduino ide hai bisogno.
Con ardiono IDE crei lo sketch per il micro
con processing crei lo sketch che ti gira su pc e che si interfaccia ad arduino. Con processing crei dei .exe, se parlano con Arduino e' perche' su arduino c'e' un firmware che tu conosci

altrimenti http://www.gioblu.com/tutorials/elettronica/236-salvare-i-dati-su-microsd-card-senza-sdshield

Madwriter troppo laboriosa non vorrei mettere mano all'hw. Amario scusami ma non ho capito come mi dovrei comportare per l' I2C...in allegato metto lo il programmino che ho creato, se qualcuno sa darmi una dritta...Testato no capisco come bosogna comportarsi com Processing, ovvero utilizza lo stesso linguaggio di arduino? come salvo le variabili? (per la seria prendo il programma di amario)
come al solito grazie a tutti

Acquisizione_Accellerometro.ino (2.16 KB)

Ciao

stai facendo un po' di confusione: il tuo progetto è composto da due parti:

  • Arduino che acquisisce i dati dai sensori i2c e li invia alla seriale del PC
  • software su PC che riceve i dati e li salva

per il primo elemento dovrai scrivere uno sketch utilizzando l'IDE di Arduino.
per il secondo dovrai scrivere un software che sarà in esecuzione sul PC: in questo caso amario ti ha consigliato l'uso di Processing come linguaggio di programmazione perché è "vicino" alla programmazione di Arduino, ma qui hai piena libertà (Java, C#...) in base alle tue conoscenze.

Se invece vuoi completamente evitare l'uso di Arduino, potresti pensare di utizzare un adattatore usb->i2c (ad es.) per far dialogare il tuo programma su PC direttamente con i sensori... tipo USB-I2C Communications Module

dato che lui ha già il programma lato arduino che stampa su seriale, gli basta un programma che legge la seriale e la "sputa" su file .txt

da terminale un /dev/ttyACM0 >> file.txt dovrebbe bastare, e anche i windows mettendo la giusta porta COM..

lesto scusami il concetto che mi "sputa" il file txt è chiarissimo :smiley: è quello che voglio, ma dopo non ho capito cosa dovrei fare. Per quanto riguarda il concetto dei 2 programmi l'ide di arduino e processing ho capito, l'unico dubbio è: con processing dovrei acquisisire di nuovo i dati per poi salvarli con il programma di amario (quindi il programma dell'ide risulterebbe inutile). Inoltre non ho capito come faccio ad acquisire i dati con processing con l'interfaccia I2C.

(grazie ancora una volta a tutti)

ciao

con Processing (esempio di amario) ricevi i dati via seriale da Arduino e salvi questi in un file di testo... come ti dicevo lo sketch ("programma per l'iDE") ti serve per leggere i sensori ed inviare i dati via seriale:

sensore --(i2c)--> arduino --(seriale)--> PC

Mi sa che non ha capito che se stacchi dal PC Arduino lo sketch fatto con l'IDE è comunque residente su Arduino :wink:

lucadentella ok, chiaro quindi io tengo il mio programma per acquisire i dati dai sensori con i2c, e li porto su serial per stampare a monitor, come faccio a mandarli alla seriale? devo utilizzare quella seriale (stampa a monitor) per leggere i dati? in allegato metto il file che ho fatto, se mi potete dare un esempio un pò più concreto

Acquisizione_Accellerometro.ino (2.16 KB)

ciao

in realtà tu stai già inviando i dati alla seriale ]:smiley: il serial monitor di arduino infatti non fa altro che visualizzare quello che riceve appunto sulla seriale (ed è quello che fanno i vari Serial.println che hai nello sketch).

Semplicemente dovrai utilizzare, invece del serial monitor dell'IDE, un programma che oltre a visualizzare ti consenta anche di salvare quanto riceve... questo è già bello e fatto per Windows: