Is ADS1115 16-bit 4-Channel Precision ADC Compatible with Home Assistant (ESPHome)?
Electrical Specifications
Always confirm pin assignments against the manufacturer datasheet before wiring.
Compatibility Overview
16-bit high-resolution ADC expander adding 4 precision analog measurement channels with programmable gain amplifier.
Wiring ADS1115 16-bit 4-Channel Precision ADC to ESP32
| Module pin | ESP32 | Note |
|---|---|---|
| VDD | 3V3 | No input may go above VDD + 0.3V whatever the gain, so the supply sets the measurable range. Breakouts pull SDA and SCL up to VDD, so 3.3V also keeps the bus at ESP32 levels. |
| GND | GND | |
| SCL | GPIO22 | |
| SDA | GPIO21 | |
| ADDR | GND | 0x48, as in the config. To VDD is 0x49, to SDA 0x4A, to SCL 0x4B. |
| ALRT | unconnected | The comparator and conversion-ready output. ESPHome does not use it. |
| A0 | the signal | Measured against GND (multiplexer A0_GND). A1–A3 are free for more sensor blocks. |
Host pins are the ones the configuration on this page uses. Move a pin here and change it in the YAML — they are documented together so they cannot disagree.
Technical Specification Matrix
| Feature / Attribute | Specification / Status |
|---|---|
| Hardware Protocol | I2C Bus / 3.3V |
| Bridge Required | NO |
| Border Router Needed | None |
| Hardware Capabilities & Peripherals | Analog Channel A0 (V) Channel A1 (V) Channel A2 (V) Channel A3 (V) Note: these entities come from the ESPHome configuration you flash — each one needs its matching component in that YAML before it appears. |
| Pairing Complexity | Intermediate |
| Factory Reset Instruction | Press BOOT button while resetting. |
Wire, Flash, Adopt, Check
Wire it up
Follow the wiring table above. The ESP32 pins there are the ones the configuration uses, so if you move one, change it in both places.
Flash the configuration
Create a new device in the ESPHome dashboard (the Home Assistant add-on) and paste the configuration below into it, or save it as emb_esp32_ads1115_ard.yaml and run esphome run emb_esp32_ads1115_ard.yaml. The first flash goes over USB. If it is not detected, press BOOT button while resetting to put it in download mode. Every update after that is over the air.
Adopt it in Home Assistant
Settings → Devices & Services. A node on the same network shows up as a discovered ESPHome device within a minute of joining Wi-Fi; choose Configure and enter the API encryption key from your secrets.yaml. If discovery does not find it, add the ESPHome integration by hand with the node's IP address.
Check it works
The I2C scan at boot lists 0x48. A0 tied to GND reads close to 0V, and A0 on the 3.3V rail reads close to 3.3V and agrees with a multimeter. No 0x48 in the scan is SDA and SCL swapped or ADDR not at ground. A value that never moves is the multiplexer pointing at a different channel from the one wired. A reading a steady few millivolts low on every channel can be a clone chip, and calibrates out.
ESPHome Configuration
Starting configuration for ADS1115 16-bit 4-Channel Precision ADC on ESP32. Untested on hardware — verify wiring and pins against your own board.
# ESPHome configuration for ADS1115 16-bit 4-Channel Precision ADC
# Host: ESP32. Pin numbers below are host-side defaults — any free
# GPIO will do, and you should change them to match your own wiring.
esphome:
name: emb_esp32_ads1115_ard
friendly_name: "ADS1115 16-bit 4-Channel Precision ADC"
esp32:
board: esp32dev
framework:
type: esp-idf
logger:
api:
encryption:
key: !secret api_encryption_key
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
i2c:
id: i2c_main
sda: GPIO21
scl: GPIO22
scan: true
# The ADDR pin selects 0x48-0x4B. 0x48 is ADDR tied to GND, which is how
# most breakouts ship.
ads1115:
- address: 0x48
sensor:
- platform: ads1115
multiplexer: 'A0_GND'
gain: 6.144
name: "ADC Channel A0"
update_interval: 60s
Before you flash:
the !secret values come from your
secrets.yaml, and the GPIO numbers are host-side
defaults rather than properties of this part — change them to match how you actually wired it.
If the device is not found:
it is usually the I2C address, not the config. Many breakouts strap their address with
solder jumpers, so two boards of the same part can differ. This config leaves
scan: true on — the boot log lists every address
actually present on the bus, and you can copy the right one from there.
What Appears in Home Assistant
Volts on A0, single-ended, every 60s. Scale it into the real quantity with a multiply or calibrate_linear filter.
Optional, not in the config: one more sensor block each, with multiplexer A1_GND, A2_GND or A3_GND. The differential pairs are A0_A1, A0_A3, A1_A3 and A2_A3.
Known Problems and Fixes
gain: 6.144 wastes codes at 3.3V
The gain value is the full-scale range, not a voltage the pin can take. At a 3.3V supply nothing above 3.6V may reach an input, so gain: 6.144 leaves nearly half the positive codes unused. gain: 4.096 still covers 0–3.3V, in 125µV steps instead of 187.5µV.
Single-ended is 15 bits
The 16 bits span negative to positive full scale. Measured against ground a signal cannot go negative, so single-ended readings use half the codes: 32,768 steps from zero to full scale.
Differential does not mean negative volts
A0_A1 reads the difference between two pins and can come out negative, but each pin must still stay between GND − 0.3V and VDD + 0.3V. An AC signal centred on ground needs biasing up before it reaches the chip.
High-impedance sources read low
The input stage is switched-capacitor and looks like a few megohms to whatever drives it. A divider built from megohm resistors — a common way to watch a 12V battery — is loaded by it and reads low. Keep divider resistors in the tens of kilohms, or buffer the signal.
ESPHome samples at 860 per second
The component defaults to the chip's fastest rate. At the more sensitive gains noise grows with rate, so for a slow signal — a battery, a pressure transducer, a soil probe — sample_rate: 128 or lower is the quieter setting.
Behind ct_clamp it needs continuous mode
By default the component triggers one conversion per update. To use the ADS1115 as the ADC for ct_clamp, with a current clamp at better resolution than the ESP32's own ADC, set continuous_mode: on in the ads1115: block.
Cheap boards, clone chips
Genuine TI ADS1115s in the usual package are marked BOGI. Hackaday tested low-cost boards and found chips that worked but ran off their rated data rate and read around 12mV low at 2.5V. If accuracy matters, check against a multimeter and correct with calibrate_linear.
Shares I²C address 0x48
These parts default to the same address. At least one can be re-strapped, so they can coexist once you change it:
- TMP117 Precision Temperature Sensor — resolvable
ADDR pin selects 0x48-0x4B. Check a full build in the planner · The ways out of an address conflict
Report a Pinout Error or Submit Tested Code Snippets
Found a pin mapping quirk or built a custom ESPHome YAML driver for ADS1115 16-bit 4-Channel Precision ADC? Submit a pull request or report corrections to our index.
Hardware Correction Reporter (emb-esp32-ads1115-ard)
Frequently Asked Questions
Does ADS1115 16-bit 4-Channel Precision ADC work without an internet connection?
How is ADS1115 16-bit 4-Channel Precision ADC powered and wired to the host board?
How does the host board reach Home Assistant (ESPHome)?
Alternatives
MCP3008 8-Channel 10-bit SPI ADC
Eight channels at 10 bits on SPI, when channel count matters more than resolution. ESPHome drives it as mcp3008.
HX711 24-bit ADC Load Cell Amplifier
A 24-bit converter that also powers the bridge — the usual part for load cells and weighing.
INA226 Bi-Directional Power Monitor
If the voltage belongs to a supply whose current matters too: up to 36V with no divider, plus current and power.
SCT-013-000 AC Current Transformer
The SCT-013 clamp, which pairs with an ADS1115 in continuous mode for finer current readings than the ESP32's ADC gives.