Turner Cyclops-7F topic

Classes for the Turner Cyclops-7F analog turbidity sensor.

Introduction

Cyclops-7F Sensors are high performance, compact submersible sensors designed for integration into any platform that provides power and datalogging.

The Cyclops sensors come pre-configured for one of 13 fluorophores and can also be ordered with custom wavelength configurations. The standard configurations are:

IDVariableApplication
UTurnerCyclops_CDOMCDOM/FDOM
CTurnerCyclops_ChlorophyllChl in vivo (Blue Excitation)
DTurnerCyclops_RedChlorophyllChl in vivo (Red Excitation)
FTurnerCyclops_FluoresceinFluorescein Dye
OTurnerCyclops_CrudeOilOil - Crude
GTurnerCyclops_BTEXOil - Fine (Refined Fuels)
BTurnerCyclops_BrightenersOptical Brighteners for Wastewater Monitoring
PTurnerCyclops_PhycocyaninPhycocyanin (Freshwater Cyanobacteria)
ETurnerCyclops_PhycoerythrinPhycoerythrin (Marine Cyanobacteria)
ATurnerCyclops_PTSAPTSA (1,3,6,8-Pyrenetetrasulfonic Acid Tetrasodium Salt)
RTurnerCyclops_RhodamineRhodamine Dye
LTurnerCyclops_TryptophanTryptophan for Wastewater Monitoring
TTurnerCyclops_TurbidityTurbidity

The detection limits, ranges, and wavelengths of each configuration are:

IDMDLLinear RangeLED (CWL)ExcitationEmissionPower @ 12V
U0.1 ppb¹0-1,500 ppb¹365 nm325/120 nm470/60 nm240 mW
0.5 ppb²0-3,000 ppb²365 nm325/120 nm470/60 nm
C0.03 μg/L0-500 μg/L460 nm465/170 nm696/44 nm240 mW
D0.3 μg/L0-500 μg/L635 nm≤ 635 nm> 695 nm240
F0.01 ppb0-500 ppb460 nm400/150 nm545/28 nm145 mW
O0.2 ppb²0-1,500 ppb²365 nm325/120 nm410-600 nm250 mW
G0.4ppm³0-20 ppm³255 nm≤ 290 nm350/50 nm530 mW
B0.6 ppb²0-2,500 ppb²365 nm325/120 nm445/15 nm200 mW
P2 ppb⁴0-4,500 ppb⁴590 nm590/30 nm≥ 645 nm160 mW
E0.1 ppb⁵0-750 ppb⁵525 nm515-547 nm≥ 590 nm270 mW
A0.1 ppb²0-650 ppb²365 nm325/120 nm405/10 nm320 mW
R0.01 ppb0-1,000 ppb530 nm535/60 nm590-715 nm175 mW
L3 ppb0-5,000 ppb275 nm-350/55 nm540 mW
T0.05 NTU0-1,500 NTU850 nm850 nm850 nm120 mW

¹ Quinine Sulfate

² PTSA (1,3,6,8-Pyrenetetrasulfonic Acid Tetrasodium Salt)

³ BTEX (Benzene, Toluene, Ethylbenzene, Xylenes)

⁴ Phycocyanin pigment from Prozyme diluted in Deionized water

⁵ Phycoerythrin pigment from Prozyme diluted in Deionized water

Calibration

The Cyclops does not come pre-calibrated and must be calibrated by the user after purchase. Turner recommends using a simple 1-point calibration, which is what this library supports. Full calibration instructions are in the instrument manual.

The Cyclops-7F puts out a simple analog signal between 0 and 5V. It has three possible gain settings, 1x, 10x and 100x. The gain setting is selected by grounding the appropriate gain wire. Because the output signal can range up to 5V, if using an ADS1115 or ADS1015 powered at only 3.3V, the gain must be reduced or a voltage devider used to ensure the output signal does not exceed 3.6V. This library does not support variable gain or any type of auto-gaining for the Cyclops sensors.

Before applying any calibration, the analog output from the Cyclops-7F must be converted into a high resolution digital signal. See the ADS1115 page for details on the conversion.

Sensor Datasheet

Build flags

  • -D MS_USE_ADS1015
    • switches from the 16-bit ADS1115 to the 12 bit ADS1015

