DIY CSV Datenlogger

¿Cómo evoluciona la temperatura a lo largo del día? Para registrar estos datos de forma fiable, lo ideal es utilizar un registrador de datos de fabricación propia basado en un microcontrolador. En este proyecto se utiliza un sensor DS18B20 para medir la temperatura. Los valores registrados se almacenan a intervalos regulares en formato CSV (valores separados por comas) en una tarjeta SD y, a continuación, pueden evaluarse.

Hardware

Para poder almacenar fácilmente los datos y transferirlos posteriormente al ordenador, lo más adecuado es utilizar una tarjeta SD. Esta se puede controlar mediante la interfaz SPI.

Con el siguiente hardware, la implementación es muy sencilla gracias al uso de un escudo:

Placa UNO (USB-C)

Escudo registrador de datos

Sensor (p. ej., DS18B20)

Resistencia de 4,7 kΩ (surtido de resistencias)

 

En el ejemplo utilizamos el sensor DS18B20. Este se controla y lee a través de la interfaz OneWire. Sin embargo, también puede utilizar cualquier otro sensores .

Suelde el sensor al escudo de la siguiente manera:

Figura 1: Sensor en el escudo del registrador de datos

Software

Sensor

Para comunicarse con el sensor se necesitan las siguientes bibliotecas externas:

OneWire de Paul Stoffregen

DallasTemperature de jmchippa

 

Pueden descargarse como archivo .zip a través de los enlaces indicados de GitHub e incluirse en el IDE de Arduino en
Sketch > include Library > Add .zip Library …

 

.
También puede instalar la biblioteca a través del gestor de bibliotecas integrado.

 

Para probar el sensor y la estructura superior, cargue el siguiente programa en el microcontrolador:

#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("Error: Could not read temperature data");
}
}

Explicación:

Al inicio del programa se crean los objetos de las clases de la biblioteca. El objeto oneWire regula la comunicación a través de la interfaz. El objeto sensor envía las órdenes exactas del sensor a través de esta interfaz, transferidas con un puntero.

 

Puede descargar el programa aquí .

RTC

El escudo cuenta con un módulo de reloj en tiempo real(RTC). Este se puede configurar y leer mediante la interfaz I2C. Una vez configurada la hora, esta se actualiza continuamente gracias a la pequeña batería, incluso sin alimentación eléctrica del microcontrolador.

 

Para comunicarse con el módulo RTC se necesita la siguiente biblioteca externa:

RTClib de Adafruit

 

Puede descargarlos como archivos .zip a través de los enlaces indicados de GitHub e incluirlos en el IDE de Arduino en
Sketch > include Library > Add .zip Library …

 

.
También puede instalar la biblioteca a través del gestor de bibliotecas integrado.

El siguiente programa se puede utilizar para ajustar la hora y probar la función:

 

#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 de agosto de 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);
}

Explicación:

Tras la integración habitual del archivo de biblioteca y la creación del objeto, en setup() se inicia la comunicación con el módulo RTC y, a continuación, se ajusta opcionalmente la hora actual.
Para poder ajustar esta hora, elimine el comentario y adapte la hora. Asegúrese de que esta línea vuelva a estar comentada, ya que de lo contrario la hora se sobrescribirá cada vez que se reinicie el sistema.

En loop() se muestran la hora y la fecha a través de la interfaz serie.

 

Puede descargar el código aquí .

Proceso del registrador de datos

Figura 2: Diagrama de flujo del programa del registrador de datos

Código del registrador de datos

Por último, cargue el programa completo en el microcontrolador:

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

const int CS_PIN_SD = 4; // Pin de selección del chip de la tarjeta SD
const char* BASE_FILENAME = "LOG"; // Nombre de archivo base, p. ej., 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++) { // Máximo 99999 archivos de registro
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("¡Se ha alcanzado el número máximo de archivos de registro!");
}

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

sensors .
begin();

pinMode(10, OUTPUT); // Necesario para SPI en 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 (); //
Crear un nuevo archivo de registro aliniciar
}

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

//
Log to SD Card
 
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);

}

Explicación:

En comparación con los dos programas anteriores, solo se ha añadido la salida a la tarjeta SD. La función createNewLogFile() crea un nuevo archivo cuyo nombre se numera automáticamente de forma consecutiva.

Evaluación de datos

Una vez que haya registrado correctamente una serie de mediciones con el registrador de datos, los valores se representarán gráficamente en una hoja de cálculo.
En este tutorial se utiliza LibreOffice Calc, ya que es de código abierto y está disponible de forma gratuita en todos los sistemas operativos. Sin embargo, todos los demás programas son similares en cuanto a su funcionamiento y manejo.

1. Copie el archivo .txt generado por el registrador de datos de la tarjeta SD al disco duro de su ordenador. A continuación, haga clic con el botón derecho del ratón en el archivo y seleccione «Renombrar»; aquí cambie la extensión del archivo de .txt a .csv.

2. Abra el archivo csv con el programa de hoja de cálculo. Se abrirá una ventana de diálogo en la que podrá seleccionar los símbolos de separación. Seleccione «coma» y, tras comprobar la vista previa en la parte inferior, confirme la importación con «Aceptar».

Figura 3: Ventana de importación

 

3. Dado que el microcontrolador muestra los valores del sensor con un punto como separador decimal, pero el programa espera una coma, ahora debe sustituirlo.
Para ello, abra el Buscar y reemplazar . Aquí puede sustituir todos los puntos por comas.

4. Ahora seleccione la columna con los milisegundos y los valores del sensor manteniendo pulsada la tecla Ctrl y haciendo clic en el nombre de la columna, y seleccione en Insertar, Diagrama...

5. En esta ventana puede seleccionar ahora el tipo de diagrama. Para una evolución del valor del sensor se recomienda el XY (diagrama de dispersión).

Figura 4: Ventana Gráfico

 

Aquí puede configurar el tipo de representación y el tipo de línea.

 

Figura 5: Gráfico final con valores medidos

 

Conclusión

El registrador de datos se puede ampliar con un botón y un LED para permitir indicaciones de estado y funciones de control sencillas, como el inicio y la parada.
Las posibilidades de aplicación se ofrecen sobre todo en la medición medioambiental, en la supervisión del clima interior o en escenarios similares en los que se deben registrar los valores de los sensores.
Con los pasos mostrados, ha conocido una base económica y flexible sobre la que puede desarrollar fácilmente sus propios proyectos.

 

Disfrute recreándolo :)

 

Für arduinoProjekte für anfängerSensorenTemperatur

Deja un comentario

Todos los comentarios son moderados antes de ser publicados