Un DataLogger con la mSD_Shield della Watterott

Tempo fa ho comprato due mSD_Shield dalla Watterott, versione 1. Hanno su una micro SD, un clock RTC e dovrebbero servire a costruirsi un semplice DataLogger, come quello di Adafruit. Per far funzionare questo Shield, consigliano di usare la libreria SDcard, che francamente trovo molto povera di esempi e spiegazioni. Alcuni esempi prevedono l'uso combinato della scheda con uno schermo LCD touch screen. Non ho trovato un esempio solo per un uso come DataLogger. Un esempio che ho provato a far girare e funziona è questo:

/*
  SaveFileDemo (Display + SD-Card)
 */

#include <MI0283QT2.h>
#include <SDcard.h>

MI0283QT2 lcd;
SDcard sd;


ISR(TIMER2_OVF_vect) //Timer 2 Interrupt, called every 1ms
{
  static uint8_t count=1;

  TCNT2 -= 250; //1000 Hz

  if(--count == 0) //100 Hz
  {
    count = 10;
    sd.service();
  }
}


void WriteFile(char *file)
{
  FIL fdst;     //file objects
  FRESULT res;  //result code
  UINT wr;      //file R/W count
  char data[16];

  res = f_open(&fdst, file, FA_CREATE_ALWAYS | FA_WRITE);
  if(res == FR_OK)
  {
    strcpy(data, "test 123");
    res = f_write(&fdst, data, strlen(data), &wr);
    f_close(&fdst);
    return;
  }

  Serial.println("Error!");
  lcd.drawTextPGM(5, 5, PSTR("Error!"), 1, RGB(0,0,0), RGB(255,255,255));
}


void setup()
{
  //init Serial port
  Serial.begin(9600); 
  while(!Serial); //wait for serial port to connect - needed for Leonardo only

  //init LCD
  Serial.println("Init Display...");
  lcd.init(4); //spi-clk = Fcpu/4
  lcd.led(60); //backlight 0...100%

  //init SD-Card
  Serial.println("Init SD-Card...");
  sd.init(4); //spi-clk = Fcpu/4

  //init Timer2 for SD service routine
  TCCR2B  = (1<<CS22); //clk=F_CPU/64
  TCNT2   = 0x00;
  TIMSK2 |= (1<<TOIE2); //enable overflow interupt
  
  //interrupts on
  sei();

  //clear screen
  lcd.clear(RGB(255,255,255));
  lcd.drawTextPGM(5, 5, PSTR("Mount card..."), 1, RGB(0,0,0), RGB(255,255,255));

  if(sd.mount() == 0)
  {
    Serial.println("Write file...");
    lcd.clear(RGB(0,255,0));
    lcd.drawTextPGM(5, 5, PSTR("Write file..."), 1, RGB(255,255,255), RGB(0,255,0));
    WriteFile("test_wr.txt");
    sd.unmount();
  }
  else
  {
    Serial.println("No card found!");
    lcd.clear(RGB(255,0,0));
    lcd.drawTextPGM(5, 5, PSTR("No card!"), 1, RGB(255,255,255), RGB(255,0,0));
  }
}


void loop()
{

}

Sebbene non capisco la funzione di alcune istruzioni come ISR(TIMER2.... che se tolgo fanno andare in errore lo sketch. Mentre le funzioni lcd... possono essere commentate visto che non uso lo schermo.

Sono istruzioni per gestire gli interrupt generati dall'overflow del timer 2 del microcontrollore. Nello sketch però non so che uso ne fanno, ma dai commenti pare che lo usino come temporizzatore.
Ma tu che devi fare esattamente?

io devo semplicemente farci un datalogger. Vale a dire, estrarre la data e l'ora dal DS1301 e scriverla assieme ai dati su un file della SDcard.

ma nel tuo blog dici di usare già un datalogger

Per registrare le temperature, ho usato un data-logger costruito con Arduino e lo Shield di Adafruit. Sulla scheda di memoria SD vengono registrate le 6 temperature ogni 10 s, assieme alla data e ora.

non puoi fare lo stesso?

Sdcard.h, SD.h alla fine devi semplicemente aprire il file e scrivere con write o leggere con read infine chiudere il file con close, ti costruisci la stringa con i parametri che vuoi e la scrivi, qualsiasi esempio di scrittura su SD ve bene.
Forse il tuo problema è estrarre i char da andare poi a salvare.

ciao

Il mio problema sta nell'uso delle librerie. Nel primo datalogger della Adafruit usavo la SDfat.h, nel secondo, la scheda di Watterott, si usa una SDcard, infine Arduino consiglia la SD. Oltre a questa confusione c'e' quella delle librerie che usano l'orologio. RTClib e' una, ma c'e' anche la DS1307. Quest'ultima per esempio, non ha le funzioni che restituiscono la UNIXtime, cioe' il numero di secondi a partire da una data fissa, utili per fare le operazioni tra date.
Comunque ho risolto, usando con la scheda Adafruit le sue librerie e con la Watterott le altre. Per la unixtime mi sono ricopiato nello sketch le funzioni presenti nella RTClib.

La mia lib swRTC gestisce anche i timestamp.
Inoltre ho uno scheduler software molto semplice, il looper, con cui puoi programmare l'esecuzione di compiti ad intervalli prefissati senza usare interrupt od altro, e sono lib compatibili fra loro, cioè puoi usare la swRTC in abbinamento alla looper. Se poi non vuoi usare RTC esterni ed hai dimestichezza con i chip standalone, l'ultima versione della swRTC permette anche l'uso del modulo Real-Time Counter interno al chip: collegando un quarzo da orologio (32,768 KHz) al 328, puoi avere il controllo orario senza altri integrati esterni.

Grazie Leo, scusa se rispondo solo ora