The Isolated ISE (Ion Specific Electrode) Probe Interface can be used to read any probe that outputs a voltage in the range of -1024 mV to 1024 mV. pH and ORP are supported with specific libraries, but it is very easy to use another mV based probe by extending the library.

# Characteristics

  • mV Measurement range: -1024 mV to 1024 mV
  • mV Accuracy: ± 1 mV
  • Temperature range: -2 to 35 C
  • Temperature Precision: 0.05 C
  • Interface: I2C
  • Current use: ~10mA peak, low idle current ~1mA
  • Supply voltage range: 3.3 to 5.5V

# Connections

# I2C Connections

If you use the Qwiic connector, it is keyed and can only be inserted one way.

  • Black = GND
  • Red = 3.3/5 V
  • Blue = SDA
  • Yellow = SCL

A 2.54mm through-hole header is also available. The pins are as follows:

ISE Probe Interface Master device
GND Ground connection
3.3/5v 3.3 - 5 V power source

# Temperature Probe Connections

The temperature probe comes with a 3-wire connector that can only be connected one way.

# I2C Bus Pull-ups

Each device comes with 4.7k resistor pullups on the I2C bus. They pass through a 3-pad solder paste jumper. The outer pads are connected to the middle by thin traces. To disable the pullups, use a utility knife to cut both traces. To re-enable the pullups, connect all three pads together with solder.

solder paste jumper

# Getting Started

To start developing with the device, you need to install a library.

  • Arduino IDE: go to the library manager (Sketch / Include Library / Manage Libraries...) and search for Isolated ISE Probe.

  • PlatformIO: install the library using the library manager (PlatformIO / PlatformIO Home / Libraries), search for Isolated ISE Probe.

  • search for Isolated_ISE_Probe_Interface in the Libraries section of the IDE.

  • Raspberry Pi: clone the GitHub repo. In the python/RaspberryPi directory, you will find the files for various boards and their accompanying README files with instructions. Be sure to read the section below for instructions.

# Raspberry Pi

Before you can run anything, you will need to enable software I2C; the Pi's hardware implementation has a clock-stretching bug that will prevent it from working with the probe (or any other device that uses clock-stretching).

  1. sudo nano /boot/config.txt and scroll to the bottom
  2. Add dtoverlay=i2c-gpio,i2c_gpio_sda=<pin>,i2c_gpio_scl=<pin> replacing <pin> with whatever pin you'd like to use. Refer here for the pin functions, you will need to use the orange GPIO xx labels in the picture to locate the pins.
  3. ctrl + x to exit, y to save, and enter to confirm the filename.
  4. Reboot

# The shell Example

An interactive shell interface is provided and is a quick and easy way to get started using the device. You will find the equivalent commands in the code area to the right when applicable. Upload it to your master device and start a serial terminal. You will be presented with a > prompt where you can enter commands and receive a response, similar to a shell command line or REPL. It is often quicker to experiment this way rather than rewriting, compiling, and uploading new versions every time.

# Changing the I2C Address

If needed, the I2C address can be changed programatically by calling setI2CAddress. The device will permanently change the address and continue to use it after a power reset. If you forget the new address, you will need to use an I2C bus scanner to recover it.

# Class Initialization

  • C++: There are several class constructors available.
    • Default: ISE_Probe mv;, ISE_pH ph;, ISE_ORP orp;
    • Custom I2C Address: ISE_Probe mv(0x4C);, ISE_pH ph(0x4C);, ISE_ORP orp(0x4C);
  • Raspberry Pi Python: You can optionally pass the I2C address and/or bus.
    • Default: mv = iseprobe()
    • Custom I2C Address: mv = iseprobe(address=0x4C)
    • I2C System Bus: mv = iseprobe(i2c_bus=3)
    • I2C System Bus and I2C Address: mv = iseprobe(i2c_bus=3, address=0x4C)

# Calibration

There are two calibration options, single point and dual point. Single point calibration is a simple offset to the measured value. It is best suited for a sensor that displays linear measurements in the range of interest. Dual point calibration is used when the probe results are not linear over the entire range. Two points are selected, the high and low end of expected measurements. ORP is a good choice for single point. pH should be calibrated with dual point. Also, keep in mind that the pH range isn't linear when crossing the zero-point (7.0 pH). Try to avoid using the 4.01 and 10.01 buffer solutions for dual point calibration. Instead, if the expected measurements are, for example between 5.0 and 7.0 pH, use the 4.01 buffer as a low point, and 7.0 buffer as a high point.

When deciding between the two, dual point should be the preferred method, since it is the most accurate.

# Single Point

Single point calibration is done in the mV unit. To begin a single point calibration, submerge the probe and wait for the readings to stabilize. Then call calibrateSingle and pass the value the probe should be reading in mV. After calling it, the results are saved in the device's EEPROM and used automatically.

As an example, if an ORP probe is reading 560 mV in a 600 mV solution, call calibrateSingle(600).

Steps to calibrate

  1. Select a calibration solution in the middle of the expected range of measurements.
  2. reset the device to remove any previous calibration data.
  3. Submerge the probe in the calibration solution. Make sure there are no air bubbles on the probe's surface.
  4. Observe the values and wait for them to stabilize.
  5. Call calibrateProbe to perform the calibration.

# Dual Point

Alternatively, you can use dual point calibration between two predesignated points. Two calibration solutions are required, the low and high values in mV you expect to measure between.

Steps to calibrate

  1. Select a calibration solution near the low and high end of expected measurements.
  2. reset the device to remove any previous calibration data.
  3. Submerge the probe in the low calibration solution. Make sure there are no air bubbles on the probe's surface.
  4. Observe the values and wait for them to stabilize.
  5. Call calibrateProbeLow to perform the calibration.
  6. Repeat steps 3 - 4 for the high solution, then calling calibrateProbeHigh.
  7. The device will automatically begin to use the calibration data once the high and low points are determined.

You can also set all four values directly using setDualPointCalibration().

# Use

# Temperature Compensation

Temperature compensation can be used to adjust for the temperature effect on the probe. The device itself doesn't contain any firmware that adjusts the readings, that is left to be implemented by the probe-specific libraries. The pH library checks this value and will use a temperature reading and adjust the measured pH accordingly.

# Measurement Time

A mV measurement takes 750 ms. A temperature measurement takes 750ms.

I2C Implementation

The device functions as a slave I2C device. It uses a software implemention of I2C on an 8 MHz microcontroller, so it is somewhat slower than a typical sensor device at the system bus level. There are several points in the library that implement short delays. The delays are required for the system to operate reliably; it gives the microprocessor time to read/write flash, perform processor-intensive tasks, etc.

# Probe Maintenance

Probes require regular care. There is a fluid junction that makes an electrical connection with the solution to be measured. If a probe is left continuously submerged, the junction could potentially leak the buffer fluid from inside the probe. The concentration of sodium chloride could change over time, slowly decreasing accuracy. This can be compensated for by recalibrating the probe, but eventually, the probe will no longer be serviceable.

The junction can become clogged by debris or buildup. To clear a clogged junction, soak the probe in a 1:1 bleach solution. You can also use vinegar to help remove deposits on the probe.

# Troubleshooting

The most common issues are with calibration:

  • if you are getting erroneous values, call reset and see if the measurements return to a more reasonable value
  • there is no effect of using single and dual point together

# More Help

If you have any questions, find a bug, or have any suggestions on improvements, go to this project's GitHub page and submit an Issue or Pull Request. Or you can send an email to