DIY CSV Datenlogger - AZ-Delivery

Come varia la temperatura nel corso della giornata? Per registrare questi dati in modo affidabile, è possibile utilizzare un data logger autocostruito basato su un microcontrollore. In questo progetto viene utilizzato un sensore DS18B20 per misurare la temperatura. I valori registrati vengono salvati a intervalli regolari in formato CSV (Comma Separated Values) su una scheda SD e possono quindi essere analizzati.

Hardware

Per salvare facilmente i dati e trasferirli successivamente al computer, è consigliabile utilizzare una scheda SD. Questa può essere controllata tramite l'interfaccia SPI.

Con il seguente hardware, l'implementazione è molto semplice grazie all'uso di uno shield:

Scheda UNO (USB-C)

Shield per data logger

Sensore (ad es. DS18B20)

Resistenza 4,7kΩ (Assortimento di resistenze)

 

Nell'esempio utilizziamo il sensore DS18B20. Questo viene controllato e letto tramite l'interfaccia OneWire. È tuttavia possibile utilizzare anche altri sensori a scelta altri sensori .

Saldare il sensore allo shield come segue:

Figura 1: Sensore sullo shield del data logger

Software

Sensore

Per comunicare con il sensore sono necessarie le seguenti librerie esterne:

OneWire di Paul Stoffregen

DallasTemperature di jmchippa

 

Questi possono essere scaricati come file .zip dai link indicati su GitHub e aggiunti all'IDE Arduino in
Sketch > include Library > Add .zip Library …

 

.
In alternativa, è possibile installare la libreria anche tramite la gestione librerie integrata.

 

Per testare il sensore e la struttura superiore, caricare il seguente programma sul microcontrollore:

#include
#include

#define BUS_PIN 7

OneWire oneWire(BUS_PIN);

DallasTemperature sensor(&oneWire);

void setup(void) {
Serial.begin(9600);
sensor .
begin();
}

void loop(void) {
sensor .requestTemperatures();
delay(1500);
 
float tempC = sensor.getTempCByIndex(0);

if (tempC != DEVICE_DISCONNECTED_C) {
Serial.print("Temperature: ");
Serial.println(tempC);
}
<
span lang="de"> style="font-family: Consolas; mso-fareast-font-family: Consolas; mso-bidi-font-family: Consolas; color: #d35400;">else {
Serial.println("Errore: impossibile leggere i dati relativi alla temperatura");
}
}

Spiegazione:

All'inizio del programma vengono creati gli oggetti delle classi della libreria. L'oggetto oneWire regola la comunicazione tramite l'interfaccia. L'oggetto sensor invia i comandi precisi del sensore tramite questa interfaccia, trasferita con un puntatore.

 

Il programma può essere qui .

RTC

Sullo shield è presente un modulo Real Time Clock(RTC). Questo può essere impostato e letto tramite l'interfaccia I2C. Una volta configurata l'ora, questa viene aggiornata continuamente dalla piccola batteria, anche senza alimentazione del microcontrollore.

 

Per comunicare con il modulo RTC è necessaria la seguente libreria esterna:

RTClib di Adafruit

 

Questi possono essere scaricati come file .zip dai link indicati su GitHub e aggiunti all'IDE Arduino in
Sketch > include Library > Add .zip Library …

 

.
In alternativa, è possibile installare la libreria anche tramite la gestione librerie integrata.

Il seguente programma può essere utilizzato per impostare l'ora e testare la funzione:

 

#include "Wire.h"
#include "RTClib.h"

RTC_DS1307 rtc;

void setup () {
Serial.begin(9600);

if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
   
while (1) delay(10);
}

if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
// 17 agosto 2025 3 :5:0 :
   
// rtc.adjust(DateTime(2025, 8, 17, 3, 5, 0));
}


}

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();

delay(3000);
}

Spiegazione:

Dopo la consueta integrazione del file di libreria e la creazione dell'oggetto, in setup() viene avviata la comunicazione con il modulo RTC e successivamente, facoltativamente, viene impostata l'ora corrente.
Per poter impostare l'ora, rimuovere il commento e modificare l'ora. Assicurarsi che questa riga sia nuovamente commentata, altrimenti l'ora verrà sovrascritta ad ogni avvio.

In loop() l'ora e la data vengono visualizzate tramite l'interfaccia seriale.

 

Il codice è disponibile scaricare qui .

Procedura Data logger

Figura 2: Diagramma di flusso del programma del data logger

Codice del registratore dati

Infine, caricare il programma completo sul microcontrollore:

#include
#include "Wire.h"
#
include
#include
#include
#include "RTClib.h"

const int CS_PIN_SD = 4; // Pin di selezione chip scheda SD
const char* BASE_FILENAME = "LOG"; // Nome file di base, ad es. LOG00.CSV
const char* FILE_EXTENSION = ".txt";

#define ONE_WIRE_BUS 7

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
RTC_DS1307 rtc;

float temperatureAmbient = 0.0;

unsigned long lastLogTime = 0;
const unsigned long LOG_INTERVAL_MS = 2500;

