Jan 16

Print this Post

Data logging con Arduino

Yesterday I gave free rein to the imagination and knowledge of Arduino and I put my castle shield to make a data logger with Arduino

data logging shield

The project itself is not complex unless they have some good concepts such as I2C and SPI, In fact, I decided to use a shield SD card to write my data to an SD card 64Gb, more than sufficient for any line of the log in a text file, and an RTC to maintain the capture of the log.

Proceed in order starting from the material needed for the project data logging with the Arduino:

  • 1 Arduino Uno
  • 1 RTC Shield or another based on DS1307 RTC
  • n.1 SD Card shield
  • n.5 pulsanti n.a. ( normally open )
  • # 5 330ohm resistors
  • n.1 breadboard
  • some cable for connections

Called the material you need to keep in mind that the RTC used as the I2C bus communication protocol that is the SDA pin ( pin A4 ) e SCL ( pin A5 ) Arduino, Shield some have the possibility to use the 2 additional pins SDA and SCl present on the Arduino Uno R3, However, these pins are connected, at Arduino, ALS medesimi pings ed A4 A5, for which the corresponding Analog inputs are not still usable.

The scield SD card using the SPI bus consists of the pins:


in addition to 3.3v and Gnd, Some SD cards used as the CS pin pin 4, is the case of the official Ethernet Shield Arduino that in addition to the pins 13,12,11 use the pin 4 come CS.

The circuit data logging with the Arduino

To connect the Arduino shield, you should not use it if, as I did, the stacking shield to make your data logging, the only connections to do concern the 5 buttons that are connected as always through a pull-down ( verso Gnd ) da 330ohm.

I received 4 buttons you use them to simulate the variation in the data inputs A0, A1, A2 and A3 and the fifth button will use it to refer to the sketch you want to recharge and read the file in the SD Card, I call it READ button, here is a picture of the buttons

data logging

and a connection to the analog inputs

data logging valori analogici

while the fifth button ( Read ) You need to connect it to the pin 9 data logging with the Arduino

data logging read

Operation of data logging

Data logging with Arduino is an experiment I decided to use the 4 buttons to simulate the change of values ​​detected by the ADC ( analog to digital converter ) Arduino, consider that each value converted by the ADC can vary from one sull'Arduino 0 a 1023 ( 10bit ) and will be 0 when the button is not pressed in passing 1023 when you press one of the buttons.

The data logging at the same time write to the log file and the monitor serial data collected from 4 analog pin in addition to the date and time at which the data was collected.

You can replace each of the 4 buttons with the sensor you see fit, I have deliberately used the analog inputs to allow you to be able to detect 1024 signal levels from each pin, if you used the digital pins I could only detect the passage was from LOW to HIGH and vice versa.


You can not use pins A4 and A5 as they are used for I2C bus RTC shield.


Download sketch del data logging

You can download the sketch and the RTC library that I used for this project directly from GitHub.

Lo sketch some 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

char buffer[40];

