DIY CSV Datenlogger

Hoe ontwikkelt de temperatuur zich gedurende de dag? Om deze gegevens betrouwbaar te registreren, is een zelfgebouwde datalogger op basis van een microcontroller een goede keuze. In dit project wordt een DS18B20-sensor gebruikt om de temperatuur te meten. De geregistreerde waarden worden met regelmatige tussenpozen in CSV-formaat (Comma Separated Values) op een SD-kaart opgeslagen en kunnen vervolgens worden geëvalueerd.

Hardware

Om de gegevens eenvoudig op te slaan en vervolgens naar de computer over te brengen, is een SD-kaart ideaal. Deze kan worden aangestuurd via de SPI-interface.

Met de volgende hardware is de implementatie, door het gebruik van een shield, heel eenvoudig:

UNO-kaart (USB-C)

Datalogger-shield

Sensor (bijv. DS18B20)

weerstand 4,7 kΩ (Assortiment weerstanden)

 

In het voorbeeld gebruiken we de DS18B20-sensor. Deze wordt aangestuurd en uitgelezen via de OneWire-interface. U kunt echter ook andere willekeurige sensoren gebruiken.

Soldeer de sensor als volgt op het shield:

Afbeelding 1: Sensor op het datalogger-shield

Software

Sensor

Om met de sensor te communiceren zijn de volgende externe bibliotheken nodig:

OneWire van Paul Stoffregen

DallasTemperature door jmchippa

 

Deze kunnen via de opgegeven links van GitHub als .zip worden gedownload en in de Arduino IDE worden toegevoegd onder
Sketch > include Library > Add .zip Library …

 

.
Als alternatief kunt u de bibliotheek ook installeren via het geïntegreerde bibliotheekbeheer.

 

Om de sensor en de bovenste opbouw te testen, laadt u het volgende programma op de microcontroller:

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

Uitleg:

Aan het begin van het programma worden de objecten van de bibliotheekklassen aangemaakt. Het oneWire-object regelt de communicatie via de interface. Het sensor-object verzendt de exacte commando's van de sensor via deze interface, die met een pointer wordt doorgegeven.

 

U kunt het programma hier downloaden.

RTC

Op het shield bevindt zich een Real Time Clock-module(RTC). Deze kan via de I2C-interface worden ingesteld en uitgelezen. Als de tijd eenmaal is geconfigureerd, wordt deze continu bijgewerkt door de kleine batterij, zelfs zonder stroomvoorziening van de microcontroller.

 

Om met de RTC-module te communiceren, is de volgende externe bibliotheek nodig:

RTClib van Adafruit

 

Deze kunt u via de opgegeven links van GitHub als .zip downloaden en in de Arduino IDE onder
Sketch > include Library > Add .zip Library …

 

.
Als alternatief kunt u de bibliotheek ook installeren via het geïntegreerde bibliotheekbeheer.

Het volgende programma kan worden gebruikt om de tijd in te stellen en de functie te testen:

 

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

Uitleg:

Na het gebruikelijke integreren van het bibliotheekbestand en het aanmaken van het object, volgt in setup() het starten van de communicatie met de RTC-module en vervolgens optioneel het instellen van de huidige tijd.
Om deze tijd in te stellen, verwijdert u de opmerking en past u de tijd aan. Zorg ervoor dat deze regel daarna weer wordt becommentarieerd, anders wordt de tijd bij elke opstart overschreven.

In loop() worden de tijd en de datum via de seriële interface weergegeven.

 

U kunt de code hier downloaden.

Werking van de datalogger

Afbeelding 2: Stroomdiagram van het dataloggerprogramma

Dataloggercode

Laad ten slotte het volledige programma naar de microcontroller:

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

const int CS_PIN_SD = 4; // SD Card Chip Select Pin
const char* BASE_FILENAME = "LOG"; // Basisbestandsnaam, bijv. 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 logbestanden
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!" );
}
return;
}
}
Serial.println("Max log files reached!");
}

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

sensors .
begin();

pinMode(10, OUTPUT); // Vereist voor SPI op 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 (); //
Maak een nieuw logbestand bij het opstarten
}

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

}

Uitleg:

In vergelijking met de twee vorige programma's is alleen de uitvoer naar de SD-kaart toegevoegd. De functie createNewLogFile() maakt daarbij een nieuw bestand aan waarvan de naam automatisch doorlopend wordt genummerd.

Gegevensanalyse

Nadat u een reeks metingen met succes hebt geregistreerd met de datalogger, moeten de waarden nu grafisch worden weergegeven in een spreadsheetprogramma.
In deze tutorial wordt LibreOffice Calc gebruikt, omdat dit programma open source is en gratis beschikbaar is voor alle besturingssystemen. Alle andere programma's zijn echter vergelijkbaar wat betreft de werking en bediening.

1. Kopieer het .txt-bestand dat door de datalogger is gegenereerd van de SD-kaart naar de harde schijf van uw computer. Klik vervolgens met de rechtermuisknop op het bestand en selecteer "hernoemen". Wijzig hier de bestandsextensie van .txt in .csv.

2. Open het csv-bestand met het spreadsheetprogramma. Er wordt een dialoogvenster geopend waarin u de scheidingstekens kunt selecteren. Selecteer hier "komma" en bevestig de import, na controle van het voorbeeld onderaan, met OK.

Afbeelding 3: Importvenster

 

3. Aangezien de microcontroller de sensorwaarden met een punt als decimaalteken uitvoert, maar het programma een komma verwacht, moet u dit nu vervangen.
Open hiervoor met de toetsencombinatie Ctrl+Alt+F het Zoeken en vervangen . Hier kunt u alle punten vervangen door komma's.

4. Selecteer nu de kolom met de milliseconden en de sensorwaarden door de Ctrl-toets ingedrukt te houden en op de kolomnaam te klikken, en selecteer onder Invoegen, Diagram…

5. In dit venster kunt u nu het diagramtype selecteren. Voor een sensorwaardeverloop wordt hier de XY (spreidingsdiagram) aanbevolen.

Afbeelding 4: Diagramvenster

 

Hier kunt u nog het weergavetype en het lijntype instellen.

 

Afbeelding 5: Definitief diagram met meetwaarden

 

Conclusie

De datalogger kan nog worden uitgebreid met een knop en een LED om statusweergaven en eenvoudige besturingsfuncties zoals starten en stoppen mogelijk te maken.
Toepassingsmogelijkheden zijn er vooral in milieumetingen, bij het bewaken van het binnenklimaat of in soortgelijke scenario's waarin sensorwaarden moeten worden geregistreerd.
Met de getoonde stappen hebt u kennisgemaakt met een voordelige en flexibele basis waarop u eenvoudig uw eigen projecten kunt bouwen.

 

Veel plezier met het namaken :)

 

Für arduinoProjekte für anfängerSensorenTemperatur

Laat een reactie achter

Alle opmerkingen worden voor publicatie gecontroleerd door een moderator

Aanbevolen blogberichten

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery