Data logging con Arduino

Ieri ho dato libero sfogo alla fantasia ed alle conoscenze su Arduino ed ho montato il mio castello di shield per realizzare un data logging con Arduino

data logging shield

Il progetto in se non è complesso a meno di conoscere bene alcuni concetti quali comunicazione I2C ed SPI, infatti ho deciso di utilizzare una shield SD Card per scrivere i miei dati su una scheda SD da 64Gb, più che sufficienti per qualche line di log in un file di testo, ed un RTC per mantenere l’ora di acquisizione del log.

Procediamo con ordine partendo dal materiale necessario per il progetto di data logging con Arduino:

  • n.1 Arduino Uno
  • n.1 RTC Shield o altro RTC basato su DS1307
  • n.1 SD Card shield
  • n.5 pulsanti n.a. ( normalmente aperti )
  • n.5 resistenze da 330ohm
  • n.1 breadboard
  • qualche cavetto per i collegamenti

Definito il materiale devi tener presente che l’RTC utilizza come protocollo di comunicazione l’I2C Bus ossia i pin SDA ( pin A4 ) e SCL ( pin A5 ) di Arduino, alcune Shield hanno la possibilità di utilizzare i 2 pin aggiuntivi SDA ed SCl presenti sulla Arduino Uno R3, tuttavia questi pin sono connessi, a livello arduino, ai medesimi pin A4 ed A5, per cui gli ingressi Analogici corrispondenti non sono comunque utilizzabili.

La scield SD Card utilizza il bus SPI composto dai pin:

D13 SD_CLK
D12 SD_OUT
D11 SD_IN
D10 SD_CS

oltre ai 3.3v e Gnd, alcune SD card utilizzano come pin CS il pin 4, è il caso della Ethernet Shield ufficiale Arduino che oltre ai pin 13,12,11 usa il pin 4 come CS.

Il circuito data logging con Arduino

Per il collegamento delle shield arduino non dovresti averlo se utilizzi, come ho fatto io, le shield impilabili per realizzare il tuo data logging, le uniche connessioni da fare riguardano i 5 pulsanti che sono collegati come sempre attraverso una resistenza di pull-down ( verso Gnd ) da 330ohm.

I primi 4 pulsanti li utilizzi per simulare la variazione dei dati sugli ingressi A0,A1,A2 ed A3 mentre il quinto pulsante lo utilizzerai per indicare allo sketch che vuoi ricaricare e leggere il file presente sull’SD Card, lo chiamo infatti pulsante READ, ecco una foto dei pulsanti

data logging

e una delle connessioni agli ingressi analogici

data logging valori analogici

mentre il quinto pulsante ( Read ) devi collegarlo al pin 9 del data logging con arduino

data logging read

Funzionamento del data logging

Il data logging con arduino è un esperimento per cui ho deciso di utilizzare i 4 pulsanti per simulare il cambio di valori rilevati dall’ADC ( convertitore analogico digitale ) di Arduino, considera che ogni valore convertito dall’ADC sull’Arduino Uno può variare da 0 a 1023 ( 10bit ) e sarà 0 quando il pulsante non è premuto passando a 1023 quando premi uno dei pulsanti.

Il data logging scriverà contemporaneamente sul file di log e sul monitor seriale i dati raccolti dai 4 pin analogici oltre alla data e l’ora in cui il dato è stato raccolto.

Puoi sostituire ognuno dei 4 pulsanti con il sensore che ritieni più opportuno, ho utilizzato volutamente gli ingressi analogici per consentirti di poter rilevare 1024 livelli di segnale da ciascun pin, se avessi utilizzato i pin digitali avrei potuto solo rilevare il passaggio si stato da LOW ad HIGH e viceversa.

Download sketch del data logging

Puoi scaricare lo sketch e la libreria RTC che ho utilizzato per questo progetto direttamente da GitHub.

Lo sketch del data logging

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib

#include <Wire.h>
#include "RTClib.h"
#include <SD.h>

#define readButton 9
#define CS 10

RTC_DS1307 RTC;
char buffer[40];

File myFile;

void setup () {
    Serial.begin(57600);
    Serial.print("Initializing SD card...");
    pinMode(CS, OUTPUT);
    pinMode(readButton, INPUT);

    if (!SD.begin(CS)) {
      Serial.println("initialization failed!");
      return;
    }
    Serial.println("initialization done.");

    Wire.begin();
    RTC.begin();
    RTC.sqw(1);		//0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz
    if (! RTC.isrunning()) {
      Serial.println("RTC is NOT running!");
      // following line sets the RTC to the date & time this sketch was compiled
      RTC.adjust(DateTime(__DATE__, __TIME__));
    }
}

