The iSentrol Mod X0 pulse counter
- tsp
Last update 21 May 2025
5 mins
Introduction
In this article, we explore the iSentrol Mod X0, a versatile and compact flow sensor module designed to read and interpret pulses from standard flow transducers. Acting as a digital water flow meter, the Mod X0 supports ModBus communication, allowing for seamless integration into a variety of data logging and automation setups.
Iβve tested the module in two real-world scenarios:
- First, with the YF-B5 Hall-based water flow sensor as its primary use case, where the module uses the sensorβs K factor to convert pulses into meaningful flow rates.
- Second, in a more experimental setup, with the WH-SP-WS01 Anemometer, utilizing only its raw pulse frequency output to determine wind speed. In this configuration, I bypass cumulative counting and instead apply a simple K factor conversion to estimate current air velocity in meters per second.
This post includes:
- A breakdown of the default settings
- Documentation of the ModBus registers (including corrections where the original documentation was incorrect)
- Detailed formulas for converting raw register values into physical quantities like liters per minute and meters per second.


Default settings
Β |
Β |
Baud rate |
9600 |
ModBus address |
1 |
Flowmeter constant |
500 |
ModBus Registers
Supported commands are:
- Read holding registers
- Write single register
- Write multiple registers
Unfortunately the documentation supplied by many merchants is not correct. Iβve found one in a YouTube video by the manufacturer though that seems to fit when applied to my sensor:
Address |
Name |
Description |
Unit |
Scaling / Notes |
0x0000 |
Baud Rate |
Communication baud rate setting |
- |
Value is 0: 2400, 1: 4800, 2: 9600, 3: 19200. Reverts to 9600 on invalid values. |
0x0001 |
Device Address |
ModBus device ID |
- |
Range: 1β247 (0x0001 β0x00F7 ). |
0x0002 |
Decimal places |
Number of decimal places, defaults to 2 |
- |
Not sure of effect, default 2 |
0x0003 |
Sensor Pulse K Factor |
Number of pulses per liter |
pulses/L |
Stored as 100x the actual value (50000 is 500.00 pulses/L) |
0x0004 |
Permanent Cumulative Flow β High Register |
High 16 bits of permanently stored accumulated volume |
Liters |
Combine with 0x0004 : Total_Liters = High * 65536 + Low . |
0x0005 |
Permanent Cumulative Flow β Low Register |
Low 16 bits of permanently stored accumulated volume |
Liters |
See above. Rolls into 0x0003 when reaching 65535. |
0x0006 |
Permanent Cumulative Flow β Decimal |
Decimal portion of cumulative volume |
Liters |
Stored as 100Γ actual decimal value. E.g., 25 β 0.25 L . |
0x0007 |
Permanent Accumulated Pulse Counter |
Pulse counter until 1L is reached |
pulses |
Resets to 0 after 1L worth of pulses is accumulated (based on K factor). |
0x0008 |
? |
? |
- |
Reserved |
0x0009 |
? |
? |
L/min |
Reserved (default 100) |
0x000A |
? |
? |
L/min |
Reserved (default 1500) |
0x000B |
? |
? |
- |
Reserved (default 4000) |
0x000C |
? |
? |
- |
Reserved (default 50) |
0x000D |
Temporary Cumulative Flow β High Register |
High 16 bits of temporarily stored accumulated volume (cleared on power loss) |
Liters |
Same format as 0x0003/0x0004 , resets on power loss. |
0x000E |
Temporary Cumulative Flow β Low Register |
Low 16 bits of temporarily stored accumulated volume |
Liters |
See above. |
0x000F |
Temporary Cumulative Flow β Decimal |
Decimal portion of temporary cumulative volume |
Liters |
Stored as 100Γ actual decimal value. Resets on power loss. |
0x0010 |
Temporary Accumulated Pulse Counter |
Pulse counter toward 1L for temporary total |
pulses |
Same as 0x0006 , but for temporary flow. |
0x0011 |
Real-Time Flow Rate |
Instantaneous flow rate |
L/min |
Stored as 100Γ actual value. E.g., 315 β 3.15 L/min . |
0x0012 |
Real-Time Pulse Rate |
Current sensor pulse frequency |
Hz |
Useful for debugging and calibration. |
0x0013 |
? |
? |
- |
Reserved |
0x0014 |
? |
? |
- |
Reserved |
Encoding and decoding registers
K factor
The K factor represents the number of pulses generated per liter of flow. Since the Mod X0
stores only integer values, the K factor is scaled by a factor of 100 to retain two decimal places of precision, enabling a resolution down to 0.01 pulses per liter. The stored value in the register can thus be calculated as:
$
\begin{aligned}
K_{reg} &= 100 * \frac{f}{Q}
&= 100 * \frac{\frac{pulses}{s}}{\frac{l}{s}} = 100 * \frac{pulses}{liters}
\end{aligned}
$
Permanent cumulative flow
The total accumulated flow volume (in liters) is stored across three 16-bit registers:
0x0004
: high word of the integer part ($F_{high}$)
0x0005
: low word of the integer part ($F_{low}$)
0x0006
: fractional part scaled by 100 ($F_{frac}$)
The total value can be reconstructed as:
$
\begin{aligned}
F_{total} = F_{high} * 65536 + F_{low} + \frac{F_{frac}}{100}
\end{aligned}
$
Temporary cumulative flow
This register group behaves identically to the permanent cumulative flow, representing a resettable volume counter (in liters). It is stored in:
0x000D
: high word of integer part ($F_{high}$)
0x000E
: low word of integer part ($F_{low}$)
0x000F
: fractional component again scaled by 100 ($F_{frac}$)
The value is calculated using the same formula:
$
\begin{aligned}
F_{total} = F_{high} * 65536 + F_{low} + \frac{F_{frac}}{100}
\end{aligned}
$
Pulse counters
Registers 0x0007
and 0x0010
store the raw pulse counts for the permanent and temporary flow measurements, respectively. These counters increment with each detected pulse and can be used for low-level diagnostics or debugging. Once the count reaches the stored $K$ value, it indicates that one liter of fluid has passed and they wrap to zero again.
Real-Time flow rate
The real-time flow rate is stored in register 0x0011
, expressed in liters per minute, scaled by a factor of 100 for precision. The actual flow rate is obtained as:
$
\begin{aligned}
Q &= \frac{F_{flow}}{100}
\end{aligned}
$
This article is tagged: Sensor, RS485, ModBus