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

Prima di inserire un commento, per favore, leggi il regolamento

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

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.