# AGRINOVO-O3-100: Digital Ozone (O₃) Electrode Sensor

Agrinovo technical datasheet, revision 1.2 (October 2026).
PDF version: https://agrinovo.io/datasheets/sensors/AGRINOVO-O3-100_Datasheet.pdf

## 1. Overview

The AGRINOVO-O3-100 is a digital ozone electrode sensor with integrated electronics and microprocessor for continuous water quality monitoring. It measures dissolved ozone concentration and temperature via RS485 Modbus-RTU interface with automatic or manual temperature compensation.

### Key Features

- Ozone range: 0 to 20.00 mg/L
- Resolution: 0.01 mg/L
- Accuracy: ±0.02 mg/L
- Built-in temperature sensor (TH10K)
- Auto/manual temp compensation
- RS485 Modbus-RTU, IP68
- Pressure rated: 0 to 6 bar
- Dual salt-bridge reference system

### Applications

- Water treatment and disinfection
- Aquaculture ozone monitoring
- Industrial process control
- Environmental water quality monitoring

## 2. Specifications

| Parameter | Specification |
|:----------|:--------------|
| **O₃ Range** | 0.00 to 20.00 mg/L |
| **O₃ Resolution** | 0.01 mg/L |
| **O₃ Accuracy** | ±0.02 mg/L |
| **Temperature Range** | 0 to 70°C |
| **Temperature Resolution** | 0.1°C |
| **Temperature Accuracy** | ±0.5°C |
| **Temperature Sensor** | Thermistor TH10K |
| **Temperature Compensation** | Automatic / Manual |
| **Pressure** | 0 to 6 bar |
| **Reference System** | Dual salt-bridge, eco-friendly liquid junction |

## 3. Electrical Characteristics

| Parameter | Specification |
|:----------|:--------------|
| **Supply Voltage** | 12-24 VDC |
| **Power Consumption** | ≤0.5W |
| **Isolation** | 2500Vrms |
| **Housing Material** | Glass + PP + POM |
| **Mounting Thread** | PG13.5 |
| **Cable Length** | 5m |
| **Connector** | Terminal |
| **Protection Rating** | IP68 (submersible) |
| **Companion** | A580 gas-tight flow cell |
| **Electrode Lifespan** | ~12 months (typical, conditions dependent) |
| **Calibration Interval** | ~3 months (typical, conditions dependent) |

## 4. Wiring

| Wire Color | Function | Description |
|:-----------|:---------|:------------|
| **Red** | V+ | DC Power Supply (12-24V DC) |
| **Black** | GND | DC Power Ground |
| **Green** | RS485-A | Data T/R+ |
| **White** | RS485-B | Data T/R− |

## 5. Communication Settings

| Parameter | Value |
|:----------|:------|
| **Protocol** | Modbus-RTU |
| **Baud Rate** | 9600 bps (configurable: 1200/2400/4800/9600/19200) |
| **Data Bits** | 8 |
| **Parity** | None |
| **Stop Bits** | 1 |
| **Default Address** | 0x01 (range 1 to 247) |

**Notes:**

- All registers are dual-byte (16-bit). Transmitted high byte first, low byte second.
- Negative integers use two's complement (−1 = 0xFFFF, −2 = 0xFFFE).
- CRC16: Standard Modbus, high byte first, low byte second. CRC bypass code: 0x2A2A.
- Command frame length is fixed at 8 bytes. Frames shorter than 8 bytes after a 0.1s gap are ignored.

## 6. Register Map

The sensor has three register groups: **Measurement** (real-time data), **Parameter** (configuration), and **Information** (device status/identity).

### 6.1 Measurement Registers  -  Integer Mode (Function 0x04)

| Address | Description | Range | Scaling | R/W |
|:--------|:------------|:------|:--------|:----|
| 0x0000 | O₃ Value | 0 to 2000 | ÷100 → mg/L | R |
| 0x0001 | O₃ Decimal + Unit | - | See unit table | R |
| 0x0004 | Electrode Signal | −1000 to 4000 | ÷100 → mV | R |
| 0x0005 | Signal Decimal + Unit | - | See unit table | R |
| 0x0008 | Temperature | −100 to 1100 | ÷10 → °C | R |
| 0x0009 | Temp Decimal + Unit | - | See unit table | R |

