CTD+ (Conductivity, Temperature, Depth, Light) – From the Breadboard to the ROV

Greetings enthusiasts!

In a previous post, I discussed a prototype using light, temperature, depth, and conductivity sensors, entailing a modular. remotely accessible package for deployment on ROVs or other marine craft. The high level plan was to develop a sparsely connected module sensor suite, using a simple web server/client interface, all in node.js. This has been progressing smoothly, albeit slowly, over the last few months. Today, I would like to go over the hardware changes that have taken place for a field testable prototype; saving the software for the data visualization for a future post.

As previously mentioned, CTD solutions for hobbyist are not commonly available. Though one can peruse the DIY aquarium community and discover a number of rather handy sensor packages, I had decided to design and build my CTD solution form the ground up. Drawing heavily from the now defunct MIT SeaPerch sensor suite, SeaPerch, I’ve gone off and have taken to prototype and push the solution into an Otterbox P40 (I hope this puts a smile onto the SeaPerch folks faces). Rated to 100ft of depth (< 40m) in water (stay with me here), the off the shelf pressure vessel will suffice for the next stage in prototyping. Supporting up to 1000 pounds of crush force, with a few o-ring modifications, I feel the OtterBox can do well for at least 100m depth. (we shall see when we complete our Hydrostatic Pressure Chamber…or dive it, which will most likely happen first)

Moving on, lets take a look at the innards of the solution:

  • Arduino UNO
  • SD card Shield SEED Labs
  • Light to frequency converter (what’s this have to do with a CTD? Nothing really, but we may be curious about ambient light attenuation at depth)
  • Temperature sensor
  • Pressure sensor
  • Conductivity sensor

In this iteration, we are using the Arduino UNO and SD shield, with a 9VDC battery supply, connected neatly to the sensors in the snug, comfortably dry confines of a translucent OtterBox P40 case.  The photots speak volumes. I’ve sealed all holes drilled for the temperature, conductivity, and pressure sensors with epoxy resin and healthy seal of silicon for good measure. I then dumped the case into a test tub to check for leakage at 1 atm plus a few inches, for an hours. Once satisfied, I added the more sensitive electronics to the kit. Hopefully this is enough for more aggressive depth testing. I will also be modifying the o-ring of the case, using a thicker version, allowing me to compress and lid more snugly, addressing a 100m target depth (that’s 160.5 psi).

The Conductivity sensor was an interesting one. Using a design by Belladonna, and using slightly different components to address the voltage supply (9 VDC instead of her 12+), I’ve gone and wired up this monster. The circuit is simple. It takes a 9VDC source signal and passes it through an op-amp oscillator, giving the signal a sinusoidal, or AC profile. Then we pass the signal through an amplifier and to the sensor probes, which are gold plated stereo jacks for high conductivity. An AC current is passed between the probes. An additional amplifier and rectifier circuit then takes the values and converts to DC and out to the Arduino headers. Why the bother with the AC signal conversion? Well, with DC current, we break down the molecules of water. What we would see is a varying signal across the probes. Using AC of a certain frequency, we do not break apart the water molecules and hence are able to read the resistivity of the fluid between the probes; allowing for determination of salinity (after calibration of course. But that’s for a different post). Another consideration is the change in salinity with temperature. Therefore, using the on-board temp. sensor, we need to calibrate and adjust as given temperature deltas. This is done in the software, which will be implemented in the near future.

Photos:photo 1(1)Breadboard Testing

photo 3Component wiring after breadboard testing of the conductivity sensor.

photo 4Fitting the parts into the OtterBox. Dimensions – 17cm x 12cm x 6cm –

photo 5Top photo, light sensor in middle/left/bottom of component board.

photo 1Finished board mount.

photo 2Almost done. I still have wiring of the conductivity probes and temperature sensor to finish up.


On-board Software Solution:

For this iteration, I’ve chosen to log all sensor data directly to the on-board SD card. The end target is to have a MySQL server running, logging the data and allowing for real-time visualization from the on-board ROV computer (for the OpenROV kit = BeagleBoneBlack and controller). First there is the sensor code itself. We have a temperature method, light to frequency counter, conductivity, and pressure sensor methods, pulling data from the sensors in a predetermined time interval. The next bit of code logs the data to the SD card using the SD card Arduino library. I am adding a simple string set to the datalog in a human readable manner. Future implementations will push this data into a MySQL server, with all the pretty tables and timestamps, etc. But for now, I will simply post-process the data after the dive to retrieve the dive profiles, utilizing the time stamps and data written to the log. Remember, when budget and time are a big factors of your development cycle, tracer-bullet prototyping is the best way forward. (For more on tracer-bullet prototyping see “The Pragmatic Programmer” by Dave Thomas and Andy Hunt).

Code: Conductivity and temp adjustment in the works. And ignore the magic numbers, etc. This is prototyped test code as it were 🙂

– TEMP –



– SD Card Write –


Well, that’s it for now. There’s alot yet to do and fine tune, but here lies a CTD+ prototype. Now to see how it fairs in the real world. Note: This CTD is highly buoyant (since that’s also what the OtterBox is for), thus, compensation will be needed for deployment.

Remember, make and make often. make the world you want, not the one you were given.

— Jim N.

Did you like this? Share it: