{"id":52213,"date":"2026-11-01T10:50:39","date_gmt":"2026-11-01T10:50:39","guid":{"rendered":"http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/"},"modified":"2026-11-01T10:50:39","modified_gmt":"2026-11-01T10:50:39","slug":"data-logger","status":"publish","type":"siratek_tutorial","link":"https:\/\/siratek.net\/index.php\/tutorials\/data-logger\/","title":{"rendered":"Project, a Standalone Data Logger"},"content":{"rendered":"<body><p><\/p>\n<h2>What you will build<\/h2>\n<p>A box you leave somewhere for a week. It records a temperature every minute with a real date and time against it, and when you come back the card opens in a spreadsheet and draws a graph.<\/p>\n<p>No laptop, no network, no watching. That is the whole point: this is the project that lets you find out what actually happened to the greenhouse overnight, or how cold the store room gets before dawn.<\/p>\n<p>It is also the project where <strong>the failures matter<\/strong>. A logger that stops on Tuesday and tells nobody has wasted a week, so a good part of this page is about noticing and surviving.<\/p>\n<h2>Before you begin<\/h2>\n<h3>Parts<\/h3>\n<table>\n<thead>\n<tr>\n<th>Part<\/th>\n<th>Siratek product<\/th>\n<th>Its own tutorial<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Arduino Uno<\/td>\n<td>2219<\/td>\n<td><em>Getting Started with Arduino Uno<\/em><\/td>\n<\/tr>\n<tr>\n<td>Micro SD card module<\/td>\n<td>6573<\/td>\n<td><em>Logging Data to an SD Card<\/em><\/td>\n<\/tr>\n<tr>\n<td>DS3231 real time clock<\/td>\n<td>2522<\/td>\n<td><em>Keeping Time with a DS3231<\/em><\/td>\n<\/tr>\n<tr>\n<td>DS18B20 waterproof probe<\/td>\n<td>49704<\/td>\n<td><em>Waterproof Temperature with DS18B20<\/em><\/td>\n<\/tr>\n<tr>\n<td>4.7 kilohm resistor<\/td>\n<td><\/td>\n<td>Required by the probe<\/td>\n<\/tr>\n<tr>\n<td>Micro SD card, 32 GB or smaller, FAT32<\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Breadboard and jumper wires<\/td>\n<td><\/td>\n<td><em>Using a Breadboard<\/em><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>What shares what<\/h3>\n<p>Three devices, three different ways of talking:<\/p>\n<table>\n<thead>\n<tr>\n<th>Device<\/th>\n<th>Bus<\/th>\n<th>Pins<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>SD card<\/td>\n<td>SPI<\/td>\n<td><code>D10<\/code> to <code>D13<\/code><\/td>\n<\/tr>\n<tr>\n<td>DS3231<\/td>\n<td>I2C<\/td>\n<td><code>A4<\/code>, <code>A5<\/code><\/td>\n<\/tr>\n<tr>\n<td>DS18B20<\/td>\n<td>1-Wire<\/td>\n<td><code>D2<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>They do not conflict, which is pleasant and worth noticing: SPI, I2C and 1-Wire are three separate arrangements and can all run at once. Between them they take six pins, leaving most of the board free.<\/p>\n<p>The DS3231 is at address 0x68. Nothing else here is on I2C, so there is no clash \u2014 but if you add an MPU-6050 later there will be, and <em>Keeping Time with a DS3231<\/em> explains the fix.<\/p>\n<h3>The power budget<\/h3>\n<table>\n<thead>\n<tr>\n<th>Part<\/th>\n<th>Typical<\/th>\n<th>Peak<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Uno<\/td>\n<td>50 mA<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>SD card<\/td>\n<td>a few mA idle<\/td>\n<td><strong>up to ~100 mA while writing<\/strong><\/td>\n<\/tr>\n<tr>\n<td>DS3231<\/td>\n<td>under 1 mA<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>DS18B20<\/td>\n<td>about 1 mA<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>On USB that is comfortable. The peak matters because a card write is exactly when a brownout is most damaging: a reset mid-write can leave the file system, not just the line, in a bad state.<\/p>\n<p>The sketch below opens, writes and closes the file every single line for that reason. It is slower, and at one reading a minute the speed is irrelevant.<\/p>\n<h3>Choosing the interval<\/h3>\n<p>Worth a moment\u2019s arithmetic before you start.<\/p>\n<table>\n<thead>\n<tr>\n<th>Interval<\/th>\n<th>Lines per day<\/th>\n<th>A week<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1 second<\/td>\n<td>86,400<\/td>\n<td>600,000<\/td>\n<\/tr>\n<tr>\n<td>1 minute<\/td>\n<td>1,440<\/td>\n<td>10,080<\/td>\n<\/tr>\n<tr>\n<td>10 minutes<\/td>\n<td>144<\/td>\n<td>1,008<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>A week at one minute is ten thousand lines, which is about 300 KB and opens instantly in a spreadsheet. A week at one second is six hundred thousand lines, which most spreadsheets will refuse or struggle with, and tells you nothing a minute\u2019s average would not.<\/p>\n<p><strong>One minute is the right default<\/strong> for temperature. Faster only if the thing you are measuring genuinely changes faster.<\/p>\n<h2>How it works<\/h2>\n<p>Four things happen, at three different rates:<\/p>\n<table>\n<thead>\n<tr>\n<th>Job<\/th>\n<th>How often<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Read the probe and the clock<\/td>\n<td>Every minute<\/td>\n<\/tr>\n<tr>\n<td>Write a line to the card<\/td>\n<td>Every minute<\/td>\n<\/tr>\n<tr>\n<td>Write a heartbeat line<\/td>\n<td>Every hour, whether or not anything changed<\/td>\n<\/tr>\n<tr>\n<td>Blink the LED<\/td>\n<td>Every reading<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The <strong>heartbeat<\/strong> is the part people leave out and then regret. A log that only records events cannot distinguish \u201cnothing happened\u201d from \u201cthe logger stopped\u201d. An hourly line, even an uninteresting one, means a gap in the file tells you exactly when something went wrong.<\/p>\n<h2>Pin reference<\/h2>\n<table>\n<thead>\n<tr>\n<th>Device<\/th>\n<th>Pin<\/th>\n<th>Connect to<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>SD module<\/td>\n<td><code>GND<\/code><\/td>\n<td>Uno <code>GND<\/code><\/td>\n<\/tr>\n<tr>\n<td>SD module<\/td>\n<td><code>VCC<\/code><\/td>\n<td>Uno <code>5V<\/code><\/td>\n<\/tr>\n<tr>\n<td>SD module<\/td>\n<td><code>MISO<\/code><\/td>\n<td>Uno <code>D12<\/code><\/td>\n<\/tr>\n<tr>\n<td>SD module<\/td>\n<td><code>MOSI<\/code><\/td>\n<td>Uno <code>D11<\/code><\/td>\n<\/tr>\n<tr>\n<td>SD module<\/td>\n<td><code>SCK<\/code><\/td>\n<td>Uno <code>D13<\/code><\/td>\n<\/tr>\n<tr>\n<td>SD module<\/td>\n<td><code>CS<\/code><\/td>\n<td>Uno <code>D10<\/code><\/td>\n<\/tr>\n<tr>\n<td>DS3231<\/td>\n<td><code>GND<\/code>, <code>VCC<\/code><\/td>\n<td>Uno <code>GND<\/code>, <code>5V<\/code><\/td>\n<\/tr>\n<tr>\n<td>DS3231<\/td>\n<td><code>SDA<\/code>, <code>SCL<\/code><\/td>\n<td>Uno <code>A4<\/code>, <code>A5<\/code><\/td>\n<\/tr>\n<tr>\n<td>DS18B20 red<\/td>\n<td>Uno <code>5V<\/code><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>DS18B20 black<\/td>\n<td>Uno <code>GND<\/code><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>DS18B20 yellow<\/td>\n<td>Uno <code>D2<\/code>, <strong>and 4.7 k to <code>5V<\/code><\/strong><\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<figure class=\"siratek-tutorial-figure\"><img decoding=\"async\" src=\"http:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/data-logger-wiring.svg\" alt=\"A logger with an SD card on SPI, a DS3231 clock on I2C and a DS18B20 probe on one wire, with the 4.7 kilohm pull-up the probe needs\" loading=\"lazy\"><figcaption>Three devices, three different buses, six pins. The 4.7 k pull-up is not supplied with the probe.<\/figcaption><\/figure>\n<h2>Build it in stages<\/h2>\n<h3>Stage 1: each part alone<\/h3>\n<p>Run the minimal example from each of the three component tutorials, one at a time. Specifically, confirm:<\/p>\n<ul>\n<li>The card initialises and lists its contents.<\/li>\n<li>The clock returns a sensible time, with <code>lostPower()<\/code> handled so it is not reset on every boot.<\/li>\n<li>The probe reports a device count of 1, not 0, and a plausible temperature.<\/li>\n<\/ul>\n<p>A device count of 0 means the 4.7 k resistor is missing. A <code>-127.00<\/code> means the same thing.<\/p>\n<h3>Stage 2: all three, to serial<\/h3>\n<p>Combine them with no card writing at all: read the clock and the probe once a minute and print a CSV line to the serial monitor.<\/p>\n<p>Watch it for five minutes. Then unplug the probe and watch what happens, because that is a rehearsal for the thing that will go wrong in the field.<\/p>\n<h3>Stage 3: write to the card<\/h3>\n<p>Add the file. The complete sketch below.<\/p>\n<h2>The complete sketch<\/h2>\n<pre><code>\/\/ Siratek: a standalone temperature logger.\n\/\/ Writes one CSV line a minute, with a real timestamp, and keeps going\n\/\/ when a part fails.\n\n#include &lt;SPI.h&gt;\n#include &lt;SD.h&gt;\n#include &lt;Wire.h&gt;\n#include &lt;RTClib.h&gt;\n#include &lt;OneWire.h&gt;\n#include &lt;DallasTemperature.h&gt;\n\nconst int chipSelect = 10;\nconst int ledPin = LED_BUILTIN;\nconst char* FILENAME = \"LOG.CSV\";          \/\/ 8.3 names only\n\nRTC_DS3231 rtc;\nOneWire oneWire(2);\nDallasTemperature probe(&amp;oneWire);\n\nconst unsigned long INTERVAL  = 60000UL;   \/\/ one minute\nconst unsigned long HEARTBEAT = 3600000UL; \/\/ one hour\n\nunsigned long lastReading = 0;\nunsigned long lastHeartbeat = 0;\n\nbool cardReady = false;\nbool clockReady = false;\n\nunsigned long linesWritten = 0;\nunsigned long writeFailures = 0;\n\nvoid setup() {\n  pinMode(ledPin, OUTPUT);\n  Serial.begin(9600);\n  Serial.println(F(\"Siratek: data logger starting.\"));\n\n  clockReady = rtc.begin();\n  if (!clockReady) {\n    Serial.println(F(\"  no clock: timestamps will be elapsed minutes\"));\n  } else if (rtc.lostPower()) {\n    Serial.println(F(\"  clock had lost power, setting from compile time\"));\n    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));\n  }\n\n  probe.begin();\n  Serial.print(F(\"  probes found: \"));\n  Serial.println(probe.getDeviceCount());\n  if (probe.getDeviceCount() == 0) {\n    Serial.println(F(\"  check the 4.7k between data and 5V\"));\n  }\n\n  cardReady = SD.begin(chipSelect);\n  if (!cardReady) {\n    Serial.println(F(\"  no card: logging disabled, serial only\"));\n  } else if (!SD.exists(FILENAME)) {\n    File f = SD.open(FILENAME, FILE_WRITE);\n    if (f) {\n      f.println(F(\"timestamp,temperature_c,note\"));\n      f.close();\n      Serial.println(F(\"  created LOG.CSV with a header\"));\n    }\n  }\n\n  \/\/ Take the first reading straight away rather than waiting a minute.\n  lastReading = millis() - INTERVAL;\n  lastHeartbeat = millis();\n}\n\n\/\/ Build a timestamp, or an elapsed count if the clock is missing.\nvoid appendTimestamp(String&amp; line) {\n  if (!clockReady) {\n    line += F(\"elapsed_\");\n    line += String(millis() \/ 60000UL);\n    return;\n  }\n\n  DateTime now = rtc.now();\n  char buf[20];\n  snprintf(buf, sizeof(buf), \"%04d-%02d-%02d %02d:%02d:%02d\",\n           now.year(), now.month(), now.day(),\n           now.hour(), now.minute(), now.second());\n  line += buf;\n}\n\nvoid writeLine(const String&amp; line) {\n  Serial.println(line);\n\n  if (!cardReady) {\n    return;\n  }\n\n  \/\/ Open, write, close, every time: a closed file survives a power cut.\n  File f = SD.open(FILENAME, FILE_WRITE);\n  if (f) {\n    f.println(line);\n    f.close();\n    linesWritten++;\n  } else {\n    writeFailures++;\n    Serial.println(F(\"  could not open the file\"));\n\n    \/\/ The card may have been removed. Try to pick it up again next time.\n    if (writeFailures &gt; 3) {\n      cardReady = SD.begin(chipSelect);\n      writeFailures = 0;\n    }\n  }\n}\n\nvoid takeReading() {\n  digitalWrite(ledPin, HIGH);\n\n  probe.requestTemperatures();\n  float c = probe.getTempCByIndex(0);\n\n  String line = \"\";\n  appendTimestamp(line);\n  line += \",\";\n\n  if (c == DEVICE_DISCONNECTED_C) {\n    line += \",probe not responding\";\n  } else {\n    line += String(c, 1);\n    line += \",\";\n  }\n\n  writeLine(line);\n  digitalWrite(ledPin, LOW);\n}\n\nvoid heartbeat() {\n  String line = \"\";\n  appendTimestamp(line);\n  line += \",,alive: \";\n  line += String(linesWritten);\n  line += \" lines\";\n  writeLine(line);\n}\n\nvoid loop() {\n  if (millis() - lastReading &gt;= INTERVAL) {\n    lastReading = millis();\n    takeReading();\n  }\n\n  if (millis() - lastHeartbeat &gt;= HEARTBEAT) {\n    lastHeartbeat = millis();\n    heartbeat();\n  }\n}<\/code><\/pre>\n<h3>Four decisions that make this a logger rather than a demonstration<\/h3>\n<p><strong>It runs without any of its parts.<\/strong> No card, it logs to serial. No clock, it timestamps with elapsed minutes. No probe, it writes a line saying so. A logger that refuses to start because one thing is missing has thrown away everything else it could have recorded.<\/p>\n<p><strong>The probe failure is recorded, not skipped.<\/strong> A missing line is ambiguous; a line saying \u201cprobe not responding\u201d is evidence. When you open the file in a week, the difference matters.<\/p>\n<p><strong>It tries to recover the card.<\/strong> Three failures in a row and it calls <code>SD.begin()<\/code> again, which picks up a card that was removed and put back, or one that glitched. It is four lines and it turns a permanent failure into a gap.<\/p>\n<p><strong>The heartbeat proves it is alive.<\/strong> An hourly line means a gap in the file has a start time and an end time. Without it you know only that the file stops.<\/p>\n<h3>A note on <code>String<\/code><\/h3>\n<p>This sketch uses <code>String<\/code> to build each line, and at one line a minute that is fine: the heap has time to settle between allocations.<\/p>\n<p>If you log every second, replace it with <code>snprintf()<\/code> into a fixed <code>char<\/code> buffer. <em>Logging Data to an SD Card<\/em> explains why, and the symptom of ignoring it is a sketch that runs for hours and then freezes.<\/p>\n<h2>Testing it<\/h2>\n<p>Before leaving it anywhere, do these five. Each one rehearses a real failure.<\/p>\n<table>\n<thead>\n<tr>\n<th>Try this<\/th>\n<th>It should<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Run it for five minutes<\/td>\n<td>Five lines, a minute apart, with sensible times<\/td>\n<\/tr>\n<tr>\n<td>Pull the probe out<\/td>\n<td>Keep logging, with \u201cprobe not responding\u201d<\/td>\n<\/tr>\n<tr>\n<td>Put the probe back<\/td>\n<td>Resume recording temperatures<\/td>\n<\/tr>\n<tr>\n<td>Pull the card out and put it back<\/td>\n<td>Report failures, then recover within a few minutes<\/td>\n<\/tr>\n<tr>\n<td>Unplug the power mid-run<\/td>\n<td>On restart, continue appending to the same file<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The last is the important one. Unplug it, plug it back in, and open the card: the header should appear once, not twice, and the earlier lines should still be there.<\/p>\n<p>Then take the card to a computer, open <code>LOG.CSV<\/code> in a spreadsheet, and chart the temperature column. That is the project working.<\/p>\n<h2>Making it yours<\/h2>\n<ul>\n<li><strong>More sensors.<\/strong> A second DS18B20 on the same pin and the same resistor, which is the whole point of 1-Wire. Add a column per probe.<\/li>\n<li><strong>Humidity.<\/strong> A DHT22 on a spare pin. The weather station project has the reading code.<\/li>\n<li><strong>Run it on batteries.<\/strong> This is the real upgrade, and it leads straight to <em>Running an ATmega328P Without the Board<\/em>: the Uno\u2019s regulator and USB chip draw far more than the logging does. A bare chip asleep between readings runs for months.<\/li>\n<li><strong>A display.<\/strong> An OLED showing the current reading and the line count, so you can tell at a glance that it is working without pulling the card.<\/li>\n<li><strong>A watchdog.<\/strong> <em>Making a Project Survive Unattended<\/em> covers it, and this is exactly the kind of project it exists for.<\/li>\n<\/ul>\n<h2>Troubleshooting<\/h2>\n<table>\n<thead>\n<tr>\n<th>Symptom<\/th>\n<th>Likely cause<\/th>\n<th>Check or fix<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Card will not initialise<\/td>\n<td>Too large, or not FAT32<\/td>\n<td>32 GB or smaller, FAT32<\/td>\n<\/tr>\n<tr>\n<td>Card fails intermittently<\/td>\n<td>Long jumper leads, or a cheap card<\/td>\n<td>Shorten them; try another card<\/td>\n<\/tr>\n<tr>\n<td>File never appears<\/td>\n<td>Filename longer than 8.3<\/td>\n<td><code>LOG.CSV<\/code>, not <code>templog.csv<\/code><\/td>\n<\/tr>\n<tr>\n<td>Header appears twice<\/td>\n<td>Written unconditionally<\/td>\n<td>Guard it with <code>SD.exists()<\/code><\/td>\n<\/tr>\n<tr>\n<td>Temperature reads -127<\/td>\n<td>No 4.7 k pull-up<\/td>\n<td>Between the data wire and <code>5V<\/code><\/td>\n<\/tr>\n<tr>\n<td>Probe count is 0<\/td>\n<td>Same cause<\/td>\n<td>Fit the resistor<\/td>\n<\/tr>\n<tr>\n<td>Timestamps all identical<\/td>\n<td>Clock not set<\/td>\n<td>Check <code>lostPower()<\/code> handling<\/td>\n<\/tr>\n<tr>\n<td>Timestamps reset on every boot<\/td>\n<td><code>adjust()<\/code> called unconditionally<\/td>\n<td>Guard it with <code>lostPower()<\/code><\/td>\n<\/tr>\n<tr>\n<td>Timestamps say <code>elapsed_<\/code><\/td>\n<td>Clock not found<\/td>\n<td>Scan the bus; expect 0x68<\/td>\n<\/tr>\n<tr>\n<td>File corrupted after a power cut<\/td>\n<td>File left open<\/td>\n<td>Open, write, close each line<\/td>\n<\/tr>\n<tr>\n<td>Logger stopped and you cannot tell when<\/td>\n<td>No heartbeat<\/td>\n<td>An hourly line gives you the gap<\/td>\n<\/tr>\n<tr>\n<td>Runs for hours then freezes<\/td>\n<td><code>String<\/code> fragmenting the heap<\/td>\n<td><code>snprintf()<\/code> into a fixed buffer<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Sources and attribution<\/h2>\n<p>All text, wiring guidance and code in this project are original Siratek work.<\/p>\n<ul>\n<li>Component behaviour is as described in <em>Logging Data to an SD Card<\/em>, <em>Keeping Time with a DS3231<\/em> and <em>Waterproof Temperature with DS18B20<\/em>, including the 8.3 filename limit, the <code>lostPower()<\/code> behaviour and the probe\u2019s required pull-up resistor.<\/li>\n<\/ul>\n<p>Current figures are typical and vary with the card. No third-party tutorial text, diagrams, photographs or code has been reproduced here.<\/p>\n<p><\/p>\n<\/body>","protected":false},"excerpt":{"rendered":"<p>A box you leave somewhere for a week. It records a temperature every minute with a real date and time against it, and when you come back the card opens in a spreadsheet and draws a graph.<\/p>\n","protected":false},"featured_media":0,"template":"","siratek_tutorial_level":[],"class_list":["post-52213","siratek_tutorial","type-siratek_tutorial","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Project, a Standalone Data Logger - siratek<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Project, a Standalone Data Logger - siratek\" \/>\n<meta property=\"og:description\" content=\"A box you leave somewhere for a week. It records a temperature every minute with a real date and time against it, and when you come back the card opens in a spreadsheet and draws a graph.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/\" \/>\n<meta property=\"og:site_name\" content=\"siratek\" \/>\n<meta property=\"og:image\" content=\"http:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/data-logger-wiring.svg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/data-logger\\\/\",\"url\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/data-logger\\\/\",\"name\":\"Project, a Standalone Data Logger - siratek\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/siratek.net\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/data-logger\\\/#primaryimage\"},\"image\":{\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/data-logger\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/siratek.net\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/data-logger-wiring.svg\",\"datePublished\":\"2026-11-01T10:50:39+00:00\",\"breadcrumb\":{\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/data-logger\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/data-logger\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/data-logger\\\/#primaryimage\",\"url\":\"https:\\\/\\\/siratek.net\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/data-logger-wiring.svg\",\"contentUrl\":\"https:\\\/\\\/siratek.net\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/data-logger-wiring.svg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/data-logger\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/siratek.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorials\",\"item\":\"https:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Project, a Standalone Data Logger\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/siratek.net\\\/#website\",\"url\":\"https:\\\/\\\/siratek.net\\\/\",\"name\":\"siratek\",\"description\":\"Your Best Electronic Retail Shop\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/siratek.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Project, a Standalone Data Logger - siratek","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/","og_locale":"en_US","og_type":"article","og_title":"Project, a Standalone Data Logger - siratek","og_description":"A box you leave somewhere for a week. It records a temperature every minute with a real date and time against it, and when you come back the card opens in a spreadsheet and draws a graph.","og_url":"http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/","og_site_name":"siratek","og_image":[{"url":"http:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/data-logger-wiring.svg","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/","url":"http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/","name":"Project, a Standalone Data Logger - siratek","isPartOf":{"@id":"https:\/\/siratek.net\/#website"},"primaryImageOfPage":{"@id":"http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/#primaryimage"},"image":{"@id":"http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/#primaryimage"},"thumbnailUrl":"http:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/data-logger-wiring.svg","datePublished":"2026-11-01T10:50:39+00:00","breadcrumb":{"@id":"http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/#primaryimage","url":"https:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/data-logger-wiring.svg","contentUrl":"https:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/data-logger-wiring.svg"},{"@type":"BreadcrumbList","@id":"http:\/\/siratek.net\/index.php\/tutorials\/data-logger\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/siratek.net\/"},{"@type":"ListItem","position":2,"name":"Tutorials","item":"https:\/\/siratek.net\/index.php\/tutorials\/"},{"@type":"ListItem","position":3,"name":"Project, a Standalone Data Logger"}]},{"@type":"WebSite","@id":"https:\/\/siratek.net\/#website","url":"https:\/\/siratek.net\/","name":"siratek","description":"Your Best Electronic Retail Shop","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/siratek.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/siratek_tutorial\/52213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/siratek_tutorial"}],"about":[{"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/types\/siratek_tutorial"}],"version-history":[{"count":0,"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/siratek_tutorial\/52213\/revisions"}],"wp:attachment":[{"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/media?parent=52213"}],"wp:term":[{"taxonomy":"siratek_tutorial_level","embeddable":true,"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/siratek_tutorial_level?post=52213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}