ADS1115 16-bit ADC: Handleiding voor Arduino & Raspberry Pi
Wat is de ADS1115?
De ADS1115 (Texas Instruments) is een 16-bit, 4-kanaals analoge-naar-digitale converter (ADC) met I2C-interface. Het biedt programmeerbare winst (PGA), differentiële ingangen, lage stroomverbruik en hoge precisie – ideaal voor batterijmonitoring, sensoren, meetapparatuur en audio. Veel gebruikt op breakout-borden (Adafruit, Waveshare, generiek).
Kenmerken
- Resolutie: 16 bit (65536 stappen)
- Kanalen: 4 single-ended (A0-A3) OF 2 differentieel (A0-A1, A2-A3)
- PGA (Programmeerbare Winst): 2/3×, 1×, 2×, 4×, 8×, 16× → invoerbereik ±6,144 V tot ±0,256 V
- Sample rate: 8 – 860 SPS (instelbaar)
- I2C: Standaard (100 kHz), Fast (400 kHz), High-speed (3,4 MHz)
- Adressen: 0x48 (ADDR→GND), 0x49 (ADDR→VDD), 0x4A (ADDR→SDA), 0x4B (ADDR→SCL)
- Voeding: 2,0 – 5,5 V (I/O tolerant tot VDD+0,3V)
- Stroom: ~150 µA actief, 0,5 µA power-down
- Temperatuur: -40 °C tot +125 °C
Pinout (Breakout Bord)
| Pin | Functie |
|---|---|
| VDD | Voeding 2,0-5,5V |
| GND | Massa |
| SCL | I2C Klok |
| SDA | I2C Data |
| ADDR | I2C Adres selectie (zie tabel) |
| A0-A3 | Analoge ingangen |
| ALRT | Alarm/Comparator uitgang (open-drain) |
Aansluiten op Arduino (UNO/Nano/ESP32)
ADS1115 Arduino (5V logica) VDD → 5V GND → GND SCL → A5 (UNO/Nano) / GPIO22 (ESP32) SDA → A4 (UNO/Nano) / GPIO21 (ESP32) ADDR → GND (adres 0x48) A0 → Sensor signaal (bijv. spanningssensor)
Let op: ADS1115 is 5V tolerant op I2C pinnen als VDD=5V. Bij 3,3V MCU (ESP32): voed ADS1115 met 3,3V of gebruik level shifter op SDA/SCL.
Arduino Bibliotheek & Basis Code
Bibliotheek: Adafruit ADS1X15 (Arduino IDE → Bibliotheken beheren → Zoek "ADS1X15" → Installeer Adafruit versie).
#include
#include
Adafruit_ADS1115 ads(0x48); // ADDR → GND
void setup() {
Serial.begin(115200);
Wire.begin();
if (!ads.begin()) {
Serial.println("ADS1115 niet gevonden! Check aansluiting/adres.");
while (1);
}
// Optioneel: PGA instellen (default = 1x, ±4.096V)
// ads.setGain(GAIN_TWOTHIRDS); // ±6.144V (1 bit = 0.1875 mV)
// ads.setGain(GAIN_ONE); // ±4.096V (1 bit = 0.125 mV) DEFAULT
// ads.setGain(GAIN_TWO); // ±2.048V (1 bit = 0.0625 mV)
// ads.setGain(GAIN_FOUR); // ±1.024V (1 bit = 0.03125 mV)
// ads.setGain(GAIN_EIGHT); // ±0.512V (1 bit = 0.015625 mV)
// ads.setGain(GAIN_SIXTEEN); // ±0.256V (1 bit = 0.0078125 mV)
// Optioneel: Sample rate
// ads.setDataRate(RATE_ADS1115_860SPS); // Default 128 SPS
}
void loop() {
// Single-ended lezing kanaal 0
int16_t raw = ads.readADC_SingleEnded(0); // 0-3 voor A0-A3
float voltage = ads.computeVolts(raw); // Rekening houdend met gain
Serial.print("Raw: "); Serial.print(raw);
Serial.print(" Spanning: "); Serial.print(voltage, 4); Serial.println(" V");
// Differentieel lezen (A0 - A1)
// int16_t diff = ads.readADC_Differential_0_1();
// float diffV = ads.computeVolts(diff);
delay(500);
}
Spanningsdeler voor Hogere Spanningen (Bijv. 0-24V Batterij)
ADS1115 max invoer = VDD + 0,3V. Voor 24V meting: spanningsdeler naar ±4,096V bereik (GAIN_ONE).
Batterij + ──→ [R1 = 47kΩ] ──→ [R2 = 10kΩ] ──→ GND
│
└──→ A0 (ADS1115)
Uitgang = Vin × (R2 / (R1+R2)) = Vin × 10/57 ≈ Vin × 0,175. 24V → 4,2V (binnen ±4,096V bereik, maar dichtbij limiet). Beter: R1=56k, R2=10k → factor 0,151. 24V → 3,6V. Meetbereik 0-24V, resolutie ≈ 3,6V/32767 ≈ 0,11 mV per bit.
Raspberry Pi Interfacing (Python)
Hardware
ADS1115 Raspberry Pi (3,3V I2C) VDD → 3,3V (Pin 1) GND → GND (Pin 6/9/14/20/25/30/34/39) SCL → GPIO 3 (Pin 5, I2C1 SCL) SDA → GPIO 2 (Pin 3, I2C1 SDA) ADDR → GND (0x48)
Activeer I2C: `sudo raspi-config` → Interface Options → I2C → Yes. Reboot.
Python Installatie
sudo apt update && sudo apt install python3-pip git
pip3 install adafruit-circuitpython-ads1x15
# Of systeembreed:
sudo pip3 install adafruit-circuitpython-ads1x15
Python Script
import time
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
i2c = busio.I2C(board.SCL, board.SDA)
ads = ADS.ADS1115(i2c, address=0x48)
# ads.gain = 1 # ±4.096V (default)
# ads.data_rate = 860 # SPS
chan0 = AnalogIn(ads, ADS.P0) # Single-ended A0
# chan_diff = AnalogIn(ads, ADS.P0, ADS.P1) # Differentieel A0-A1
while True:
print(f"Kanaal 0: {chan0.value:>5} raw {chan0.voltage:.4f} V")
# print(f"Diff 0-1: {chan_diff.value:>5} raw {chan_diff.voltage:.4f} V")
time.sleep(0.5)
Negatieve Spanning Meten
JA, de ADS1115 kan negatieve spanningen meten in differentiële modus (bijv. A0 - A1). Verbind de negatieve bron met A1, positieve met A0, GND gemeenschappelijk. De uitwaarde is dan een signed 16-bit integer (negatief = twee's complement). In single-ended modus is de ingang gerefereerd aan GND → alleen positief ten opzichte van GND.
Veelvoorkomende Toepassingen
- Batterijmonitoring (spanning, stroom via shunt)
- Precisie temperatuursensoren (PT100/PT1000 met Wheatstone brug)
- Lastcel / krachtmeting (HX711 alternatief met hogere resolutie)
- Audio niveau meting (met AC-koppeling)
- Industriële 4-20 mA sensoren (shunt weerstand 250Ω → 1-5V)
- Zonnepaneel monitoring (spanning + stroom)
Tips & Troubleshooting
| Probleem | Oplossing |
|---|---|
| I2C scan toont geen apparaat | Check VDD, GND, SDA/SCL, pull-ups (4,7kΩ), adres pin (ADDR) |
| Waarden springen / ruis | Voeg 100nF + 10µF bij VDD, kortere draden, afscherming, lagere sample rate |
| Negatieve waarden bij single-ended | Ingang < GND (ruis), of PGA te hoog voor signaal. Check common-mode bereik. |
| Alle kanalen zelfde waarde | Mux niet geschakeld (bibliotheek bug), of alle pinnen kortgesloten |
| ALRT pin werkt niet | Configureer comparator via registers (bibliotheek ondersteunt dit beperkt) |
Conclusie
De ADS1115 is een uitstekende, lage-kost 16-bit ADC voor Arduino en Raspberry Pi. Zijn PGA, differentiële ingangen en I2C-interface maken het veelzijdig voor precisiemeting. De Adafruit bibliotheek maakt integratie trivial. Let op: common-mode spanning blijft binnen 0-VDD, gebruik spanningsdelers voor hogere spanningen, en decoupleer de voeding goed voor optimale ruisprestaties.
Industriële technologie
- Arduino Mega koppelen aan een NEO‑6M GPS-module: stapsgewijze handleiding
- Temperatuur en Vochtigheid met DHT11 op Blynk - Stap-voor-Stap Arduino Tutorial
- Bouw IoT-apparaten met Arduino en Octoblu's The Tentacle – geen programmeren vereist
- ADXL345 Accelerometer met Arduino: Oriëntatie Tracking Stap-voor-Stap
- Rotary encoders met Arduino: werking & stap-voor-stap integratie
- PIR Bewegingssensor: Werkprincipe & Arduino Integratie Handleiding
- Stapmotor Besturing met Arduino & A4988 Driver – Stap-voor-Stap Handleiding
- Industriële IoT: Slimme Magazijntrends Vooruit Gang Maken
- Waarom Regelmatig Onderhoud Essentieel Is Voor Zware Machines
- Arduino Uitgelegd: Wat Is Het en Hoe Programmeer Je Het?
- Edge AI Inferencing meesteren: Een praktische gids voor actionable insights