**Over-range indicators:** 0x7FFF = above upper limit, 0x8000 = below lower limit.

### 6.2 Measurement Registers  -  Float Mode (Function 0x03)

Each value occupies 2 registers (float32):

| Address | Description | Range | Unit | R/W |
|:--------|:------------|:------|:-----|:----|
| 0x0000 to 0x0001 | O₃ Value | 0.00 to 20.00 | mg/L | R |
| 0x0004 to 0x0005 | Electrode Signal | −10.00 to 40.00 | mV | R |
| 0x0008 to 0x0009 | Temperature | −10.0 to 110.0 | °C | R |

### 6.3 Parameter Registers (Function 0x03 read / 0x06 write)

| Address | Description | Range | Default | R/W |
|:--------|:------------|:------|:--------|:----|
| 0x0019 | O₃ Calibration Status | BIT0=zero, BIT1=slope | - | R/D |
| 0x001A | O₃ Electrode Offset | −0.30 to 0.30 mg/L (int: −30 to 30) | 0.00 mg/L | R/D |
| 0x001B | Offset Decimal + Unit | 0x020E | - | R/D |
| 0x001C | O₃ Electrode Slope | 30.0 to 300.0% (int: 300 to 3000) | 100.0% | R/D |
| 0x001E | Slave Address | 1 to 247 (0xFF = broadcast) | 1 | R/W |
| 0x001F | Baud Rate | 0:1200 · 1:2400 · 2:4800 · 3:9600 · 4:19200 | 3 (9600) | R/W |
| 0x0020 | Temp Compensation Type | 0: Manual · 1: Automatic | 1 (Auto) | R/W/D |
| 0x0021 | Temp Setpoint / Offset | Manual: −10.0 to 110.0°C · Auto: −10.0 to 10.0°C (×10) | 25.0 / 0.0°C | R/W/D |
| 0x002D | Filter Coefficient | 1 to 16 | - | R/W |

**R/W/D:** D = reset to default by factory restore. Registers without D are unaffected by factory restore.

### 6.4 Information Registers (Function 0x03 read / 0x06 write)

| Address | Description | Values | R/W |
|:--------|:------------|:-------|:----|
| 0x0040 | Working Mode | 0x0010: Measurement · 0x0050: Settings · 0x0060: Calibration | R/W |
| 0x0041 | Mode Parameter | See settings/calibration sections | R/W |
| 0x0042 | Work Event | - | R |
| 0x0043 | Calibration Status & Operation | See calibration section | R/W |
| 0x0044 | Device Type | 0x0008 (DOZ) | R |
| 0x0045 | Device Model | 0x1210 | R |
| 0x0046 | Software Version | BCD coded | R |
| 0x0047 | Hardware Version | BCD coded | R |
| 0x0048 | Serial Number High | BCD coded | R |
| 0x0049 | Serial Number Low | BCD coded | R |

## 7. Reading Data

### Integer Mode  -  Read O₃, electrode signal, and temperature (Function 0x04)

Read 10 registers from 0x0000:

```
Request:  01 04 00 00 00 0A 70 0D
Response: 01 04 14 03 E6 02 0E 03 E6 02 0E 07 CB 02 00 00 00 00 00 00 FA 01 0B F5 80
```

**Decoding:**

| Register | Hex | Decimal | Scaling | Result |
|:---------|:----|:--------|:--------|:-------|
| 0x0000 O₃ Value | 0x03E6 | 998 | ÷100 | **9.98 mg/L** |
| 0x0004 Electrode Signal | 0x07CB | 1995 | ÷100 | **19.95 mV** |
| 0x0008 Temperature | 0x00FA | 250 | ÷10 | **25.0°C** |

### Float Mode  -  Read O₃, electrode signal, and temperature (Function 0x03)

Read 10 registers from 0x0000:

```
Request:  01 03 00 00 00 0A C5 CD
Response: 01 03 14 E7 2F 41 1F DA 2A 41 1F DA 2A 41 9F 00 00 00 00 75 26 41 C7 5E CC
```

