# AGRINOVO-DO-130: Dissolved Oxygen Sensor with Self-Cleaning Brush

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

## 1. Overview

The AGRINOVO-DO-130 is a digital dissolved oxygen sensor using RS485 Modbus-RTU protocol. It provides DO concentration and temperature readings as little-endian floating-point values, with salinity and atmospheric pressure compensation. Features an integrated self-cleaning brush for low-maintenance operation in aquaculture and water monitoring applications.

> **Power Requirement:** 12-24V DC
> **Self-Cleaning:** Automatic brush with configurable interval

### Key Features

- DO measurement (mg/L)
- Temperature measurement (°C)
- Little-endian float32 data
- Fixed 9600 baud rate
- Salinity compensation (ppt)
- Pressure compensation (kPa)
- Self-cleaning brush
- RS485 Modbus-RTU
- 12-24V DC power supply

### Applications

- Aquaculture monitoring
- Water quality analysis
- Environmental monitoring
- Industrial process control

## 2. Specifications

| Parameter | Specification |
|:----------|:--------------|
| **DO Unit** | mg/L |
| **Temperature Unit** | °C |
| **Salinity Range** | 1 ppt minimum |
| **Pressure Unit** | kPa |
| **Supply Voltage** | 12-24 VDC |
| **Baud Rate** | Fixed 9600 bps |

## 3. Wiring

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

> **Note:** If A/B labels don't match your transceiver, swap connections.

## 4. Communication Settings

| Parameter | Value |
|:----------|:------|
| **Protocol** | Modbus-RTU |
| **Baud Rate** | 9600 bps |
| **Data Bits** | 8 (LSB first) |
| **Parity** | None |
| **Stop Bits** | 1 |
| **Checksum** | CRC16 |

## 5. Register Map

### Data Encoding

DO and Temperature are **float32** in **little-endian byte order**.

### Measurement Registers (Function 0x03)

| Address | Registers | Description |
|:--------|:----------|:------------|
| 0x0000 | 4 | DO (float32) + Temp (float32) |
| 0x000A | 2 | Production Number |
| 0x0010 | 1 | Slave Address |
| 0x0062 | 1 | Salinity (ppt) |
| 0x0064 | 1 | Atmospheric Pressure (kPa × 100) |
| 0x0014 | 1 | Brush Interval (seconds) |

### Configuration Registers (Function 0x10)

| Address | Description | Notes |
|:--------|:------------|:------|
| 0x0010 | Set Slave Address | Range: 1 to 250 |
| 0x0011 | Field Calibration | Atmospheric pressure × 100 for calibration |
| 0x0013 | Manual Brush Trigger | Write 0x0000 to clean once |
| 0x0014 | Brush Interval | Seconds (e.g., 180 = 3 min) |
| 0x0021 | Reset Calibration | Write 0x0014 to restore factory |
| 0x0062 | Set Salinity | Value in ppt |
| 0x0064 | Set Atmospheric Pressure | kPa × 100 (range: 8000-13000) |

## 6. Reading Data

### Read DO + Temperature

Read 4 registers from 0x0000:

```
Request:  01 03 00 00 00 04 44 09
Response: 01 03 08 [DO_4B] [Temp_4B] [CRC]
```

**Decoding (Little-endian float32):**

Example bytes `48 E1 0A 41`:

| Received | Reordered | Result |
|:---------|:----------|:-------|
| 48 E1 0A 41 | 41 0A E1 48 | **8.68 mg/L** |

## 7. Address Configuration

### Read Address (Broadcast 0xFF)

```
FF 03 00 10 00 01 90 11
```

### Set New Address

Write to 0x0010 using function 0x10:

```
[OLD] 10 00 10 00 01 02 [NEW] 00 [CRC]
```

## 8. Salinity Compensation

### Read Salinity

```
01 03 00 62 00 01 25 D4
```

Response: `0x0A 0x00` = 10 ppt

### Write Salinity (10 ppt)

```
01 10 00 62 00 01 02 0A 00 A8 B2
```

## 9. Calibration

### Field Calibration

1. Place sensor in saturated DO (air) until stable
2. Write atmospheric pressure to 0x0011

### Reset to Factory

Write to 0x0021 to restore factory calibration.

## 10. Self-Cleaning Brush

### Manual Cleaning Trigger

Trigger immediate brush cleaning cycle by writing 0x0000 to register **0x0013** using function **0x06** (write single register):

**Example (Address 0x03):**

```
Request:  03 06 00 13 00 00 79 ED
Response: 03 06 00 13 00 00 79 ED (echo)
```

The brush cycle typically takes 3-5 seconds to complete.

### Set Automatic Cleaning Interval

Write interval (in **SECONDS**) to register **0x0014** using function **0x06**.

**Set to 180 seconds (3 minutes) - Address 0x03:**

```
Request:  03 06 00 14 00 B4 C8 5B
Response: 03 06 00 14 00 B4 C8 5B (echo)
```

Value `0x00B4` = 180 seconds = 3 minutes

### Read Current Interval

Read 1 register from **0x0014** using function **0x03**:

**Example (Address 0x03):**

```
Request:  03 03 00 14 00 01 C5 EC
Response: 03 03 02 00 B4 C1 F3
```

Response `0x00B4` (big-endian) = 180 seconds

### Maintenance Recommendations

| Environment | Cleaning Interval | Seconds | Notes |
|:------------|:------------------|:--------|:------|
| **Clean water** | Every 2-4 hours | 7200-14400 | Low biofouling |
| **Aquaculture** | Every 1 hour | 3600 | Moderate biofouling |
| **High density** | Every 30 minutes | 1800 | High biofouling |
| **Wastewater** | Every 10-15 minutes | 600-900 | Very high biofouling |
| **Manual override** | As needed | Write 0 to 0x0013 | Immediate clean |

### Calibration Interval and Membrane

- Recalibration interval depends on the water type and the amount of biofouling and algae. Under normal conditions, calibrate every 6-8 months; the self-cleaning brush handles routine cleaning between calibrations.
- The membrane cap is replaceable, typically after 2+ years of use.

## Ordering Information

| Part number | Description |
|:------------|:------------|
| AGRINOVO-DO-130 | Dissolved Oxygen Sensor with Self-Cleaning Brush |

## Revision History

| Rev | Date | Changes |
|:----|:-----|:--------|
| 1.0 | June 2026 | Initial release |
| 1.1 | August 2026 | Layout revision |
| 1.2 | October 2026 | New layout; corrected Modbus example CRC values |

## Contact

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