Sensor Constructor

TurnerCyclops::TurnerCyclops(int8_t powerPin, uint8_t adsChannel, float conc_std, float volt_std, float volt_blank, uint8_t i2cAddress = 0x48, uint8_t measurementsToAverage = 1)

Construct a new Turner Cyclops object - need the power pin, the ADS1X15 data channel, and the calibration info.

Parameters
powerPin

The pin on the mcu controlling power to the Cyclops-7F Use -1 if it is continuously powered.

  • The ADS1x15 requires an input voltage of 2.0-5.5V, but this library assumes the ADS is powered with 3.3V.
  • The Cyclops-7F itself requires a 3-15V power supply, which can be turned off between measurements.
adsChannel The analog data channel on the TI ADS1115 that the Cyclops is connected to (0-3).
conc_std

The concentration of the standard used for a 1-point sensor calibration. The concentration units should be the same as the final measuring units.

IDVariableUnits
CTurnerCyclops_Chlorophyllmicrograms per Liter (µg/L)
RTurnerCyclops_Rhodamineparts per billion (ppb)
FTurnerCyclops_Fluoresceinparts per billion (ppb)
PTurnerCyclops_Phycocyaninparts per billion (ppb)
ETurnerCyclops_Phycoerythrinparts per billion (ppb)
UTurnerCyclops_CDOMparts per billion (ppb)
OTurnerCyclops_CrudeOilparts per billion (ppb)
BTurnerCyclops_Brightenersparts per billion (ppb)
TTurnerCyclops_Turbiditynephelometric turbidity units (NTU)
ATurnerCyclops_PTSAparts per billion (ppb)
GTurnerCyclops_BTEXparts per million (ppm)
LTurnerCyclops_Tryptophanparts per billion (ppb)
DTurnerCyclops_RedChlorophyllmicrograms per Liter (µg/L)
volt_std The voltage (in volts) measured for the conc_std. This voltage should be the final voltage after accounting for any voltage dividers or gain settings.
volt_blank The voltage (in volts) measured for a blank. This voltage should be the final voltage after accounting for any voltage dividers or gain settings.
i2cAddress The I2C address of the ADS 1x15, default is 0x48 (ADDR = GND)
measurementsToAverage The number of measurements to take and average before giving a "final" result from the sensor; optional with a default value of 1.


Example Code

The Turner Cyclops-7F is used in the menu a la carte example.

