# AGRINOVO-COD-130: Digital UV Absorption COD Sensor with Self-Cleaning Wiper

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

## 1. Overview

The AGRINOVO-COD-130 is a digital UV absorption sensor for measuring Chemical Oxygen Demand (COD) in water. It simultaneously measures absorbance at 254nm and 850nm wavelengths, converting readings to COD, BOD, TOC, and turbidity values. The sensor features a built-in self-cleaning wiper and communicates via RS485 Modbus-RTU, making it suitable for harsh water quality monitoring environments.

### Key Features

- UV absorption measurement (254nm / 850nm)
- COD range: 0 to 300 mg/L (or 0 to 1500 mg/L)
- Resolution: 0.1 mg/L
- Multi-parameter: COD, BOD, TOC, turbidity
- Built-in self-cleaning wiper
- RS485 Modbus-RTU interface
- Wide supply voltage: 12-24 VDC
- Compact: D32mm × L175mm

### Applications

- Wastewater treatment monitoring
- Industrial effluent COD monitoring
- Environmental water quality assessment
- Aquaculture water management
- Process water quality control

## 2. Specifications

| Parameter | Specification |
|:----------|:--------------|
| **Measurement Principle** | UV Absorption |
| **COD Range** | 0 to 300 mg/L or 0 to 1500 mg/L |
| **Resolution** | 0.1 mg/L |
| **Accuracy** | ±10% |
| **Linearity** | <5% |
| **Communication** | RS485, Modbus-RTU |
| **Dimensions** | D32mm × L175mm |
| **Cable Length** | 10m (customizable) |
| **Operating Temp** | 5 to 45°C |
| **Operating Pressure** | 0 to 3 bar |
| **Supply Voltage** | 12-24 VDC |
| **Power Consumption** | 1.5W |

## 3. Wiring

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

## 4. Communication Settings

| Parameter | Value |
|:----------|:------|
| **Protocol** | Modbus-RTU |
| **Baud Rate** | 9600 bps |
| **Data Bits** | 8 |
| **Parity** | None |
| **Stop Bits** | 1 |
| **Default Address** | 0x01 |

## 5. Register Map

All measurement values are IEEE-754 float32, each occupying 2 registers. Byte order: read bytes 1-2-3-4, parse as 4-3-2-1 (little-endian byte swap).

### Measurement Registers (Function 0x03  -  Read Only)

| Address | Description | Range | Data Type |
|:--------|:------------|:------|:----------|
| 0x2600 to 0x2601 | Temperature | 0 to 100°C | Float32 |
| 0x2602 to 0x2603 | COD Value | 0 to 200 mg/L | Float32 |
| 0x2604 to 0x2605 | BOD Value | - | Float32 |
| 0x2606 to 0x2607 | TOC Value | - | Float32 |
| 0x2608 to 0x2609 | Turbidity | 0 to 1000 NTU | Float32 |
| 0x260A to 0x260B | COD Signal | 0 to 2000 | Float32 |

### Configuration Registers (Function 0x03 read / 0x06 write)

| Address | Description | Default | Range | Data Type |
|:--------|:------------|:--------|:------|:----------|
| 0x1100 to 0x1101 | COD Slope K | 1.0 | 0.1 to 10 | Float32 |
| 0x1102 to 0x1103 | COD Offset B | 0.0 | - | Float32 |
| 0x3000 | Device Address | 0x04 | 0x00 to 0xFF | Hex-ASCII |
| 0x3100 | Manual Wipe | 0x0000 | Write 0x0000 to trigger | Hex-ASCII |
| 0x3200 | Wipe Interval | 0x3C (60 min) | - | Hex-ASCII |

## 6. Reading Data

### Read COD value (Float32 from registers 0x2602 to 0x2603)

Read 2 registers starting at 0x2602:

```
Request:  01 03 26 02 00 02 6E 83
Response: 01 03 04 XX XX XX XX [CRC]
```

**Decoding (byte-swap example):**

Received bytes: `8F C2 01 41` → reorder to `41 01 C2 8F` → IEEE-754 float = **8.11 mg/L**

### Read all measurement registers

Read 12 registers from 0x2600:

```
Request:  01 03 26 00 00 0C 4E 87
```

Returns Temperature, COD, BOD, TOC, Turbidity, and COD Signal as 6 float32 values.

## 7. Address Configuration

### Change Address

Write new address to register 0x3000 (Hex-ASCII format):

```
01 06 30 00 XX 00 [CRC]
```

Where `XX` is the new address (e.g., `02` for address 2).

### Broadcast Discovery

Use address 0xFF with only one device connected.

## 8. Calibration

### COD Slope (K) and Offset (B) Adjustment

The COD reading can be adjusted using the linear formula: **COD_adjusted = K × COD_raw + B**

Write K value (float32) to registers 0x1100 to 0x1101 using function 0x10:

```
01 10 11 00 00 02 04 [K float bytes] [CRC]
```

Write B value (float32) to registers 0x1102 to 0x1103 using function 0x10:

```
01 10 11 02 00 02 04 [B float bytes] [CRC]
```

Default: K = 1.0, B = 0.0 (no adjustment).

## 9. Self-Cleaning Wiper

### Trigger Manual Wipe

Write 0x0000 to register 0x3100:

```
01 06 31 00 00 00 87 36
```

### Set Wipe Interval

Write interval (in minutes, Hex-ASCII) to register 0x3200. Default is 0x3C (60 minutes):

```
01 06 32 00 XX 00 [CRC]
```

Where `XX` is the interval in hex (e.g., `3C` = 60 minutes, `78` = 120 minutes).

## 10. Installation Notes

**Placement**

- Fully submerge the measurement window in water
- Ensure no air bubbles near the measurement window
- Water should be still or slow-flowing

**Maintenance**

- Not suitable for high turbidity or high color water bodies
- Replace UV light source every 1 to 2 years depending on usage
- Do not store or use in high-temperature environments
- Avoid direct sunlight for outdoor installations
- Do not use in freezing conditions (wiper damage risk)

## Ordering Information

| Part number | Description |
|:------------|:------------|
| AGRINOVO-COD-130 | Digital UV Absorption COD Sensor with Self-Cleaning Wiper |

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