Il datalogging adafruit è una shield studiata per realizzare in modo semplice progetti di raccolta dati con arduino simili al mio progetto: Datalogger Arduino LCD DHT11 che utilizza due shield, una come RTC e una per scrivere su SD Card.
Con un unica shield Datalogging adafruit puoi integrare sia il circuito RTC ( Real Time Clock ) sia la scrittura su SD Card e risparmiare una shield che incide in termini di dimensioni del prodotto finale.
L’adafruit ha inoltre presidposto sulla shield Datalogging adafruit anche una piccola parte formata da basetta millefori in cui puoi collegare i tuoi componenti esterni come le sonde risparmiando anche la protoshield se il progetto richiede componenti che non possono essere montati “in aria” .
Preparazione della Datalogging adafruit
La shield datalogging adafruit è fornita senza gli header:
o meglio è fornita con una strip di contatti che puoi saldare per collegare la datalogging adafruit ad arduino ma senza poter poi collegare altre shield sopra a castello.
Io nella mia versione ho preferito acquistare a parte degli header e saldare quelli per non precludermi la possibilità di montare altre shield in futuro:
Come è composta la datalogging adafruit
Adareuit realizza una guida completa sia sul montaggio sia sull’utilizzo di questa shield che trovi in questo link ed in cui riporta questi due schemi:
nel secondo ti mostra una serie di contatti aggiuntivi a cui puoi saldare dei contatti aggiuntivi e la cui spiegazione è riportata in dettaglio nella guida del produttore:
Lo sketch Datalogging adafruit
La datalogging adafruit ha sia la componente RTC sia quella SD Card che possono essere utilizzate separatamente per cui il primo test che puoi eseguire è che entrambe le componenti funzionino indipendentemente l’una dalla’altra.
Parti con il test dell’RTC:
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib #include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; void setup () { Serial.begin(57600); Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled // uncomment it & upload to set the time, date and start run the RTC! //RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop () { DateTime now = RTC.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(' '); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); Serial.print(" since 1970 = "); Serial.print(now.unixtime()); Serial.print("s = "); Serial.print(now.unixtime() / 86400L); Serial.println("d"); // calculate a date which is 7 days and 30 seconds into the future DateTime future (now.unixtime() + 7 * 86400L + 30); Serial.print(" now + 7d + 30s: "); Serial.print(future.year(), DEC); Serial.print('/'); Serial.print(future.month(), DEC); Serial.print('/'); Serial.print(future.day(), DEC); Serial.print(' '); Serial.print(future.hour(), DEC); Serial.print(':'); Serial.print(future.minute(), DEC); Serial.print(':'); Serial.print(future.second(), DEC); Serial.println(); Serial.println(); delay(3000); }
Lo sketch che ho utilizzato è quello suggerito dalla adafruit, che per inciso è lo sketch base dell’RTC che trovi in tantissimi miei esempi, a cui ho eseguito una modifica alla linea 17: in cui devi rimuovere il commento al primo utilizzo in quanto l’RTC essendo nuovo non ha impostata la data corretta.
Dal secondo invio di sketch in poi ti consiglio di lasciare commentata la linea 17 per evitare che si resetti l’ora dell’RTC qualora all’avvio del tuo progetto l’RTC dovesse non rispondere immediatamente, in tal caso infatti il dalogging adafruit riporterebbe l’ora al momento dell’invio dello sketch e non manterrebbe l’ora corretta.
Il risultato, che puoi leggere sul monitor seriale, dovrebbe essere simile al seguente:
Lo sketch di test dell’SD Card
Prima di testare la parte SD devi procurarti una SD Card da massimo 2Gb ( SD di maggiori dimensioni non sono gestite da questa shield ) e formattarla FAT16 o FAT32, io l’ho fatto con Mac usando l’utility disco:
puoi quindi inserire la SD card nello slot ed eseguire uno degli sketch di esempio che utilizzano la DS Card, ad esempio la SD Card Info che ti recupera le informazioni sulla SD Card che ha inserito:
/* SD card test This example shows how use the utility libraries on which the' SD library is based in order to get info about your SD card. Very useful for testing a card when you're not sure whether its working or not. The circuit: * SD card attached to SPI bus as follows: ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila ** CS - depends on your SD card shield or module. Pin 4 used here for consistency with other Arduino examples created 28 Mar 2011 by Limor Fried modified 9 Apr 2012 by Tom Igoe */ // include the SD library: #include <SD.h> // set up variables using the SD utility library functions: Sd2Card card; SdVolume volume; SdFile root; // change this to match your SD shield or module; // Arduino Ethernet shield: pin 4 // Adafruit SD shields and modules: pin 10 // Sparkfun SD shield: pin 8 const int chipSelect = 10; void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } Serial.print("\nInitializing SD card..."); // On the Ethernet Shield, CS is pin 4. It's set as an output by default. // Note that even if it's not used as the CS pin, the hardware SS pin // (10 on most Arduino boards, 53 on the Mega) must be left as an output // or the SD library functions will not work. pinMode(10, OUTPUT); // change this to 53 on a mega // we'll use the initialization code from the utility libraries // since we're just testing if the card is working! if (!card.init(SPI_HALF_SPEED, chipSelect)) { Serial.println("initialization failed. Things to check:"); Serial.println("* is a card is inserted?"); Serial.println("* Is your wiring correct?"); Serial.println("* did you change the chipSelect pin to match your shield or module?"); return; } else { Serial.println("Wiring is correct and a card is present."); } // print the type of card Serial.print("\nCard type: "); switch(card.type()) { case SD_CARD_TYPE_SD1: Serial.println("SD1"); break; case SD_CARD_TYPE_SD2: Serial.println("SD2"); break; case SD_CARD_TYPE_SDHC: Serial.println("SDHC"); break; default: Serial.println("Unknown"); } // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32 if (!volume.init(card)) { Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card"); return; } // print the type and size of the first FAT-type volume uint32_t volumesize; Serial.print("\nVolume type is FAT"); Serial.println(volume.fatType(), DEC); Serial.println(); volumesize = volume.blocksPerCluster(); // clusters are collections of blocks volumesize *= volume.clusterCount(); // we'll have a lot of clusters volumesize *= 512; // SD card blocks are always 512 bytes Serial.print("Volume size (bytes): "); Serial.println(volumesize); Serial.print("Volume size (Kbytes): "); volumesize /= 1024; Serial.println(volumesize); Serial.print("Volume size (Mbytes): "); volumesize /= 1024; Serial.println(volumesize); Serial.println("\nFiles found on the card (name, date and size in bytes): "); root.openRoot(volume); // list all files in the card with date and size root.ls(LS_R | LS_DATE | LS_SIZE); } void loop(void) { }
unica modifica allo sketch di esempio riguarda il pin di chipSelect che in questa shield è il pin 10 per cui dovrai modificare lo sketch come riportato alla linea 035: cambia il valore della variabile chipSelect da 4 a 10
Il risultato sul monitor seriale dovrebbe essere simile al seguente:
19 commenti
Vai al modulo dei commenti
Ciao, mi chiamo Marco e volevo dirti che ci sono gran bei lavori in questo sito, complimenti.
Gentilmente ho bisogno di aiuto:
sto utilizzando arduino uno con datalogging Aduino shiled della adafruit, non riesco visualizzare i dati del sensore TMP su LCD 16×2; ovvero salvo i dati però nel display compaiono caratteri strani , non capisco quale sia il problema.
Come posso risolvere ?
Grazie
Autore
Ciao Marco,
altri testi riesci a visualizzarli?
Se provi l’esempio “Hello word” della libreria LCD riesci a vedere tutto?
Ciao .
Si sta creando uno schizzo del data logger con questo scudo.
Sapete a quale sistema o utilizzati per abbinare il analogico e digitale in leonardo e questo scudo .
Voglio registrare sulla scheda SD e indicare il momento in cui , ma la HIGH o LOW del pulsante di piombo , potete dirmi uno schizzo .
Autore
Ciao Masami,
penso tu abbia tradotto la tua frase con un traduttore tipo google.
Non capisco la domanda, puoi scrivermela in inglese ?
Hello . Mauro Alfieri
I am sorry. I translated into English .
You are creating a sketch of the data logger using this shield .
Do you know to what system or use in digital in leonardo and this shield .
I want to record to an SD card (I / O) state and time when the HIGH or LOW of the power of the machine , but if you tell me the sketch .
And recorded on an SD card when there is a change in the machine
Example
2014/09/19 20:18:10 0000 0000 0100 0000 0000
2014/09/19 20:20:23 0000 0000 0000 0000 0100
2014/09/19 20:38:00 0000 0000 0100 0000 0000
Autore
Hi MASAMI,
in Leonardo the pin SDA and SCL is over the AREF pin.
I don’t write the sketch, you can read and learning my articles and use my sketch.
Hello . Mauro Alfieri
I tried to sketch on my own , but it is difficult .
[[ paste code is not possible ]]
Autore
Hi MASAMI,
not it’s possible paste the code in comments.
Please respect this rule.
Hi Mauro Alfieri
I am sorry. I did not observe the rules . I was not able to find the page of AREF. I study more . Thank you all!
ciao Mauro.
Posso collegare uno schermo LCD con protocollo I2C, o va ad interferire con il funzionamento della shield?
lo schermo lo collegherei ai pin SDA e SCL
Autore
Ciao Gianni,
ti ho già risposto in un altro articolo:
Se vuoi puoi connettere fino a 127 periferiche di tipo I2C a patto che possiedano indirizzi differenti.
Se non è un problema ti linko il codica da un sito esterno: http://pastebin.com/TA1qPymh
Il problema è che se ho la SD inserita, scrive i dati su sd ma non stampa i valori su LCD;
se NON ho la SD inserita invece scrive su LCD senza problemi.
Potresti aiutarmi a trovare ciò che non va?
Ho controllato le librerie utilizzate, e non mi pare utilizzino pin in comune
Autore
Ciao Gianni,
non sono così esperto da verificare e modificare codice di altri. Ti consiglio di scrivere all’autore per chiedere aiuto.
l’ho scritto io il codice, per questo chiedo aiuto a te
Autore
Ciao Gianni,
se hai scritto tu il codice saprai anche dove eseguire le modifiche.
Se non lo sai tu non so come possa aiutarti io.
ok, mi sono spiegato male.
Essendo un neofita, ho realizzato il codice prendendo spunto dai tuoi esempi.
Funziona in parte, ma non come vorrei.
Siccome non so in cosa consiste l’errore, ecco perchè chiedo consiglio a te 🙂
Mi sembrava brutto descriverlo come un “assemblaggio di tuoi codici”
Autore
Ciao Gianni, se hai usato dei miei codici avrai letto per ogni parte di cosa si occupa e dovresti riuscire a comprendere l’errore eseguendo una semplice analisi delle sequenza che hai copiato.
Se hai messo insieme codice, senza comprenderne il funzionamento, ti consiglio di ripartire con calma dall’inizio definendo prima di tutto il tuo obiettivo e la sequenza di passi che ti occorrono per ottenerlo.
l’errore non lo comprendo. suppongo che l’I2C dell’lcd e la SD entrino in conflitto tra loro,
ma non sono abbastanza esperto per risolvere tale problema
Autore
Ciao Gianni,
so per certo che la SD Card usa la comunicazione ed i pin SPI e non I2C per cui il problema potrebbe essere nelle librerie o nell’alimentazione.