File myFile;

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

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

    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/d/%d d:%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) {
    } else {
      Serial.println("error opening dati.log");

    if ( digitalRead( readButton ) == HIGH ) {
        Serial.println(" ");
        Serial.println("Reading Log Saved ----------- ");
        Serial.println(" ");
        myFile = SD.open("dati.log");
        if (myFile) {
          while (myFile.available()) {
        delay( 5000 );


the sketch of the data logging includes both classes needed to communicate with the RTC as well as those to use the SD Card Shield:

lines 03-04: Include the class and the class Wire RTC to communicate with the DS1307 through the I2C protocol;

line 05: Include SD class to read and write to the SD card with the SPI protocol;

lines 07-08: define in which pins you have connected the button you will use to read the log data logging and pin CS that your SD card using;

line 10: initializes the RTC;

line 11: define a buffer in which to memorize the time and the measured values. To calculate the length of the buffer can count the maximum number of characters that may contain, you know that the date is made 10 characters ( gg/mm/aaaa ) the e ora da 8 characters ( hh:mm:ss ) and that between the two there is a space, then you know that each value will be separated by a space so you can read them easily and that the highest value of each pin is 1023 ( 4 characters ) for which the calculation is: 10 + 1 + 8 + 1 + 4 + 1 + 4 + 1 + 4 + 1 +4 = 39 so you can define the buffer 40 ( Whereas a margin of 1 value )

lines 16-17: sets the communication with the serial monitor in 57600 baud rate and write on the monitor serial string “Inizializing SD card …”

lines 18-19: sets the mode of operation for the CS pin and the pin connected to the button reading ( pin 9 );

lines 21-24: initializes the object with the SD method begin and passing the value of the pin CS, if it fails to initialize the SD card writes the serial monitor “Initialization failed” and exits the setup function using the command return;

lines 27-34: Wire and initializes the RTC, tax 1 according to the flashing frequency of the SQW LEDs present on the RTC Shield and if time is not configured sets the current time of the RTC Pc, for the procedure, read the article Tutorial: RTC Shield con DS1307;

line 38: sets an instance of type DateTime as RTC.now();

line 40: compose the buffer using the command line sprintf( buffer, format, VAL1, VAL2 ….valn ) in which the buffer is the variable in which to store the entire string, The format is that of the command sprintf ( you see manual ), and successive values ​​are the ones you want to buffer;

line 41: Write the serial monitor the value of the buffer;

line 43: Open the file in write mode “dati.log” on the SD Card Data Logging

lines 44-46: if the file pointer dati.log there, that is, if you managed to open communication with the SD card inserted in the SD Card Shield write the string buffer and close the file;

lines 47-49: in the event of failure to open the file dati.log Write on the monitor serial string “error opening dati.log”;

line 51: checks that the value measured on pin buttonRead either HIGH means that the button is connected to this pin is pressed;

lines 52-54: write a blank line on the serial monitor, la stringa “Reading Log Saved ————–” and an additional blank line, only serves to separate the lines written by the normal operation of those read from the SD Card Data Logging;

line 55: open the file dati.log in reading mode, In fact, you did not specify any parameter as the second argument of the method open;

lines 56-61: If the file has been successfully opened read line by line the log file and write the result of each line on the serial monitor;

line 62: set a delay from 5 seconds ( 5000 milliseconds ) before returning to normal operation log;

line 65: set the delay between 1 between a second cycle of the function loop() and the next.

Video of data logging with the Arduino

In order to show how the data logging that you just made, you can watch the video that I made in testing with my data logging:

Buon Log !!![important]
Kindly DO NOT paste sketch in the comments, Use the info box of the blog that you can find on the contact page.

Sketches are distributed free of charge and without any liability.
By reading this article and decided to use the sketch brought you assume all responsibility.

Be Sociable, Share!

Related posts

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


7 pings

Skip to comment form

  1. Jay

    Great demo. How would you recommend uploading this data to an FTP site so that it could be graphed in a web page?

    1. Mauro Alfieri

      Thank you,
      i suggest you use an Ethernet connection.


  2. Henry

    Thank you for the tutorial, reading it you have given me inspiration and I would like to create a data logging with arduino r3 recording data (text strings) coming via serial RS232 from a GPS and an echo sounder on the sd card.
    By connecting the GPS (baud rate 9600) and the sounding (baud rate 4800) to the serial port of the PC with hyper terminal I see the text strings.
    For now I am recording the data with a laptop and a data logging software but rather, as a matter of size and portability of a solution with Arduino.
    Do you think that using the shield Assembled Adafruit Data Logging and two Serial Interface RS232-TTL 3-5,5V be able easily or will I need a different hardware configuration?


    1. Mauro Alfieri

      Hello Henry,
      thanks for the compliments.
      The shield Assembled Adafruit Data Logging has an internal shield both the SD Card is the RTC, might be a good solution, I've never tried it because I do not own one and I can not tell if it's easier or more difficult to achieve DataLogging.

      You know that Arduino has one serial port, and that already use to upload sketches, of course you can use it for the data logger when it is separated from the computer, double 2 Serial Read, at different speed, you can try to simulate the serial library SoftwareSerial.h (you can find tutorials on the blog ) or use an Arduino Mega which 4 independent serial.


  3. rise

    i want generate arduino data logging based bar code scanner. do have a link?

    1. Mauro Alfieri

      No, I do not have links to suggest


  4. Paul Furley

    Neat project and great write-up, thanks for the detail. I imagine this could be quite a disruptive application as commercial data loggers don’t come cheap. Might be fun to do a radiation level logger with the Geiger counter shield :)


    1. Mauro Alfieri

      Hi Paul,
      you can try a project if you have a counter Gaiger available.


  5. Danny

    Please check line 50. Seems incorrect. Should be:

    if(digitalRead(readButton) == HIGH){

    Good tutorial. Appreciate that you are sharing with us.


    1. Mauro Alfieri

      Thanks for your report, I see no difference between line.


  6. Francis


    Thanks to your information I was able to assemble the various components such as LCD, RTC, SD module and temperature sensors. It works perfectly, But I wanted to make a change to the data logger, I would like the files with recorded data is created every day with a different name, perhaps with the date of the day of registration (this is. 03_05_2013.txt). Can you kindly help me out?

    1. Mauro Alfieri

      Hello Francis,
      is a modification of some’ challenging but not impossible.
      You can work with the shakes and set a different file name for each day.

      Remember to check that the file exists before writing values, This device prevents the passage of midnight the new file is not present so you should always check that the file exists and you want to write to create it if there is already


  7. MRSS

    Hi there,
    I would like to know your recommendation (since I am very new to Arduino), if I want to log some data, say it I sample it every 1 sec, and when it reaches 60 sec, it will average the 60 data, and log it to the SD card for every 1minute, how am I going to do that? I am very confuse now.

    I manage to log the data every sec. It means in my SD card, every sec of data has been logged. But the problem is now, I only want to log data for every 1 min after averaged all the 60 sec data. Meaning that in my SD card only has data for every 1 minute. Do you understand me? Thank you in advance for your quick response. I am very looking forward for it. Thank you!

    1. Mauro Alfieri

      hello najwa,
      i understand your project.
      You store values ​​into a variable 60 times per minute and average:

      for( int i=0;i<=60;i++) {
      int val=analogRead( your_pin );
      valTotal = val;
      delay( 1000 );
      valTotal = ( valTotal / 60 );

      then write valTotal to the SD card.


      1. MRSS

        thank you mauro!
        now i got the idea! thanks!


  8. Apprentice

    I'm just using Arduino. My intention was to use the RFID technology. I bought r3 arduino, a reader ID20 of innovations and OpenLog the SparkFun. I managed to run the RFID reader with Arduino, I therefore write to the serial ID read from the reader.
    Now I switched to the second block of my little project: I want to transfer this data to openlog to save them on microSD. I have read suggestions from SparkFun, but I still can not store the data I want.
    Since I am a beginner could you give me some help?

    1. Mauro Alfieri

      Hello Apprentice,
      Your project is interesting.
      Your name is not Apprentice, that's right?

      I do not know that you're using the OpenLog, I usually use in my rejection of the normal SD card, However, I read the Wiki Sparkfun and I think that works on the serial communication through simulated SoftSerial.h with commands sent via Serial.println( command );

      What gives you the error?


      1. Apprentice

        Hello Mauro,
        thanks for reply. I managed these days to run OpenLog Arduino to write to the serial command Serial.println(). Use OpenLog first in listening mode and then into control mode to write on microSD. My problem now is figure out how to send data from the player to OpenLog. I do not understand a thing: agrees that I memorize the data coming out of the first player in the memory dell'Atmega and then pitch them on OpenLog, or I can directly record to OpenLog defining the Arduino pin? Sorry if the question may seem stupid, but I am stuck here and I do not know how to continue.
        Thank you for your help

        1. Mauro Alfieri

          Hello Apprentice,
          I'd love to know your real name .. it's weird to contact a lover / a under a pseudonym.
          Your questions are not stupid at all, Unfortunately, I have never tried the shield OpenLog so I rely only on reading the description of the manufacturer.
          To decide which mode it is necessary to write you assess the sampling time, ie the interval between one value and the next time you want to store and writing on OpenLog.

          For example, if you need to write on OpenLog 1 and samples according to 100 milliseconds with a range of 10 seconds each 100 readings you should certainly use an array of 100 positions to store the data each 100 milliseconds and write OpenLog only once in the break 10 seconds.


          1. Apprentice

            Hello Mauro,
            I tried to record with OpenLog: I succeeded, I'd rather just do that if I can.
            The player sends to the Arduino via serial tag that reads; I would like to be able to save such an ID in RAM dell'ATmega. I've only seen Arduino tutorial on writing and reading EEPROM. The problem is that I can write one cell at a time and I would like to write the entire ID? Do you have any advice? I thought of two pointers one for the ID and one to scroll through the cells of the EEPROM: too cumbersome… You can not write to the ram?



          2. Mauro Alfieri

            Hello Paola,
            I published an article on the management of the EEPROM written by a fan and shared with all.
            It is important for you to know the size of the ID domain in terms of number, you will understand by reading the article.


        2. Apprentice

          I just saw you yesterday published a tutorial, Thanks :-), I see a little bit of hacking . let you know if I have problems.

          1. Mauro Alfieri

            Very well.


          2. Apprentice

            Hello Mauro,
            ho a problem with the EEPROM. I'll explain what I want to do.
            I saw how you store the IDs on a subject EEPROM.Se No ID number,
            How can I print all? I have to use a pointer to get locked all the cells and stored print?


          3. Mauro Alfieri

            Hello Paola,
            and, I would do a loop that reads the cells and the release of Serial Monitor or other communication you is easy.


          4. Apprentice

            Hello Mauro,
            I resolved to do everything I can now.
            Thanks for the help and availability

  9. Jon Persson


    Interesting and inspiring project! How is it with energy consumption for this datalogger. I’m looking for a solution that can work autonomous for at least weeks without out needing a huge battery, and logg signals on minute basis.


    1. Mauro Alfieri

      Hello Jon,
      the power consumption depends on the sensor and the frequency of writing on the card, every minute is a good engagement of energy.
      You can measure the current consumed by your project after assembly and determine the type of power source required.


  10. Paolo

    Hello Mauro, I can confirm that the sketch of the example works well with the microSdCard of’ Ethernet Shield (replacing the CS pin from 10 to the 4, however, indicate how you) e l’ RTC DS1307 … I got error all'SdCard using file names greater than 8 characters , I confirm that this limit? … suspected to have arrived at the limit of RAM because adding or removing only the 'Serial.print’ I have the success / non-success of the writing on the sdcard , sometimes appear even strange characters or the sketch restarts independently, etc.… … can be a problem of employment RAM? There is a simple way to be able to check?

    1. Paolo

      … I was able to read employment in RAM using the command 'avr-size.exe’ , mi dà :

      Program : 22402 bytes
      Data : 1796 bytes

      If I'm not mistaken the limits of 'Atmega328 Arduino UNO are 32 kB di Flash (Program) and 2 kB of RAM (Data) … considering that during the execution of the program the occupation of Ram salt, I seem to be on the verge of Ram and maybe have explained so many different errors and occasional program …

      can actually be so? how would you rate the comando'avr-size.exe '?

      1. Mauro Alfieri

        Hello Paul,
        data carry-over concerns that the flash memory of Arduino, then that resides on the sketch compiled.
        32K = 32768 Bytes that if you subtract the 2048 Bytes ( 2The ) get 30720 Bytes.
        These sizes are the same you should read the Arduino IDE after a filling.


    2. Mauro Alfieri

      Hello Paul,
      the limit on the length of names to 8 character is due to the fact that you have formatted the SD card in FAT, This file system has a limit you're talking about. Try the Fat32 the site indicates arduino.cc as supported by the SD library.
      By removing the Serial.print from your sketch you decrease the size occupied by the sketch when completed, we speak of flash memory that is 32K in arduino, has no influence on the development of the sketch.


      1. Paolo

        … I just reformatted (in fast mode) gives the MicroSD Card 4 GB in FAT32 con 32 kilobytes of allocation units and, using a sketch basis for writing to sdcard (so as to avoid any problems of memory), writing works well until the eighth character of the filename, the ninth character on the writing fails … anyway thanks, for the rest of the time under the 8 characters, and I can tell more about formatting

        To be fair I am giving you the link to the site from which I have drawn information on the memory of the Arduino :


        I do not know the author and see if tu then delete this link … it is from this article that I am convinced of the possibility that only a few Serial.print can lead to saturate the RAM …

        Thanks dela availability …

        1. Mauro Alfieri

          Hello Paul,
          supports the FAT32 file whose name exceeds 8 characters, could be a limitation of the library SDFat.
          The link you sent me is a very good programmer and passionate Arduino, Leonardo Milani, I've exchanged a few emails a few months ago and of which I have great respect.

          His article, I read carefully, specifies that the command avr-size.exe deals to give you an assessment of the occupation of Flash files compiled by evaluating the Arduino IDE.
          To get a true assessment of the RAM used at run-time ( that is, while it's running sketch ) you should use the method suggested by Leonardo MemoryFree.


          1. Paolo

            ok, the upper limit of the 8 characters of the file should be a limit library, I currently use the SD.h

            I tried the method MemoryFree and effectively to a value of 450 (suppongo Bytes) the file is successfully opened the sdcard, Serial.print add some plain text, and the value drops to 350 continuing to successfully open the file, when instead I add a couple more Serial.print and the value of MemoryFree falls below 300 I get an error when opening the file to SD … At this point I think that is the Serial.print I occupy the Ram up to disallow opening the file … I will be more frugal with Serial.print and indeed I will evaluate whether to move to flash memory …

            Thanks again Mauro

          2. Mauro Alfieri

            Great Paul, Your analysis is very detailed, and the library MemoryFree seems perfect for these tests.


          3. Louis

            Hello hello and Paolo Mauro.
            I have the same problem. I have created a management for controlling an air conditioner according to the surplus of the current produced by the photovoltaic.
            For tests and inspections have used different Serialprint.
            I installed the ethernet shield, varied pins and proven SD Card. With a sample file of scritturae reading everything works smoothly. My program also. But as soon as I assemble the two programs the serial print goes crazy and strange carattteri, head stranissimimi etc. and nothing works.
            I put” //” on the part of the program where there’ Writing to SD. More and more I remove the serial works.
            So I ask you: It can always be a problem of saturation memory? the ide tells me that the compiled and equal to cc 20000 Bytes. You have other ideas?

          4. Mauro Alfieri

            Hello Louis,
            as you described it seems a problem of saturation.
            I'm using the IDE 1.5.x beta for a few months and has a nice feature that at compile tells you how much memory (+ the -) use the program at run.

  11. Nicola

    Hi Mauro.
    Following the indications of this great guide Her ono able to measure the humidity and temperature and to save the data on a SD.
    the upgrade I want to do is to carry out such measurements not every few seconds, with the wait command,
    but automatically, for example, on the hour every hour.
    Could you please suggest me how to proceed?

    1. Mauro Alfieri

      Hello Nicola,
      the idea is very cute, I invite you to read the articles on sentralina irrigation which has similar concepts.
      Compared with the control you need irrigation triggers a relay at a given time configured, You do not need to do is write to the SD card instead of exciting a relay.


      1. Nicola

        First of all, thank you very much for the prompt reply.
        But it perplessità: the example of the unit is great, but I see it more suitable for those activities that require some adjustment, because you can easily change the intervals of operation.
        In my case instead, should establish 24 intervals, every hour of the day, am I right?
        Can not quite, with more comfort, to use a command like the wait,
        but that is not influenced by the time of reading and writing data?

  12. carmine

    I tried your code but the sprintf (riga 41-42-43) does not work.
    To you it works ?

    1. Mauro Alfieri

      Hello Carmine,
      I text all my sketches before posting, there may be a copy and paste error that I missed or that replication is bad code on screen, that gives you the error?


  13. daniel

    hello mauro,
    I found the following code to store the date and time using the ethernet shield WITHOUT RTC.
    but as you will see this sketch using the protocolloUDPNTP the door 8888, but the project you'll have to implement it instead uses port 80.
    I put my plan into one that uses the port 8888?
    this is the code:


    Udp NTP Client

    Get the time from a Network Time Protocol (NTP) time server
    Demonstrates use of UDP sendPacket and ReceivePacket
    For more on NTP time servers and the messages needed to communicate with them,
    see http://en.wikipedia.org/wiki/Network_Time_Protocol

    Warning: NTP Servers are subject to temporary failure or IP address change.
    Plese check


    if the time server used in the example didn't work.

    created 4 Sep 2010
    by Michael Margolis
    modified 9 Apr 2012
    by Tom Igoe

    This code is in the public domain.



    // Enter a MAC address for your controller below.
    // Newer Ethernet shields have a MAC address printed on a sticker on the shield
    byte mac[] = {
    0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

    unsigned int localPort = 8888; // local port to listen for UDP packets

    IPAddress timeServer(132, 163, 4, 101); // time-a.timefreq.bldrdoc.gov NTP server
    // IPAddress timeServer(132, 163, 4, 102); // time-b.timefreq.bldrdoc.gov NTP server
    // IPAddress timeServer(132, 163, 4, 103); // time-c.timefreq.bldrdoc.gov NTP server

    const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

    byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

    // A UDP instance to let us send and receive packets over UDP
    EthernetUDP Udp;

    void setup()
    // Open serial communications and wait for port to open:
    while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only

    // start Ethernet and UDP
    if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:

    void loop()
    sendNTPpacket(timeServer); // send an NTP packet to a time server

    // wait to see if a reply is available
    if ( Udp.parsePacket() ) {
    // We've received a packet, read the data from it
    Udp.read(packetBuffer,NTP_PACKET_SIZE); // read the packet into the buffer

    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Seconds since Jan 1 1900 = " );

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears;
    // print Unix time:

    // print the hour, minute and second:
    Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day)
    if ( ((epoch % 3600) / 60) < 10 ) {
    // In the first 10 minutes of each hour, we'll want a leading '0'
    Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute)
    if ( (epoch % 60) < 10 ) {
    // In the first 10 seconds of each minute, we'll want a leading '0'
    Serial.println(epoch %60); // print the second
    // wait ten seconds before asking for the time again

    // send an NTP request to the time server at the given address
    unsigned long sendNTPpacket(IPAddress& address)
    // set all bytes in the buffer to 0
    memset(packetBuffer, 0, NTP_PACKET_SIZE);
    // Initialize values needed to form NTP request
    // (see URL above for details on the packets)
    packetBuffer[0] = 0b11100011; // LI, Version, Mode
    packetBuffer[1] = 0; // Stratum, or type of clock
    packetBuffer[2] = 6; // Polling Interval
    packetBuffer[3] = 0xEC; // Peer Clock Precision
    // 8 bytes of zero for Root Delay & Root Dispersion
    packetBuffer[12] = 49;
    packetBuffer[13] = 0x4E;
    packetBuffer[14] = 49;
    packetBuffer[15] = 52;

    // all NTP fields have been given values, now
    // you can send a packet requesting a timestamp:
    Udp.beginPacket(address, 123); //NTP requests are to port 123

    1. Mauro Alfieri

      Ciao Daniel,
      perhaps you did not read the end of each article of mine is not shown because it comes paste code unreadable.

      For your project, in addition to, I do not know how to help you because I did not understand what you want to achieve, because they do not want to use a RTC and what does the recovery time will Anto with the door 80 with whom I do not know what you want us to.

      I suggest you write to the author of the sketch that you can certainly clarify what is the sketch its limits and that this solution presents.


  14. daniel

    sorry to have not read :D not, however, I wanted to display the time in my client, but I do not have the RTC and I've read that the code allows you to use the time with only the use of the ethernet shield

    1. Mauro Alfieri

      The Daniel,
      this method, as far as I can read and I hope you understand, using an NTP server to synchronize the time.


  15. David


    but a logger like this I can use to monitor a 14kW photovoltaic inverter with brand AURORA? It’ You can have a guide to get started with Arduino and understand things I need to buy to put into practice all that written in the tutorial?

    Thanks so much


    1. Mauro Alfieri

      Hello David,
      a data logger measures and records everything you tell him to measure.
      Recently I published an article full of a data logger capable of measuring temperature and umiditò that is for sale on the site robot-domestici.it, if you order it ask the new vesion :-)

      For the photovoltaic system are not shod, but if you can find the probes compatible with Arduino, you can definitely use this design for your data logging.

      If you want a step by step guide to Arduino I recommend you read my free online course or attend one of the courses in the classroom.


      1. Stefano

        Good evening, I'm doing the same thing using libraries energy monitor and a clamp ammeters attached to a small circuit ( two resistor and a capacitor ) I would like to turn the link:


        To log phase I put the ethernet shield and I took the time via ntp, has published data via Rest in json format .

        If I give it to someone can affect sketc smoothly…


        1. Mauro Alfieri

          Hello Stephen, lovely, I know the project openenrgymonitor and I think the improvements you've made are of great interest.
          If you va mandami your email picture,schemes, sketch, Video and description ( in short, everything you can ) and I gladly public one or more articles in your name.

  16. gianni

    Hello Mauro,

    in your code de wanted to append to a string buffer to be saved so that you have as well as data from the sensors is also a text string

    20/04/2014 00:24:33 15 15 16 15 59 40 38 99 Relay1 ON – Relay2 OFF

    I tried:

    sprintf(buffer, “%02d/d/%d d:%02d:%02d %d %d %d %d %d %d %d %d “, now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), Tmedia, t1, t2, t3, Hmedia, h1, h2, h3 );
    textlog = buffer + info;

    but a line the correct spelling but adds other strange characters and sometimes they do not write anything.


    1. Mauro Alfieri

      Hello Gianni,
      to add additional info you need to enter in the sprintf(…) adding both the correct pointer% d,%s ( depends on what you'd like to add ) and at the end of your string parameters.
      In other articles are used as the command you need, or you can check the syntax of the command sprintf() a su sul Arduino reference manual C.

      1. gianni

        Thanks Mauro,

        I had already tried other methods, what you say is to add

        sprintf(buffer, “%02d ……,%s”, now.day(),………, info)

        but I get this error:

        warning: format ‘%s’ expects argument of type ‘char*’, but argument 17 has type ‘String’ [-Wformat]

        I also tried

        if (myFile) {

        but writes strange characters at the end of the line on the SD files or does not write anything

        1. Mauro Alfieri

          Hello Gianni,
          The first method is the one I would use.
          If you use the% s your text must be of type char that is, between “” and not between ”

          1. gianni

            so if I have to pass text between “” but I want to pass a String, do you have any solution?


          2. Mauro Alfieri

            Hello Gianni,
            check the manual sprintf if there is an option to pass a string or convert string to char.

          3. gianni

            Hello Mauro,
            I do not understand why it is becoming so difficult, I thought it was a trivial, and what's more I can not even work around the problem, Cmq even so gives me error

            String info;
            char was[100];

            info.toCharArray(was, 100);
            sprintf(buffer, “d ……,%s”, now.day(),………, info);

            I no longer have any idea.

          4. Mauro Alfieri

            Hello Gianni,
            eye seems wrong conversion from String to char.
            Try following one of my articles.

            It remains unknown why you want to pass a String, not a char.

          5. gianni

            excuse does not return error…….. just do not write anything

            while if the mold you see all the serial……grrrrrrrrrrrrrrr

          6. Mauro Alfieri

            Hello Gianni, see previous answer.

          7. gianni

            Mauro Thanks for your patience :-)

            the fact that I want to pass an object of type String is because they can not build the message with char, this is:

            String info=””;
            if (Analog.read(A0) < 20) info = " Relay 1 ON";
            if (Analog.read(A1) < 10) info = " Relay 2 ON";

            I can not do this with Char

          8. Mauro Alfieri

            Hello Gianni,
            try to read this article: http://www.mauroalfieri.it/elettronica/tutorial-arduino-e-le-stringhe.html


  17. stefano

    I wanted to know if you can read the log file, to make graphs with Excel, directly, without removing the SD Arduino


    1. Mauro Alfieri

      Hello Stephen, if you want you can do it.
      You must write one or more functions at the touch of a button or receiving u serial command to read the file and I will send to your computer via serial or other method of sending.

  1. Arduino Blog » Blog Archive » Data-logging made simple with Arduino

    […] 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. Data-logging made simple with Arduino | Linux-Support.com

    […] 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. Revue de presse - 28 January 2013 |

    […] complete description of a datalogger based on Arduino. It is rare to see such a stack of shields! The program, simple, allows […]

  4. Arduino project where to start - Mauro Alfieri Electronics Robotics

    […] and its blink you'll probably need at least a shield Arduino, An example is the data logger you need to make it happen, in addition to Arduino, la RTC shield e la SD shield. The same goes for a […]

  5. Arduino temperature humidity data logger - Mauro Alfieri Home Automation Robots

    […] two projects that you can read on this blog Datalogging with Arduino DHT11 sensor and can carry out the project: Arduino data logger and temperature stability […]

  6. Data-logging made simple with Arduino -Use Arduino for Projects

    […] 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 […]

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>