**Decoding:**

| Register | Bytes | Float Value | Result |
|:---------|:------|:------------|:-------|
| 0x0000 to 0x0001 O₃ | E7 2F 41 1F | 9.993941 | **9.99 mg/L** |
| 0x0004 to 0x0005 Electrode | DA 2A 41 9F | 19.981525 | **19.98 mV** |
| 0x0008 to 0x0009 Temperature | 75 26 41 C7 | 24.932201 | **24.9°C** |

## 8. Address Configuration

### Change Address (0x01 → 0x02)

```
Request:  01 06 00 1E 00 02 68 0D
Response: 01 06 00 1E 00 02 68 0D
```

### Change Baud Rate (9600 → 2400)

```
Request:  01 06 00 1F 00 01 79 CC
Response: 01 06 00 1F 00 01 79 CC
```

### Broadcast Discovery

Use address 0xFF with only one device connected.

## 9. Calibration

O₃ calibration supports up to 2 points: **slope** and **zero**. Slope must be calibrated first.

### Calibration Flow

1. Place the sensor in standard solution.
2. Write the standard value (slope) or zero-point code to calibration register (0x0043).
3. Wait for completion. Read 0x0043 status:
   - **0:** Calibration successful (returned to measurement mode)
   - **1:** Calibrating  -  read again shortly
   - **2:** No valid standard value received within 180s (returned to measurement)
   - **3:** Signal unstable or out of range within 180s (returned to measurement)
   - **4:** Sensor performance (slope/offset) out of limits (returned to measurement)

### Calibrate Slope Point (e.g. 5.00 mg/L)

Write 500 (0x01F4) to register 0x0043:

```
Request:  01 06 00 43 01 F4 78 09
Response: 01 06 00 43 01 F4 78 09
```

### Calibrate Zero Point

Write 0x0001 to register 0x0043:

```
Request:  01 06 00 43 00 01 B9 DE
Response: 01 06 00 43 00 01 B9 DE
```

### Query Calibration Status

```
Request:  01 03 00 43 00 01 75 DE
Response: 01 03 02 00 00 B8 44
```

Status is in register 0x0019: BIT0 = zero calibrated, BIT1 = slope calibrated.

- 0x0000  -  No calibration
- 0x0002  -  Slope calibrated only
- 0x0003  -  Both slope and zero calibrated

### Clear All Calibration

Write 0x7FFF to register 0x0043:

```
Request:  01 06 00 43 7F FF 18 6E
```

## 10. Temperature Compensation

### Set to Manual Compensation

```
Request:  01 06 00 20 00 00 88 00
Response: 01 06 00 20 00 00 88 00
```

When manual: register 0x0021 is the manual temperature setpoint (×10).

### Set to Automatic Compensation

```
Request:  01 06 00 20 00 01 49 C0
Response: 01 06 00 20 00 01 49 C0
```

When automatic: register 0x0021 is the temperature offset (×10). Default 0.0°C.

### Set Temperature Offset to −5.0°C

```
Request:  01 06 00 21 FF CE 19 A4
Response: 01 06 00 21 FF CE 19 A4
```

## 11. Factory Reset

Factory reset requires two sequential commands:

**Step 1  -  Enter Settings Mode** (write 0x0050 to 0x0040):

```
Request:  01 06 00 40 00 50 88 22
Response: 01 06 00 40 00 50 88 22
```

**Step 2  -  Execute Factory Reset** (write 0x7FFF to 0x0041):

```
Request:  01 06 00 41 7F FF B9 AE
Response: 01 06 00 41 7F FF B9 AE
```

This clears all calibration data, resets temperature mode to automatic, offset to 0.0°C, and restores default parameter values. The device will restart.

## 12. Error Handling

When an invalid command is received, the device responds with the function code + 0x80:

| Error Code | Description |
|:-----------|:------------|
| 01 | Invalid function code (only 0x03, 0x04, 0x06 supported) |
| 02 | Invalid register address |
| 03 | Invalid register count (exceeds register group boundary) |
| 04 | Invalid modification value (out of range) |
| 05 | CRC error |
| 06 | Write to read-only register |

## 13. Common Commands Reference

