The 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.


  • 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


I2C Connections

Connection to the device is as follows:

ISE Probe Interface Master device
3.3/5v 3.3 - 5V

Temperature Sensor Connections

The temperature probe comes with a 3-wire header; any 3-wire DS18B20 will work. The VCC pin is labeled with a triangle:

ISE Probe Interface Temperature Probe
▲ (VCC)
(Data) (pin 2)
(GND) (pin 3)

A standalone DS18B20 can be directly connected to the board, no resistor is required.

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 ISE Probe.

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

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

  • MicroPython: clone the GitHub repo. In the python/MicroPython directory, you will find the files for various boards and their accompanying README files with instructions.

  • 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.

  • Rust: Download/install/documentation for the crate

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 by calling setI2CAddress. The device will permanently change it's 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);
    • ESP32 I2C Pins (SDA, SCL): ISE_Probe mv(19, 23);, ISE_pH ph(19, 23);, ISE_ORP orp(19, 23);
    • ESP32 I2C Pins and I2C Address: ISE_Probe mv(19, 23, 0x4C);, ISE_pH ph(19, 23, 0x4C);, ISE_ORP orp(19, 23, 0x4C);
  • Raspberry Pi Python: Always pass the I2C address in the constructor, 0x3f by default. 3 indicates the third I2C device (/dev/i2c-3).
    • Default: mv = iseprobe(0x3f, 3)
  • MicroPython: Always pass the I2C address in the constructor, 0x3f by default. -1 indicates to use software I2C, and then specify the SCL and SDA pins.
    • Default: mv = iseprobe(0x3f, -1, 5, 4)


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.

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).

This method isn't appropriate for pH calibration near the zero-point of the probe. (ISE_pH::calibrateSingle(7.0); will not work).

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.

  1. Determine the lowest and highest measurement you expect. For example, the lowest level you might measure would be 0 mV and the highest might be 140 mV. These points will be referred to as referenceLow and referenceHigh
  2. Put the probe in a calibration solution at referenceLow and wait for readings to stabilize, call calibrateProbeLow(0). Do the same for referenceHigh by calling calibrateProbeHigh(140).
  3. By default, the device does not use dual points. A call to useDualPoint() must be made to enable it. Once set, it will continue to use it automatically.

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


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. However, this is a saved setting on the device. The pH library checks this value and if true, will take a temperature reading and adjust the measured pH accordingly.

Using Temperature from Another Device

If there is an alternate source of temperature information, it can be provided to the device by calling setTemp.

Measurement Time

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

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.

Isolation and Interference

Using any water quality measuring probe with another probe will likely cause interference. There are many factors that determine the amount to include the grounding of the solution, the type of probes, the solution itself, chemical reactions that may take place, etc. The only way to ensure interference doesn't cause faulty measurements is to isolate the circuit.

Each probe would need to be isolated from each other using either a galvanic isolation circuit, or connected to separated battery powered devices, transmitting information via bluetooth or WiFi, for example.

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 [email protected].