1#include <sensors/TurnerCyclops.h>
2
3// NOTE: Use -1 for any pins that don't apply or aren't being used.
4const int8_t cyclopsPower = sensorPowerPin; // Power pin
5const uint8_t cyclopsNumberReadings = 10;
6const uint8_t cyclopsADSi2c_addr = 0x48; // The I2C address of the ADS1115 ADC
7const int8_t cyclopsADSChannel = 0; // ADS channel
8
9// Cyclops calibration information
10const float cyclopsStdConc = 1.000; // Concentration of the standard used
11 // for a 1-point sensor calibration.
12const float cyclopsStdVolt =
13 1.000; // The voltage (in volts) measured for the conc_std.
14const float cyclopsBlankVolt =
15 0.000; // The voltage (in volts) measured for a blank.
16
17// Create a Turner Cyclops sensor object
18TurnerCyclops cyclops(cyclopsPower, cyclopsADSChannel, cyclopsStdConc,
19 cyclopsStdVolt, cyclopsBlankVolt, cyclopsADSi2c_addr,
20 cyclopsNumberReadings);
21
22// Create the voltage variable pointer - used for any type of Cyclops
23Variable* cyclopsVoltage =
24 new TurnerCyclops_Voltage(&cyclops, "12345678-abcd-1234-ef00-1234567890ab");
25
26// Create the variable pointer for the primary output parameter. Only use
27// **ONE** of these! Which is possible depends on your specific sensor!
28Variable* cyclopsChloro = new TurnerCyclops_Chlorophyll(
29 &cyclops, "12345678-abcd-1234-ef00-1234567890ab");
30Variable* cyclopsRWT = new TurnerCyclops_Rhodamine(
31 &cyclops, "12345678-abcd-1234-ef00-1234567890ab");
32Variable* cyclopsFluoroscein = new TurnerCyclops_Fluorescein(
33 &cyclops, "12345678-abcd-1234-ef00-1234567890ab");
34Variable* cyclopsPhycocyanin = new TurnerCyclops_Phycocyanin(
35 &cyclops, "12345678-abcd-1234-ef00-1234567890ab");
36Variable* cyclopsPhycoerythrin = new TurnerCyclops_Phycoerythrin(
37 &cyclops, "12345678-abcd-1234-ef00-1234567890ab");
38Variable* cyclopsCDOM =
39 new TurnerCyclops_CDOM(&cyclops, "12345678-abcd-1234-ef00-1234567890ab");
40Variable* cyclopsCrudeOil = new TurnerCyclops_CrudeOil(
41 &cyclops, "12345678-abcd-1234-ef00-1234567890ab");
42Variable* cyclopsBrighteners = new TurnerCyclops_Brighteners(
43 &cyclops, "12345678-abcd-1234-ef00-1234567890ab");
44Variable* cyclopsTurbidity = new TurnerCyclops_Turbidity(
45 &cyclops, "12345678-abcd-1234-ef00-1234567890ab");
46Variable* cyclopsPTSA =
47 new TurnerCyclops_PTSA(&cyclops, "12345678-abcd-1234-ef00-1234567890ab");
48Variable* cyclopsBTEX =
49 new TurnerCyclops_BTEX(&cyclops, "12345678-abcd-1234-ef00-1234567890ab");
50Variable* cyclopsTryptophan = new TurnerCyclops_Tryptophan(
51 &cyclops, "12345678-abcd-1234-ef00-1234567890ab");
52Variable* cyclopsRedChloro = new TurnerCyclops_RedChlorophyll(
53 &cyclops, "12345678-abcd-1234-ef00-1234567890ab");

Classes

class TurnerCyclops
The Sensor sub-class for the Turner Cyclops-7F submersible fluorometer.
class TurnerCyclops_Voltage
The Variable sub-class used for the raw voltage output from a Turner Cyclops-7F.
class TurnerCyclops_Chlorophyll
The Variable sub-class used for the chlorophyll output from a Turner Cyclops-7F.
class TurnerCyclops_Rhodamine
The Variable sub-class used for the Rhodamine output from a Turner Cyclops-7F.
class TurnerCyclops_Fluorescein
The Variable sub-class used for the fluorescein output from a Turner Cyclops-7F.
class TurnerCyclops_Phycocyanin
The Variable sub-class used for the phycocyanin output from a Turner Cyclops-7F.
class TurnerCyclops_Phycoerythrin
The Variable sub-class used for the phycoerythrin output from a Turner Cyclops-7F.
class TurnerCyclops_CDOM
The Variable sub-class used for the CDOM output from a Turner Cyclops-7F.
class TurnerCyclops_CrudeOil
The Variable sub-class used for the crude oil output from a Turner Cyclops-7F.
class TurnerCyclops_Brighteners
The Variable sub-class used for the opticalBrighteners output from a Turner Cyclops-7F.
class TurnerCyclops_Turbidity
The Variable sub-class used for the turbidity output from a Turner Cyclops-7F.
class TurnerCyclops_PTSA
The Variable sub-class used for the PTSA output from a Turner Cyclops-7F.
class TurnerCyclops_BTEX
The Variable sub-class used for the refined fuels (BTEX) output from a Turner Cyclops-7F.
class TurnerCyclops_Tryptophan
The Variable sub-class used for the tryptophan output from a Turner Cyclops-7F.
class TurnerCyclops_RedChlorophyll
The Variable sub-class used for the chlorophyll output from a Turner Cyclops-7F.

Sensor Variable Counts

The number of variables that can be returned by Cyclops

#define CYCLOPS_NUM_VARIABLES = 2
Sensor::_numReturnedValues; the Cyclops can report 2 values.
#define CYCLOPS_INC_CALC_VARIABLES = 1
Sensor::_incCalcValues; the raw voltage is reported, the other parameter is calculated using the input calibration equation.

Configuration Defines

Defines to help configure the address of the ADD used by the Cyclops

