Datalogging adafruit rtc sd

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.

datalogging adafruit

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:

datalogging adafruit no 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:

datalogging adafruit

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:

datalogging adafruit rtc sd card

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:

datalogging adafruit pin

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:

datalogging adafruit test rtc

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:

dalogging adafruit sd card

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/datalogging-adafruit-rtc-sd.html

19 comments

Skip to comment form

    • Marco on 28 giugno 2014 at 23:10
    • Reply

    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

    1. Ciao Marco,
      altri testi riesci a visualizzarli?
      Se provi l’esempio “Hello word” della libreria LCD riesci a vedere tutto?

    • MASAMI on 18 settembre 2014 at 10:14
    • Reply

    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 .

    1. Ciao Masami,
      penso tu abbia tradotto la tua frase con un traduttore tipo google.
      Non capisco la domanda, puoi scrivermela in inglese ?

    • MASAMI on 19 settembre 2014 at 02:01
    • Reply

    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

    1. 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.

    • MASAMI on 19 settembre 2014 at 09:43
    • Reply

    Hello . Mauro Alfieri
    I tried to sketch on my own , but it is difficult .

    [[ paste code is not possible ]]

    1. Hi MASAMI,
      not it’s possible paste the code in comments.
      Please respect this rule.

        • MASAMI on 22 settembre 2014 at 02:06
        • Reply

        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!

    • Gianni on 24 dicembre 2015 at 21:58
    • Reply

    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

    1. 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.

      • Gianni on 2 gennaio 2016 at 09:50
      • Reply

      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

      1. Ciao Gianni,
        non sono così esperto da verificare e modificare codice di altri. Ti consiglio di scrivere all’autore per chiedere aiuto.

        • Gianni on 4 gennaio 2016 at 22:06
        • Reply

        l’ho scritto io il codice, per questo chiedo aiuto a te

        1. 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.

          • Gianni on 6 gennaio 2016 at 09:33
          • Reply

          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”

          1. 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.

            • Gianni on 7 gennaio 2016 at 20:45

            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

          2. 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.

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.