### Read Registers

| Command | Addr | Func | Start | Count | CRC |
|:--------|:-----|:-----|:------|:------|:----|
| Read measurement (integer) | 01 | 04 | 00 00 | 00 0A | 70 0D |
| Read measurement (float) | 01 | 03 | 00 00 | 00 0A | C5 CD |
| Read all parameters | 01 | 03 | 00 19 | 00 0C | 94 08 |
| Read all info registers | 01 | 03 | 00 40 | 00 0A | C4 19 |

### Write Registers

| Command | Addr | Func | Register | Value | CRC |
|:--------|:-----|:-----|:---------|:------|:----|
| Set address to 0x02 | 01 | 06 | 00 1E | 00 02 | 68 0D |
| Set baud to 2400 | 01 | 06 | 00 1F | 00 01 | 79 CC |
| Temp comp → manual | 01 | 06 | 00 20 | 00 00 | 88 00 |
| Temp comp → auto | 01 | 06 | 00 20 | 00 01 | 49 C0 |
| Temp offset −5.0°C | 01 | 06 | 00 21 | FF CE | 19 A4 |
| Calibrate slope 1.00 mg/L | 01 | 06 | 00 43 | 00 64 | 79 F5 |
| Calibrate zero point | 01 | 06 | 00 43 | 00 01 | B9 DE |
| Query calibration status | 01 | 03 | 00 43 | 00 01 | 75 DE |

## 14. Unit Lookup Table

The low byte of "Decimal + Unit" registers (0x0001, 0x0005, 0x0009) contains the unit code:

| Code | Unit | Code | Unit | Code | Unit |
|:-----|:-----|:-----|:-----|:-----|:-----|
| 0x00 | mV | 0x01 | nA | 0x02 | uA |
| 0x03 | mA | 0x04 | Ω | 0x05 | KΩ |
| 0x06 | MΩ | 0x07 | uS | 0x08 | mS |
| 0x09 | S | 0x0A | pH | 0x0B | °C |
| 0x0C | °F | 0x0D | ug/L | 0x0E | mg/L |
| 0x0F | g/L | 0x10 | ppb | 0x11 | ppm |
| 0x12 | ppt | 0x13 | % | 0x14 | mbar |
| 0x15 | bar | 0x16 | mmHg | | |

The high byte contains the number of decimal places for the value register.

## 15. Installation Notes

**Placement**

- Requires A580 gas-tight flow cell
- Immersion or flow-through installation
- Mount using PG13.5 thread
- Ensure probe tip is fully submerged
- Avoid air bubbles on electrode surface

**Environment & Maintenance**

- Working temperature: 0 to 70°C
- Pressure: 0 to 6 bar, IP68 submersible
- Clean electrode periodically
- Re-calibrate every ~3 months
- Electrode lifespan ~12 months (typical)
- Store in clean water when not in use

## 16. Troubleshooting

| Symptom | Possible Cause | Action |
|:--------|:---------------|:-------|
| **No communication response** | Wiring fault, parameter mismatch, or CRC error | Check RS485 A/B wiring for shorts or loose connections; verify baud rate, address, and N-8-1 settings match; confirm CRC checksum |
| **Measurement over-range** | Actual concentration exceeds range, fouled electrode, or invalid calibration | Verify medium concentration is within 0 to 20 mg/L; clean electrode probe; re-calibrate sensor |
| **Large data fluctuations** | Turbulence/bubbles in medium, low filter coefficient, or temperature compensation drift | Eliminate turbulence and air bubbles; increase filter coefficient (register 0x002D); re-calibrate temperature compensation |

## Ordering Information

| Part number | Description |
|:------------|:------------|
| AGRINOVO-O3-100 | Digital Ozone (O₃) Electrode Sensor |

## Revision History

| Rev | Date | Changes |
|:----|:-----|:--------|
| 1.0 | June 2026 | Initial release |
| 1.1 | August 2026 | Layout revision |
| 1.2 | October 2026 | New layout |

## Contact

Agrinovo, https://agrinovo.io/products, contact@agrinovo.io, +972 54 688 8148 (direct / WhatsApp).
Specifications subject to change without notice.