#define ADS1115_ADDRESS = 0x48
The assumed address of the ADS1115, 1001 000 (ADDR = GND)

Sensor Timing

The sensor timing for an Cyclops-7F

#define CYCLOPS_WARM_UP_TIME_MS = 2
Sensor::_warmUpTime_ms; the ADS1115 warms up in 2ms.
#define CYCLOPS_STABILIZATION_TIME_MS = 1000
Sensor::_stabilizationTime_ms; minimum stabilization time for the Cyclops-7F is 1s (1000ms).
#define CYCLOPS_MEASUREMENT_TIME_MS = 100
Sensor::_measurementTime_ms; Cyclops takes 100ms to complete a measurement - Maximum data rate = 10Hz (100ms/sample).

Calibrated Parameter Output

The primary output variable from an Cyclops-7F

See the optical specification guide for the minimum detection limit, accuracy, and range of the various Cyclops parameter configurations.

#define CYCLOPS_VAR_NUM = 0
Variable number; the primary variable is stored in sensorValues[0].
#define CYCLOPS_RESOLUTION = 5
Decimals places in string representation; 5.

Voltage

The voltage variable from an Cyclops-7F

  • Range is 0 to 3.6V when using an ADS1x15 powered at 3.3V
    • Full sensor range is 0-5V
  • Accuracy:

TurnerCyclops_Voltage::TurnerCyclops_Voltage(TurnerCyclops* parentSense, const char* uuid = "", const char* varCode = "CyclopsVoltage") explicit

Construct a new TurnerCyclops_Voltage object.

Parameters
parentSense The parent TurnerCyclops providing the result values.
uuid A universally unique identifier (UUID or GUID) for the variable; optional with the default value of an empty string.
varCode A short code to help identify the variable in files; optional with a default value of "CyclopsVoltage".

#define CYCLOPS_VOLTAGE_VAR_NUM = 1
Variable number; voltage is stored in sensorValues[1].
#define CYCLOPS_VOLTAGE_VAR_NAME = "voltage"
Variable name in ODM2 controlled vocabulary; "voltage".
#define CYCLOPS_VOLTAGE_UNIT_NAME = "volt"
Variable unit name in ODM2 controlled vocabulary; "volt".
#define CYCLOPS_VOLTAGE_DEFAULT_CODE = "CyclopsVoltage"
Default variable short code; "CyclopsVoltage".
#define CYCLOPS_VOLTAGE_RESOLUTION = 4
Decimals places in string representation; voltage should have 4.

Define documentation

#define CYCLOPS_NUM_VARIABLES = 2

Sensor::_numReturnedValues; the Cyclops can report 2 values.


#define CYCLOPS_INC_CALC_VARIABLES = 1

Sensor::_incCalcValues; the raw voltage is reported, the other parameter is calculated using the input calibration equation.


#define ADS1115_ADDRESS = 0x48

The assumed address of the ADS1115, 1001 000 (ADDR = GND)


#define CYCLOPS_WARM_UP_TIME_MS = 2

Sensor::_warmUpTime_ms; the ADS1115 warms up in 2ms.


#define CYCLOPS_STABILIZATION_TIME_MS = 1000

Sensor::_stabilizationTime_ms; minimum stabilization time for the Cyclops-7F is 1s (1000ms).


#define CYCLOPS_MEASUREMENT_TIME_MS = 100

Sensor::_measurementTime_ms; Cyclops takes 100ms to complete a measurement - Maximum data rate = 10Hz (100ms/sample).


#define CYCLOPS_VAR_NUM = 0

Variable number; the primary variable is stored in sensorValues[0].


#define CYCLOPS_RESOLUTION = 5

Decimals places in string representation; 5.


#define CYCLOPS_VOLTAGE_VAR_NUM = 1

Variable number; voltage is stored in sensorValues[1].


#define CYCLOPS_VOLTAGE_DEFAULT_CODE = "CyclopsVoltage"

Default variable short code; "CyclopsVoltage".


#define CYCLOPS_VOLTAGE_RESOLUTION = 4

Decimals places in string representation; voltage should have 4.

  • Resolution:
    • 12-bit ADC (ADS1015, using build flag MS_USE_ADS1015): 2 mV