Data Logger Collecting Temperature, pH and Dissolved Oxygen with Timestamp

Upload Code and Result

Suppose the data logger have more than one temperature probe and you want to make sure to record one from inside the reactor, and the other as the room temperature, then calling them by its address (ROM) is recommended.

Declare the address of DS18B20 is DeviceAddress waterTemp = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; then get the tempeature reading by:

For one probe, you can get the temperature by sensors.requestTemperatures();. Look for File/Examples/DallasTemperature/Simple

  • Download the code from GitHub
  • Then copy the entire page to an empty Arduino Editor (by File/New). Select the port (COM in Windows or ttyUSB on Mac/Linux). Make sure you select a right type of Arduino. I used Mega 2560 because it has more internal memory, the pins for I2C and SPI on Arduino Mega is different in Nano and Uno. Finally, Compiling the code, then click Upload.

    By the way, I prepared by code by a 'tape-and-glue' approach in a sense that I picked up the code for each device than pasted over. I'm in learning path as well.

    4.2 Result

    First, a Youtube video,
    It was December 8, 2015. I had no plan for that winter break.
    A few photos:
    Breadboard and 2004 LCD
    Ugly, but it is working. I were not confident to solder the PCB then.
    Unclear characters
    These unprintable characters make difficult to treat each reading as a number.
    After treatment
    Only save to SD card by printable characters. See the note below.

    Notice: I encountered the noise from the DO probe to pH probe after 2-3 months of continuous operation. According to Atlas-Scientific staffer, an in-line voltage isolator is recommended when pH and conductivity probes are operating together. More details are on page 9.

    The logged data (the first one has unprinted characters before pH and DO data). I filtered to the readout by allowing only printable characters. Here is my remedy: filtering only printable characters:
    in_char =
    if ((in_char > 31) && (in_char < 127)): the loading bytes to an array until the in_char ==0.

    Let make some graphs,