{
  "metadata": {
    "id": "sensirion-scd30",
    "name": "Sensirion SCD30 CO₂, Humidity, and Temperature Sensor Module",
    "type": "sensor",
    "description": "Dual-channel NDIR CO₂ sensor module with integrated humidity and temperature sensing, internal RH/T compensation, and selectable I2C, Modbus-TTL UART, and PWM outputs.",
    "manufacturer": "Sensirion",
    "part_number": "1-101625-10",
    "datasheet_url": "https://sensirion.com/media/documents/4EAF6AF8/61652C3C/Sensirion_CO2_Sensors_SCD30_Datasheet.pdf",
    "tags": [
      "scd30",
      "co2",
      "ndir",
      "humidity",
      "temperature",
      "i2c",
      "uart",
      "modbus",
      "pwm",
      "0x61",
      "asc",
      "frc",
      "pressure-compensation",
      "sensirion"
    ],
    "schema_version": "1.4.0",
    "version": "1.1.0",
    "taxonomy": [
      "sensor.environmental",
      "sensor.gas"
    ]
  },
  "domains": [
    {
      "domain": "electrical",
      "power_domains": [
        {
          "id": "vdd",
          "name": "VDD",
          "nominal_voltage_V": 3.3,
          "voltage_range_V": [
            3.3,
            5.5
          ],
          "max_current_mA": 75,
          "isolation_type": "non_isolated",
          "ground_reference": "common",
          "description": "Main supply rail for the sensor module. Average current is about 19 mA at a 2 s update interval; peak measurement current can reach 75 mA."
        }
      ],
      "resources": [
        {
          "id": "vdd",
          "name": "VDD",
          "functions": [
            {
              "name": "power_in",
              "signal_class": "power"
            }
          ],
          "connector_type": "surface_pad",
          "power_domain_id": "vdd",
          "description": "Main supply input"
        },
        {
          "id": "gnd",
          "name": "GND",
          "functions": [
            {
              "name": "ground",
              "signal_class": "ground"
            }
          ],
          "connector_type": "surface_pad",
          "power_domain_id": "vdd",
          "description": "Ground reference"
        },
        {
          "id": "tx_scl",
          "name": "TX / SCL",
          "functions": [
            {
              "name": "uart_tx",
              "signal_class": "data"
            },
            {
              "name": "i2c_scl",
              "signal_class": "clock"
            }
          ],
          "connector_type": "surface_pad",
          "power_domain_id": "vdd",
          "description": "UART TX in Modbus/UART mode, or I2C SCL in I2C mode",
          "notes": "Push-pull 3.0 V TX output in Modbus mode. In I2C mode this line has an internal ~45 kOhm pull-up to 3 V and requires an I2C master that supports clock stretching."
        },
        {
          "id": "rx_sda",
          "name": "RX / SDA",
          "functions": [
            {
              "name": "uart_rx",
              "signal_class": "data"
            },
            {
              "name": "i2c_sda",
              "signal_class": "data"
            }
          ],
          "connector_type": "surface_pad",
          "power_domain_id": "vdd",
          "description": "UART RX in Modbus/UART mode, or I2C SDA in I2C mode",
          "notes": "Modbus RX input must not exceed 5.5 V. In I2C mode this line has an internal ~45 kOhm pull-up to 3 V and requires CRC-protected 16-bit word transfers."
        },
        {
          "id": "rdy",
          "name": "RDY",
          "functions": [
            {
              "name": "interrupt",
              "signal_class": "interrupt"
            }
          ],
          "connector_type": "surface_pad",
          "power_domain_id": "vdd",
          "description": "Data-ready output; high when a measurement is ready for readout",
          "notes": "Useful when the host wants to avoid polling the data-ready status command continuously."
        },
        {
          "id": "pwm",
          "name": "PWM",
          "functions": [
            {
              "name": "pwm_output",
              "signal_class": "data"
            }
          ],
          "connector_type": "surface_pad",
          "power_domain_id": "vdd",
          "description": "PWM output carrying CO2 concentration information",
          "notes": "80 Hz, 3.0 V push-pull output. Duty cycle maps linearly from 0 to 5000 ppm after the sensor has been configured and continuous measurement has been started over I2C or Modbus."
        },
        {
          "id": "sel",
          "name": "SEL",
          "functions": [
            {
              "name": "interface_select",
              "direction": "config",
              "signal_class": "static_config"
            }
          ],
          "connector_type": "surface_pad",
          "power_domain_id": "vdd",
          "description": "Interface-selection pad: pull to VDD for UART/Modbus mode, leave floating or tie to GND for I2C mode",
          "notes": "The protocol is latched at power-up and cannot be switched during operation. Do not pull SEL above 4.0 V."
        }
      ],
      "interfaces": [
        {
          "id": "power_input",
          "name": "Power Input",
          "protocol": {
            "type": "power",
            "role": "input"
          },
          "requires": [
            {
              "function": "power_in",
              "count": 1
            },
            {
              "function": "ground",
              "count": 1
            }
          ],
          "description": "Primary 3.3 V to 5.5 V power input"
        },
        {
          "id": "i2c_slave",
          "name": "I2C Slave",
          "protocol": {
            "type": "i2c",
            "role": "slave"
          },
          "requires": [
            {
              "function": "i2c_sda",
              "count": 1,
              "shareable_with": [
                "i2c_scl"
              ]
            },
            {
              "function": "i2c_scl",
              "count": 1,
              "shareable_with": [
                "i2c_sda"
              ]
            },
            {
              "function": "interface_select",
              "count": 1
            }
          ],
          "protocol_max_freq_Hz": 100000,
          "description": "I2C interface with fixed 7-bit address 0x61. SEL must be left floating or tied low at power-up. Sensirion documents internal ~45 kOhm pull-ups to 3 V, CRC-protected 16-bit words, mandatory clock stretching, and no repeated-start support; level shifting may be required for higher-voltage hosts."
        },
        {
          "id": "uart_device",
          "name": "UART / Modbus TTL Device",
          "protocol": {
            "type": "uart",
            "role": "device"
          },
          "requires": [
            {
              "function": "uart_tx",
              "count": 1
            },
            {
              "function": "uart_rx",
              "count": 1
            },
            {
              "function": "interface_select",
              "count": 1
            }
          ],
          "protocol_max_freq_Hz": 19200,
          "description": "TTL-level UART used for Sensirion's point-to-point Modbus interface when SEL is pulled high at power-up. Uses 19200 baud, 8 data bits, 1 start bit, 1 stop bit, no parity."
        },
        {
          "id": "pwm_output",
          "name": "PWM Output",
          "protocol": {
            "type": "pwm",
            "role": "output"
          },
          "requires": [
            {
              "function": "pwm_output",
              "count": 1
            }
          ],
          "description": "PWM output for CO2 concentration measurement after configuration over I2C or Modbus"
        },
        {
          "id": "data_ready_output",
          "name": "Data Ready Output",
          "protocol": {
            "type": "digital",
            "role": "output"
          },
          "requires": [
            {
              "function": "interrupt",
              "count": 1
            }
          ],
          "description": "Digital readiness indicator; high when new data is available"
        }
      ],
      "supply_voltage_V": [
        3.3,
        5.5
      ],
      "metadata": {
        "i2c_address_7bit": "0x61",
        "modbus_address_default": "0x61",
        "interface_selection_pin": "SEL",
        "co2_calibrated_range_ppm": [
          400,
          10000
        ],
        "co2_measurement_range_ppm": [
          0,
          40000
        ],
        "pwm_co2_range_ppm": [
          0,
          5000
        ],
        "co2_accuracy_ppm_plus_percent": {
          "offset_ppm": 30,
          "percent_of_reading": 3
        },
        "co2_repeatability_ppm": 10,
        "co2_temperature_stability_ppm_per_C": 2.5,
        "co2_response_time_s_tau63": 20,
        "co2_lifetime_accuracy_drift_ppm": 50,
        "humidity_range_percent": [
          0,
          100
        ],
        "humidity_accuracy_percent": 3,
        "humidity_repeatability_percent": 0.1,
        "humidity_response_time_s_tau63": 8,
        "humidity_accuracy_drift_percent_per_year_max": 0.25,
        "temperature_range_c": [
          -40,
          70
        ],
        "temperature_operating_range_c": [
          0,
          50
        ],
        "temperature_accuracy_c_at_25c": 0.4,
        "temperature_repeatability_c": 0.1,
        "temperature_response_time_s_tau63_gt": 10,
        "temperature_accuracy_drift_c_per_year_max": 0.03,
        "humidity_operating_range_percent": [
          0,
          95
        ],
        "measurement_interval_s": {
          "default": 2,
          "min": 2,
          "max": 1800
        },
        "i2c_clock_stretching_required": true,
        "i2c_repeated_start_supported": false,
        "i2c_crc8_required": true,
        "i2c_crc8_polynomial_hex": "0x31",
        "i2c_clock_stretching_ms": {
          "typical": 30,
          "max_daily_calibration_event": 150
        },
        "boot_up_time_s_max": 2,
        "automatic_self_calibration_supported": true,
        "forced_recalibration_supported": true,
        "ambient_pressure_compensation_mbar_range": [
          700,
          1400
        ],
        "altitude_compensation_supported": true,
        "temperature_offset_compensation_supported": true,
        "continuous_measurement_mode_persists_after_power_cycle": true,
        "measurement_interval_persists_after_power_cycle": true,
        "asc_state_persists_after_power_cycle": true,
        "temperature_offset_persists_after_power_cycle": true,
        "altitude_compensation_persists_after_power_cycle": true,
        "pwm_base_frequency_hz": 80,
        "pwm_output_voltage_V": 3,
        "pwm_min_step_ppm": 11,
        "avg_current_mA_at_3v3": 19,
        "peak_current_mA_at_3v3": 75,
        "sensor_lifetime_years": 15,
        "maintenance_interval": "none_when_automatic_self_calibration_is_used"
      }
    },
    {
      "domain": "mechanical",
      "package_type": "sensor_module",
      "dimensions_mm": {
        "length": 35,
        "width": 23,
        "height": 7
      },
      "metadata": {
        "weight_g": 3.4,
        "shipping_tray_quantity": 40
      },
      "resources": [],
      "interfaces": []
    }
  ],
  "design_rules": [
    "Budget for about 19 mA average current at the default 2 s measurement interval and up to 75 mA during measurement; provide a stable supply with headroom for those peaks.",
    "Use I2C mode only when SEL is floating or tied to GND at power-up; pull SEL to VDD for UART/Modbus mode. The interface mode cannot be changed while the module is running.",
    "For I2C, ensure the host master supports clock stretching, does not rely on repeated-start transactions, and can tolerate the SCD30's internal ~45 kOhm pull-ups to 3 V or add proper level shifting.",
    "Use the on-board RH/T compensation, pressure or altitude compensation, and temperature-offset correction to match the final enclosure and installation geometry.",
    "Allow the sensor regular exposure to fresh air around 400 ppm for ASC, or use forced recalibration when the installation cannot guarantee that baseline exposure.",
    "Mount the sensor close to the outer shell with generous vent area, keep cavity volume small, isolate it from strong airflow, and place heat sources as far away as possible."
  ],
  "usage_notes": "The SCD30 is a complete sensor module rather than a bare IC. It continuously measures CO2, humidity, and temperature, and exposes those values over I2C or TTL-level Modbus. PWM output is CO2-only and must be configured by first starting continuous measurement over I2C or Modbus.",
  "application_examples": [
    "Demand-controlled ventilation and VAV controllers.",
    "Indoor air-quality monitors and room sensors.",
    "Smart thermostats, building automation nodes, and data loggers."
  ],
  "compatibility_notes": "The SCD30 has a fixed I2C address of 0x61. In I2C mode, SDA and SCL are internally pulled up to 3 V, the bus is limited to 100 kHz, and the master must support clock stretching. In Modbus mode, the UART uses 19200 baud 8N1 TTL signaling with Modbus address 0x61.",
  "warnings": [
    "Do not use this product as a safety, emergency-stop, or life-protecting device.",
    "The CO2 sensing operating range is specified for 0 °C to 50 °C and 0 to 95 %RH non-condensing.",
    "Do not pull SEL above 4.0 V; use a divider if VDD exceeds 4 V and SEL must be driven high.",
    "The same physical pads are multiplexed between I2C and UART/Modbus; do not connect both interfaces at once.",
    "Airflow, sunlight, pressure fluctuations, and nearby heat sources can materially affect measurement quality; follow Sensirion design-in guidance in the final product.",
    "The I2C interface does not support repeated-start transactions, and masters that cannot handle clock stretching may fail intermittently."
  ]
}