Multiple MCP3008 ADCs

Hi,

Has anyone used multiple MCP3008 ADCs in ESPHome.

One chip works fine. When I add a second one, it does not read properly, despite having a separate CS pin.

The platform is Pico (v1) W

Here’s my YAML

spi:
#  - id: spi_bus0
  clk_pin: 2
  mosi_pin: 3
  miso_pin: 0

mcp3008: 
  - id: mcp0  # TXA
    cs_pin: 18
    data_rate: 200kHz

  - id: mcp1  # TXB
    cs_pin: 19
    data_rate: 200kHz

sensor:
## TXA: MCP3008 ADC Board 0
  # Ch 2: PGood
  - platform: mcp3008
    mcp3008_id: mcp0
    unit_of_measurement: "%"
    reference_voltage: 3.3  
    update_interval: 5s
    name: "TXA Power Good" 
    accuracy_decimals: 2
    id: txa_pg
    number: 2     
    filters:   
      - multiply: !lambda return 33; 
      - 
 ## TXB: MCP3008 ADC Board 1
  # Ch 2: PGood
  - platform: mcp3008
    mcp3008_id: mcp1
    unit_of_measurement: "%"
    reference_voltage: 3.3  
    update_interval: 5s
    name: "TXB Power Good" 
    accuracy_decimals: 0
    id: txb_pg
    number: 2     
    filters:   
      - multiply: !lambda return 33;

Any advice?

I don’t think you can use just any pin on this (like you can on esp32). Try changing the CS pins to allowable ones.

And include your log, and how you are determining the error.

Thanks Neel,

With a RP2040, unless the ESPhome code uses the hardware CS function (which is very unusual as it limits the bus to a single SPI device) any legal pin will do.

The log, my apologies for not including it before.

The error is determined by zero values being returned when valid voltages are on MCP3008 pins.

