Tracker 4-20mA sensor

You can download the files associated with this app note as a zip file.

This application note includes hardware and software for connecting a single 4-20mA current loop sensor to the Tracker One using the M8 connector.

The single port design can be powered by the built-in LiPo battery or USB and uses the built-in ADC on the nRF52840, available on the M8 connector. It includes a boost converter to 24VDC for the 4-20mA current loop. It includes over-current protection, limiting the 4-20mA loop to 30 mA.


  • 24V boost converter (from CAN_5V)
  • 30 mA current limiter
  • TVS protection

There is also an application note with support for 4 current loops.


The M8 (8mm) 8-pin connector on the Tracker One is standard, however it's not common. Some other connectors like M12 are more common, however, the 12mm connector would have required a taller enclosure to fit the larger connector. To simplify designs, Particle will provide a M8 female-to-wires cable, similar to this. This is for illustration only and the design may vary in the future.

M8 cable

The common use case will be to include a cable gland in your expansion enclosure, pass the wires through the gland, and terminate them on your custom expansion board.

You'd typically connect those wires to your custom expansion board using one of several methods:

  • Terminate with pins in a PHR-8 to mate with a B8B-PH on your expansion board
  • Terminate with screw terminals on your board
  • Terminate by soldering the wires to your board

This example can be used three different ways:

  • It can use the same B8B-PH connector that is inside the Tracker One on the Tracker Carrier board. This connector is inexpensive and can be attached directly to the Tracker One Carrier Board.

  • Or you can populate a 8x0.1" screw terminal header. This is good for connecting to the M8 to flying leads.

  • Or you can populate 0.1" male header pins, which are handy for use with male-to-female Dupont wires for connecting directly to the Tracker SoM evaluation board.

Hardware - single

Schematic - single

Single Schematic

The single design only uses CAN_5V to power, and uses pin A3 as an analog input. Unlike most of the other designs, this does not require a 3.3V regulator or use the I2C/serial pins.

4-20mA generally requires 24VDC. We generate this from the CAN_5V supply using a MIC2288 boost converter. This inexpensive chip only requires input and output capacitor, a Schottky diode, an inductor, and two resistors for a voltage divider to control the output voltage. Because of the large amount of boost, this design can only supply 80 mA at 24V.

The sensing loop has the 4-20mA sensor high-side, connected to the 24 volt supply. A TVS diode (SMAJ26A) protects against voltage spikes and high voltages.

A MAX14626 limits the current to 30mA. Even if you short the sensor connection, it will still limit the current to 30 mA, preventing damage to the boost converter and the sense resistor.

The sense resistor is connected low-side, to ground, so it can be measured with a single-ended ADC. A 100 ohm resistor is used so the maximum current of 30 mA will have a voltage of 3.0V across the sense resistor, within the capabilities of the ADC.

Current Voltage ADC Value Description
0 mA 0.0 V 0 Open Circuit
4 mA 0.4 V 491 Minimum Value
20 mA 2.0 V 2469 Maximum Value
30 mA 3.0 V 3723 Short circuit

The connection to the sensor is via a 2 screw-terminal header.

Board layout - single

Single Board

BoM (Bill of Materials) - single

Quantity Part Description Example Cost
1 C3 CAP CER 2.2UF 25V X5R 0603 Murata GRM188R61E225KA12D
1 C4 CAP CER 4.7UF 6.3V X5R 0603 Murata GRM188R60J475KE19J
1 D1 TVS DIODE 26V 42.1V DO214AC Littelfuse SMAJ26A $0.36
1 D3 DIODE SCHOTTKY 40V 1A POWERMITE ON Semiconductor MBRM140T3G $0.36
1 J3 TERM BLK 2POS SIDE ENT 3.5MM On Shore OSTTE020161M $0.67
1 L1 FIXED IND 10UH 1A 276 MOHM SMD Bourns SRN3015-100M $0.46
1 R1 RES SMD 18.2K OHM 0.1% 1/5W 0603 Panasonic ERJ-PB3B1822V $0.25
1 R2 RES SMD 1K OHM 0.5% 1/5W 0603 Panasonic ERJ-PB3D1001V
1 R3 RES SMD 100 OHM 5% 1/10W 0603 Panasonic ERJ-3GEYJ101V
1 U3 IC CURR LOOP PROT 4-20MA 6TDFN Maxim MAX14626ETT+T $1.32

Choose one of:

Quantity Part Description Example Cost
1 J3 Conn SMD 8 position 2.00mm JST B8B-PH-SM4-TB(LF)(SN) $1.00
J7 Male Header Pins (8x0.1") Sullins PRPC040SAAN-RC
1 J7 Screw Terminal Block 8x0.1" PTH On Shore OSTVN08A150 $2.36

By the way, this inexpensive tool from Amazon ($27.99) is very handy for testing 4 - 20mA. It's powered by USB and you dial in the exact number of mA you want to draw.


Getting the Tracker Edge firmware

You can download a complete project for use with Particle Workbench as a zip file here:


  • Extract in your Downloads directory
  • Open the tracker-an020 folder in Workbench using File - Open...; it is a pre-configured project directory.
  • From the Command Palette (Command-Shift-P or Ctrl-Shift-P), use Particle: Configure Project for Device.
  • If you are building in the cloud, you can use Particle: Cloud Flash or Particle: Cloud Compile.
  • If you are building locally, open a CLI window using Particle: Launch CLI then:
particle library copy


The Tracker Edge firmware can be downloaded from GitHub:

You will probably want to use the command line as there are additional commands you need to run after cloning the source:

git clone 
cd tracker-edge
git submodule update --init --recursive
  • Open Particle Workbench.
  • From the command palette, Particle: Import Project.
  • Run Particle: Configure Workspace for Device, select version 1.5.4-rc.1, 2.0.0-rc.3, or later, Tracker, and your device.
  • Run Particle: Flash application (local).

Make sure you've used the Mark As Development Device option for your Tracker device in your Tracker product. If you don't mark the device as a development device it will be flashed with the default or locked product firmware version immediately after connecting to the cloud, overwriting the application you just flashed.

Add the libraries

From the command palette in Workbench, Particle: Install Library then enter Sensor_4_20mA_RK. If you prefer to edit directly, add this:


The full source


Digging in

const size_t NUM_SENSOR_CONFIG = 1;
SensorConfig sensorConfig[NUM_SENSOR_CONFIG] = {
    { A3, "temp", 0, 100, false }
Sensor_4_20mA sensor;

This configure pin A3 (one of the multi-function pins on the M8 connector). "temp" is the JSON key to include in the location publishes.

In this example, we're using a 0-100°C 4-20mA RTD temperature sensor I got from Amazon.

The next parameters are the range of the sensor (0 to 100). The false parameter indicates that the lower bound is the value for 0 mA, not 4 mA.

Last Parameter Meaning
false Lower value is value for 0 mA
true Lower value is the value for 4 mA (default)

More information about the configuration object can be found in the 4-20mA library GitHub.

    .withConfig(sensorConfig, NUM_SENSOR_CONFIG)

This is the initialization of the 4-20mA sensor library. It's set to use the native nRF52 ADC (pin A3), with the configuration we defined above.

void mymyLocationGenerationCallback(JSONWriter &writer, LocationPoint &point, const void *context)

This adds the keys defined in the SensorConfig to the location publishes.