{
  "spec_version": 1,
  "slug": "seeed-s-nh3-01",
  "manufacturer": "Seeed Studio",
  "model": "S-NH3-01 industrial-grade RS485 ammonia sensor",
  "category": "Gas detector",
  "supplier_url": "https://cdn.shopify.com/s/files/1/0418/3749/4423/files/Seeed_Studio_S-NH3-01_Industrial-Grade_RS485_NH3_Sensor__Datasheet.pdf",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 15,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst",
    "native_interface": "rs485",
    "serial": {
      "parity": "None",
      "baud_rate": 9600,
      "data_bits": 8,
      "stop_bits": 1
    }
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 8192,
      "count": 2,
      "name": "NH3 concentration",
      "data_type": "Float32",
      "units": "ppm",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "32-bit IEEE-754 float, big-endian. Range 0...100 ppm; the document's example frame returns 3CBB282F = 0.0228 ppm."
    },
    {
      "address": 8196,
      "count": 1,
      "name": "Temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Signed 16-bit, divided by 100 in the document (0x0AF9 returned = 2809 = 28.09 °C). Range -40...85 °C."
    },
    {
      "address": 8198,
      "count": 1,
      "name": "Relative humidity",
      "data_type": "UInt16",
      "units": "%RH",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Unsigned 16-bit, divided by 100 in the document (0x18BD returned = 6333 = 63.33 %RH). Range 10...95 %RH."
    },
    {
      "address": 8200,
      "count": 1,
      "name": "Measurement range",
      "data_type": "UInt16",
      "units": "ppm",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Maximum NH3 range of the sensor, default 100 ppm."
    },
    {
      "address": 8206,
      "count": 1,
      "name": "Zero calibration command",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "W",
      "description": "Write-only, function code 0x06: 1 = calibrate the user zero point, 0 = restore the factory zero point."
    },
    {
      "address": 8224,
      "count": 2,
      "name": "User concentration calibration",
      "data_type": "Float32",
      "units": "ppm",
      "scale_factor": 1,
      "offset": 0,
      "access": "W",
      "description": "Write-only, function code 0x10, two registers: the reference concentration as an IEEE-754 float (the document's example writes 1.2 ppm as 0x3F99999A to 0x2020)."
    }
  ],
  "combined_registers": [],
  "notes": "Source: Seeed Technology 'NH3 Sensor Datasheet, Module: S-NH3-01, Version: V1.1' (17 pages, (c)2008-2021), vendor-hosted PDF at the URL above (opened 7 Nov 2026): section 3.1 framing, 3.2 register table, 3.3 register descriptions and worked frames, 3.5 calibration instructions. Factory serial settings from section 3.1: 9600 bps, one start bit, 8 data bits, no parity, one stop bit. Addressing: all rows are read with function code 0x03 and written with 0x06/0x10 to the hex addresses printed in the table (0x2000...), and every worked frame uses those numbers unchanged, so they are stored zero-based. The document contradicts itself on the factory slave address: section 3.2 states 'Default address: 0x0F (hex)' and all three worked read frames in section 3.3 and the calibration example in section 3.5 address the sensor as 0x0F, while the Modbus debugging-software screenshot text in section 3.4 says 'the default slave address is 1' and one calibration example frame in section 3.5 uses 0x01. This seed follows the explicit statement in the register section and the register-level examples: unit ID 15 (0x0F), range 0x01...0xF7. The 0x2020/0x2021 write block is entered as one Float32 row; the surrounding description of address 0x2030 in the calibration table is garbled in the document (it belongs to the 0x2020 example), so it is not claimed."
}