char tempAStr[10];
char logFileName[13]; // LOG00000 .txt
char timeStr[6];

void createNewLogFile() {
for (int i = 0; i < 100000; i++) { // Max 99999 log files
sprintf (logFileName,
"%s%05d%s", BASE_FILENAME, i, FILE_EXTENSION);
   
if (!SD.exists(logFileName)) {
File logFile = SD.open(logFileName, FILE_WRITE);
if (logFile) {
logFile .
println("Header:");
        logFile.
close();
Serial.print("Created new log file: ");
Serial.println(logFileName);
}
else {
Serial.println("Error creating new log file!" );
}
yes;">
return;
}
}
Serial.println("Max log files reached!");
}

void setup() {
Serial.begin(9600);

sensors .
begin();

pinMode(10, OUTPUT); // Required for SPI on UNO
 
if (!SD.begin(CS_PIN_SD)) {
Serial.println("SD Card Failed!");
   
while(1) {
}

} else {
Serial.println("SD Card OK.");

}

if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1) delay(10);
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
//
August 17, 2025 3 :5:0 :
   
// rtc.adjust(DateTime(2025, 8, 17, 3, 5, 0));
}

createNewLogFile (); //
Crea un nuovo file di logall'avvio
}

void loop() {
unsigned long currentMillis = millis();

sensors .requestTemperatures();
//delay
(1500);
  temperatureAmbient = sensors.getTempCByIndex(
0);
DateTime now = rtc.now();

Serial.println(temperatureAmbient);

dtostrf (temperatureAmbient,
0, 1, tempAStr);
  sprintf(timeStr,
"%02d:%02d", now.hour(), now.minute());

//
Registra su scheda SD
 
if (currentMillis - lastLogTime >= LOG_INTERVAL_MS) {
digitalWrite(3,HIGH);
    lastLogTime = currentMillis;

File logFile = SD.open(logFileName, FILE_WRITE);
if (logFile) {
logFile .
print(currentMillis);
logFile .
print(",");
logFile .
print(now.timestamp());
logFile .
print(",");
logFile .
print(timeStr);
logFile .
print(",");
logFile .
print(tempAStr);
      logFile.
println();

logFile .
close();
Serial.println("Data logged to SD.");
}
else {
Serial.println("Error opening log file!");
}
}

delay(100);

}

Spiegazione:

Rispetto ai due programmi precedenti, è stata aggiunta solo l'uscita sulla scheda SD. La funzione createNewLogFile() crea un nuovo file il cui nome viene numerato automaticamente in modo progressivo.

Analisi dei dati

Dopo aver registrato con successo una serie di misurazioni con il data logger, i valori devono ora essere rappresentati graficamente in un programma di foglio elettronico.
In questo tutorial viene utilizzato LibreOffice Calc, poiché è open source e disponibile gratuitamente su tutti i sistemi operativi. Tutti gli altri programmi sono simili in termini di funzionamento e utilizzo.

1. Copiate il file .txt generato dal data logger dalla scheda SD al disco rigido del vostro computer. Quindi fate clic con il tasto destro del mouse sul file e selezionate "Rinomina", qui cambiate l'estensione del file da .txt a .csv.

2. Aprire il file csv con il programma di foglio elettronico. Si aprirà una finestra di dialogo in cui è possibile selezionare i simboli di separazione. Selezionare "Virgola" e confermare l'importazione, dopo aver verificato l'anteprima in basso, con OK.

Figura 3: Finestra di importazione

 

3. Poiché il microcontrollore emette i valori del sensore con un punto come separatore decimale, ma il programma si aspetta una virgola, è necessario sostituirlo.
A tal fine, aprire il Cerca e sostituisci . Qui è possibile sostituire tutti i punti con delle virgole.

4. Selezionare ora la colonna con i millisecondi e i valori del sensore tenendo premuto il tasto Ctrl e cliccando sul nome della colonna, quindi selezionare Inserisci, Diagramma...

5. In questa finestra è ora possibile selezionare il tipo di diagramma. In questo caso, per un andamento del valore del sensore, si consiglia di utilizzare il diagramma XY (diagramma a dispersione).

Figura 4: Finestra del grafico

 

Qui è possibile impostare il tipo di rappresentazione e il tipo di linea.

 

Figura 5: Grafico finale con valori misurati

 

Conclusione

Il data logger può essere ampliato con un pulsante e un LED per consentire la visualizzazione dello stato e semplici funzioni di controllo come l'avvio e l'arresto.
Le possibilità di impiego si offrono soprattutto nella misurazione ambientale, nel monitoraggio del clima interno o in scenari simili in cui è necessario registrare i valori dei sensori.
Con i passaggi illustrati avete imparato a conoscere una base economica e flessibile su cui è possibile costruire facilmente i propri progetti.

 

Buon divertimento con la riproduzione :)

 

Für arduinoProjekte für anfängerSensorenTemperatur

1 commento

Eric LE GUENIC

Eric LE GUENIC

Beau program

Lascia un commento

Tutti i commenti vengono moderati prima della pubblicazione