INFO ESPHome 2026.3.1
INFO Reading configuration /config/esphome/txmon.yaml...
INFO Starting log output from 192.168.99.140 using esphome API
INFO Successfully resolved txmon @ 192.168.99.140 in 0.000s
INFO Successfully connected to txmon @ 192.168.99.140 in 0.005s
INFO Successful handshake with txmon @ 192.168.99.140 in 0.158s
[09:44:35.515][I][app:231]: ESPHome version 2026.3.1 compiled on 2026-03-29 18:06:46 +1100
[09:44:35.515][C][logger:229]: Logger:
[09:44:35.515][C][logger:229]:   Max Level: DEBUG
[09:44:35.515][C][logger:229]:   Initial Level: DEBUG
[09:44:35.515][C][logger:236]:   Log Baud Rate: 115200
[09:44:35.515][C][logger:236]:   Hardware UART: USB_CDC
[09:44:35.516][C][spi:066]: SPI bus:
[09:44:35.562][C][spi:152]:   CLK Pin: GPIO2
[09:44:35.562][C][spi:152]:   SDI Pin: GPIO0
[09:44:35.562][C][spi:152]:   SDO Pin: GPIO3
[09:44:35.562][C][spi:074]:   Using HW SPI: SPI
[09:44:35.562][C][i2c.arduino:064]: I2C Bus:
[09:44:35.562][C][i2c.arduino:065]:   SDA Pin: GPIO4
[09:44:35.562][C][i2c.arduino:065]:   SCL Pin: GPIO5
[09:44:35.562][C][i2c.arduino:065]:   Frequency: 400000 Hz
[09:44:35.562][C][i2c.arduino:085]:   Recovery: failed, SDA is held low on the bus
[09:44:35.562][I][i2c.arduino:089]: Results from bus scan:
[09:44:35.562][I][i2c.arduino:095]: Found device at address 0x44
[09:44:35.563][C][i2c.arduino:064]: I2C Bus:
[09:44:35.563][C][i2c.arduino:065]:   SDA Pin: GPIO6
[09:44:35.563][C][i2c.arduino:065]:   SCL Pin: GPIO7
[09:44:35.563][C][i2c.arduino:065]:   Frequency: 400000 Hz
[09:44:35.563][C][i2c.arduino:085]:   Recovery: failed, SDA is held low on the bus
[09:44:35.563][I][i2c.arduino:089]: Results from bus scan:
[09:44:35.563][I][i2c.arduino:091]: Found no devices
[09:44:35.563][C][status_led:018]: Status LED:
[09:44:35.563][C][status_led:152]:   Pin: GPIO64
[09:44:35.563][C][mcp3008:016]: MCP3008:
[09:44:35.563][C][mcp3008:152]:   CS Pin:GPIO18
[09:44:35.564][C][mcp3008:016]: MCP3008:
[09:44:35.566][C][mcp3008:152]:   CS Pin:GPIO19
[09:44:35.586][C][mcp3008:016]: MCP3008:
[09:44:35.586][C][mcp3008:152]:   CS Pin:GPIO20
[09:44:35.586][C][template.sensor:017]: Template Sensor 'db_trans_mpx'
[09:44:35.586][C][template.sensor:017]:   State Class: ''
[09:44:35.586][C][template.sensor:017]:   Unit of Measurement: 'dB'
[09:44:35.586][C][template.sensor:017]:   Accuracy Decimals: 1
[09:44:35.586][C][template.sensor:453]:   Update Interval: 2.0s
[09:44:35.607][C][template.sensor:017]: Template Sensor 'db_falcon_mpx'
[09:44:35.607][C][template.sensor:017]:   State Class: ''
[09:44:35.607][C][template.sensor:017]:   Unit of Measurement: 'dB'
[09:44:35.607][C][template.sensor:017]:   Accuracy Decimals: 1
[09:44:35.607][C][template.sensor:453]:   Update Interval: 2.0s
[09:44:35.607][C][template.sensor:017]: Template Sensor 'db_spare'
[09:44:35.607][C][template.sensor:017]:   State Class: ''
[09:44:35.607][C][template.sensor:017]:   Unit of Measurement: 'dB'
[09:44:35.607][C][template.sensor:017]:   Accuracy Decimals: 1
[09:44:35.607][C][template.sensor:453]:   Update Interval: 1.0s
[09:44:35.637][C][sht4x:068]: SHT4x:
[09:44:35.637][C][sht4x:068]:   Serial number: 0dbc9daa
[09:44:35.637][C][sht4x:073]:   Address: 0x44
[09:44:35.637][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.637][C][mcp3008.sensor:011]:   Pin: 2
[09:44:35.637][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.637][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.637][C][mcp3008.sensor:011]:   Pin: 3
[09:44:35.637][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.679][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.679][C][mcp3008.sensor:011]:   Pin: 4
[09:44:35.679][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.679][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.679][C][mcp3008.sensor:011]:   Pin: 5
[09:44:35.679][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.679][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.679][C][mcp3008.sensor:011]:   Pin: 6
[09:44:35.679][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.679][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.679][C][mcp3008.sensor:011]:   Pin: 2
[09:44:35.679][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.720][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.720][C][mcp3008.sensor:011]:   Pin: 3
[09:44:35.720][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.720][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.720][C][mcp3008.sensor:011]:   Pin: 4
[09:44:35.720][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.720][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.720][C][mcp3008.sensor:011]:   Pin: 5
[09:44:35.720][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.720][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.720][C][mcp3008.sensor:011]:   Pin: 6
[09:44:35.720][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.753][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.753][C][mcp3008.sensor:011]:   Pin: 2
[09:44:35.753][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.754][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.754][C][mcp3008.sensor:011]:   Pin: 3
[09:44:35.754][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.754][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.754][C][mcp3008.sensor:011]:   Pin: 4
[09:44:35.754][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.754][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.754][C][mcp3008.sensor:011]:   Pin: 5
[09:44:35.754][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.773][C][mcp3008.sensor:011]: MCP3008Sensor:
[09:44:35.773][C][mcp3008.sensor:011]:   Pin: 6
[09:44:35.773][C][mcp3008.sensor:011]:   Reference Voltage: 3.30V
[09:44:35.773][C][adc.rp2040:017]: ADC Sensor 'Trans MPX'
[09:44:35.773][C][adc.rp2040:017]:   State Class: 'measurement'
[09:44:35.773][C][adc.rp2040:017]:   Unit of Measurement: '%'
[09:44:35.773][C][adc.rp2040:017]:   Accuracy Decimals: 1
[09:44:35.773][C][adc.rp2040:237]:   Device Class: 'voltage'
[09:44:35.773][C][adc.rp2040:152]:   Pin: GPIO26
[09:44:35.775][C][adc.rp2040:042]:   Samples: 1
[09:44:35.775][C][adc.rp2040:042]:   Sampling mode: average
[09:44:35.775][C][adc.rp2040:453]:   Update Interval: 5.0s
[09:44:35.783][C][adc.rp2040:017]: ADC Sensor 'Falcon MPX'
[09:44:35.783][C][adc.rp2040:017]:   State Class: 'measurement'
[09:44:35.783][C][adc.rp2040:017]:   Unit of Measurement: '%'
[09:44:35.783][C][adc.rp2040:017]:   Accuracy Decimals: 1
[09:44:35.783][C][adc.rp2040:237]:   Device Class: 'voltage'
[09:44:35.784][C][adc.rp2040:152]:   Pin: GPIO27
[09:44:35.797][C][adc.rp2040:042]:   Samples: 1
[09:44:35.797][C][adc.rp2040:042]:   Sampling mode: average
[09:44:35.797][C][adc.rp2040:453]:   Update Interval: 2.0s
[09:44:35.797][C][adc.rp2040:017]: ADC Sensor 'SPARE'
[09:44:35.797][C][adc.rp2040:017]:   State Class: 'measurement'
[09:44:35.797][C][adc.rp2040:017]:   Unit of Measurement: '%'
[09:44:35.797][C][adc.rp2040:017]:   Accuracy Decimals: 1
[09:44:35.798][C][adc.rp2040:237]:   Device Class: 'voltage'
[09:44:35.802][C][adc.rp2040:152]:   Pin: GPIO28
[09:44:35.802][C][adc.rp2040:042]:   Samples: 1
[09:44:35.802][C][adc.rp2040:042]:   Sampling mode: average
[09:44:35.802][C][adc.rp2040:453]:   Update Interval: 1.0s
[09:44:35.824][C][wifi:1510]: WiFi:
[09:44:35.824][C][wifi:1510]:   Local MAC: 28:CD:C1:03:AD:E0
[09:44:35.824][C][wifi:1510]:   Connected: YES
[09:44:35.824][C][wifi:1221]:   IP Address: 192.168.99.140
[09:44:35.824][C][wifi:1232]:   SSID: [redacted]
[09:44:35.824][C][wifi:1232]:   BSSID: [redacted]
[09:44:35.824][C][wifi:1232]:   Hostname: 'txmon'
[09:44:35.824][C][wifi:1232]:   Signal strength: -20 dB ▂▄▆█
[09:44:35.824][C][wifi:1232]:   Channel: 6
[09:44:35.824][C][wifi:1232]:   Subnet: 255.255.255.0
[09:44:35.824][C][wifi:1232]:   Gateway: 192.168.99.1
[09:44:35.824][C][wifi:1232]:   DNS1: 0.0.0.0
[09:44:35.824][C][wifi:1232]:   DNS2: 0.0.0.0
[09:44:35.824][C][esphome.ota:071]: Over-The-Air updates:
[09:44:35.824][C][esphome.ota:071]:   Address: 192.168.99.140:2040
[09:44:35.824][C][esphome.ota:071]:   Version: 2
[09:44:35.826][C][esphome.ota:078]:   Password configured
[09:44:35.842][C][safe_mode:026]: Safe Mode:
[09:44:35.842][C][safe_mode:026]:   Successful after: 60s
[09:44:35.842][C][safe_mode:026]:   Invoke after: 10 attempts
[09:44:35.842][C][safe_mode:026]:   Duration: 300s
[09:44:35.842][C][api:237]: Server:
[09:44:35.842][C][api:237]:   Address: 192.168.99.140:6053
[09:44:35.842][C][api:237]:   Listen backlog: 1
[09:44:35.842][C][api:237]:   Max connections: 4
[09:44:35.843][C][api:244]:   Noise encryption: YES
[09:44:35.855][C][mdns:194]: mDNS:
[09:44:35.855][C][mdns:194]:   Hostname: txmon
[09:44:36.358][D][sensor:124]: 'Falcon MPX' >> 0.3 %
[09:44:36.358][D][sensor:124]: 'db_falcon_mpx' >> -49.2 dB
[09:44:36.467][D][sensor:124]: 'SPARE' >> 0.4 %
[09:44:36.858][D][sensor:124]: 'db_spare' >> -48.6 dB
[09:44:36.858][D][sensor:124]: 'db_trans_mpx' >> -48.0 dB
[09:44:36.956][D][sensor:124]: 'STL Right' >> 0.00 %
[09:44:36.956][D][sensor:124]: 'TXA Fwd Pwr' >> 0.00 %
[09:44:36.958][D][sensor:124]: 'TXA Power Good' >> 0.00 %
[09:44:36.958][D][sensor:124]: 'TXB Refl Pwr' >> 0.00 %
[09:44:36.958][D][sensor:124]: 'TXB Fwd Pwr' >> 0.00 %
[09:44:37.469][D][sensor:124]: 'db_spare' >> -48.6 dB
[09:44:37.471][D][sensor:124]: 'SPARE' >> 0.4 %
[09:44:37.576][D][sensor:124]: 'STL Left' >> 0.00 %
[09:44:37.577][D][sensor:124]: 'TXB Power Good' >> 0.00 %
[09:44:37.577][D][sensor:124]: 'TXA IPA' >> 0.00 %
[09:44:37.746][D][sensor:124]: 'TXA VPA' >> 0.00 %
[09:44:37.746][D][sensor:124]: 'Trans MPX' >> 0.4 %