void loop () {
    DateTime now = RTC.now();

    sprintf(buffer,  "%02d/%02d/%d %02d:%02d:%02d %d %d %d %d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), analogRead( A0 ), analogRead( A1 ), analogRead( A2 ), analogRead( A3 ) );
    Serial.println( buffer );

    myFile = SD.open("dati.log", FILE_WRITE);
    if (myFile) {
      myFile.println(buffer);
      myFile.close();
    } else {
      Serial.println("error opening dati.log");
    }

    if ( digitalRead( readButton ) == HIGH ) {
        Serial.println(" ");
        Serial.println("Lettura Log Salvato ----------- ");
        Serial.println(" ");
        myFile = SD.open("dati.log");
        if (myFile) {
          while (myFile.available()) {
    	    Serial.write(myFile.read());
          }
          myFile.close();
        }
        delay( 5000 );
    }

    delay(1000);
}

lo sketch del data logging include sia le classi necessarie alla comunicazione con l’RTC sia quelle per utilizzare la SD Card shield:

linee 03-04: includi la classe Wire e la classe RTC per comunicare con il DS1307 attraverso il protocollo I2C;

linea 05: includi la classe SD per leggere e scrivere sulla SD Card con il protocollo SPI;

linee 07-08: definisci a quale pin hai collegato il pulsante che utilizzerai per rileggere il log del data logging e il pin di CS che la tua SD Card utilizza;

linea 10: inizializza l’oggetto RTC;

linea 11: definisci un buffer in cui memorizzerai il tempo ed i valori rilevati. Per calcolare la lunghezza del buffer puoi contare il numero massimo di caratteri che potrà contenere, sai che la data è formata da 10 caratteri ( gg/mm/aaaa ) e l’ora da 8 caratteri ( hh:mm:ss ) e che tra le due c’è uno spazio, poi sai che ogni valore sarà separato da uno spazio per consentirti di leggerli agevolmente e che il valore massimo rilevato su ciascun pin è 1023 ( 4 caratteri ) per cui il calcolo è: 10 + 1 + 8 + 1 + 4 + 1 + 4 + 1 + 4 + 1 +4 = 39 per cui puoi definire il buffer a 40 ( considerando un margine di 1 valore )

linee 16-17: imposta la comunicazione verso il monitor seriale a 57600 baud e scrivi sul monitor seriale la stringa “Inizializing SD card …”

linee 18-19: imposta la modalità di funzionamento per il pin CS ed il pin collegato al bottone di lettura ( pin 9 );

linee 21-24: inizializza l’oggetto SD con il metodo begin e passandole il valore del pin di CS, se non riesce ad inizializzare la SD Card scrive sul monitor seriale “inizialization failed” ed esce dalla funzione di setup mediante il comando return;

linee 27-34: inizializza l’oggetto Wire ed RTC, imposta a 1 secondo la frequenza di lampeggio del led SQW presente sulla RTC Shield e in caso di orario non configurato imposta l’ora corrente del Pc sull’RTC, per la procedura leggi l’articolo Tutorial: RTC Shield con DS1307;

linea 38: imposta un’istanza di tipo DateTime come RTC.now();

linea 40: componi la linea di buffer utilizzando il comando sprintf( buffer, formato, val1, val2 ….valn ) in cui buffer è la variabile in cui memorizzi l’intera stringa, il formato è quello del comando C sprintf ( vedi manuale ), ed i valori successivi sono quelli che vuoi inserire nel buffer;

linea 41: scrivi sul monitor seriale il valore di buffer;

linea 43: apri in modalità di scrittura il file “dati.log” sulla SD Card del data logging

linee 44-46: se il puntatore al file dati.log esiste, ossia se sei riuscito ad aprire la comunicazione con la SD inserita nella SD Card Shield scrivi la stringa buffer e chiudi il file;

linee 47-49: in caso di mancata apertura del file dati.log scrivi sul monitor seriale la stringa “error opening dati.log”;

linea 51: controlla che il valore rilevato sul pin buttonRead sia HIGH vuol dire che il pulsante connesso a questo pin è stato premuto;

linee 52-54: scrivi sul monitor seriale una riga vuota, la stringa “Lettura Log Salvato ————–” ed un’ulteriore riga vuota, serve solo per separare le linee scritte dal normale funzionamento da quelle lette dalla SD Card del data logging;

linea 55: apri il file dati.log in modalità di lettura, infatti non hai specificato alcun parametro come secondo argomento del metodo open;

linee 56-61: se il file è stato correttamente aperto leggi linea per linea il file di log e scrivi il risultato di ciascuna linea sul monitor seriale;

linea 62: imposta un ritardo da 5 secondi ( 5000 millisecondi ) prima di ritornare al normale funzionamento di log;

linea 65: imposta un ritardo di 1 secondo tra un ciclo della funzione loop() ed il successivo.

Il video del data logging con Arduino

Per mostrarti come funziona il data logging che hai appena realizzato puoi guardare il video che ho realizzato in fase di test con il mio data logging:

Buon Log !!!

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

Permanent link to this article: https://www.mauroalfieri.it/elettronica/data-logging-con-arduino.html

107 pings

Skip to comment form

  1. […] translate ideas into physical artifact, as practically demonstrated by Mauro, which shows on his blog how to build a simple data-logger by properly combining different shields. By using few additional […]

  2. […] translate ideas into physical artifact, as practically demonstrated by Mauro, which shows on his blog how to build a simple data-logger by properly combining different shields. By using few additional […]

  3. […] description complète d’un datalogger basé sur un arduino. Il est rare de voir un tel empilement de shields! Le programme, très simple, permet […]

  4. […] ed al suo lampeggio probabilmente avrai necessità di almeno una shield arduino, un esempio è il datalogger per realizzarlo ti occorre, oltre ad arduino, la RTC shield e la SD shield. Stesso discorso per un […]

  5. […] due progetti che puoi leggere su questo blog Datalogging con arduino e sensore DHT11 puoi realizzare il progetto: Datalogger arduino temperaura e […]

  6. […] translate ideas into physical artifact, as practically demonstrated by Mauro, which shows on his blog how to build a simple data-logger by properly combining different […]

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.