In diesem Beitrag zeige ich, wie die analoge Eingangskarte I2AE18 mit dem MCP3424 funktioniert.
Mit ihr lassen sich vier analoge Werte (0–10 V) in bis zu 18 Bit Auflösung (ca. 0,5 mV/LSB) einlesen. Der MCP3424 bietet wählbare Auflösungen (12/14/16/18 Bit) ideal für präzise Industriemessungen.
| Auflösung | Datenrate (SPS) | Zeit pro Wandlung (ein Kanal) |
| 12 Bit | 240 SPS | ca. 4,2 ms |
| 14 Bit | 60 SPS | ca.16,7 ms |
| 16 Bit | 15 SPS | ca. 66,7 ms |
| 18 Bit | 3,75 SPS | ca. 267 ms |
Bei 18 Bit (267 ms) dauert ein kompletter 4‑Kanal‑Durchlauf ca. 1,07 s.
I2AE18 Arduino MCP3424 – 4 Kanal Analogwerte 0-10V einlesen
Anhand eines praktischen Programmbeispiels werden die Messwerte auf einem 1,3″-OLED-Display dargestellt. Über die Tasten am Display lässt sich zwischen den vier Kanälen wechseln. Mit der rechten Taste werden alle Messwerte gleichzeitig in kleiner Schrift auf einem Bildschirm anzeigt.
Ideal für schnelle Übersicht und Kontrolle.
Hardware

Bei dieser Karte haben wir einen AD-Wandler von Microchip verbaut. Dieser kann 4 Analogwerte mit einer Auflösung von maximal 18 Bit einlesen.
Folgende Messbereiche sind möglich:
- 0..10V
- ±10V
- ±2V
- ±20mA
Durch ändern der Vorwiderständen lassen sich auch andere Messbereiche z.B. 0-30V zur Überwachung von Bordspannungen im KFZ, Boot oder Caravan realisieren.
Die Platine kann über den Busverbinder an den I2C-Master angeschlossen werden.
Abmessung der Leiterplatte 42 mm x 63 mm
Link zum Onlineshop: Bausatz I2C Analog Input 4 Kanal 18 Bit mit MCP3424
Hardware-Aufbau

Arduino-Programm MCP3424 I2AE18 mit Display-Anzeige
Vollständiges Display-Programm
- 4 Kanäle 0–10 V live anzeigen
- Einzelkanal in großer Schrift (Taste →/←)
- Alle Kanäle anzeigen (Taste Alle)
- Spannungsteiler-Korrektur 1:5
- Entprellung für sichere Tasten
Kopiere den Sketch direkt in die Arduino IDE!
// =========================================================================
// Beispiel für Arduino UNO
// I2AE18 Analoge Eingangskarte 4 Kanal mit mit MCP3424
// I2CDI OLED-Display 1,3'' mit SH1106 128x64 Pixel
//
// Ausgabe der aktuellen Messwerte in vier Zeilen oder jeder Kanal einzeln
// =========================================================================
#include <Wire.h>
#include <Adafruit_GFX.h> // getestet mit V 2.1.14 Adafruit_SH110x
#include <Adafruit_SH110X.h> // getestet mit V 1.12.4 Adafruit-GFX-Library
#include <MCP3424.h> // getestet mit V 0.1.4 Rob RobTillaart
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define LCD_ADDRESS 0x3C
#define MCP_ADDRESS 0x68
#define PCF_ADDRESS 0x3F
Adafruit_SH1106G display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
MCP3424 adc(MCP_ADDRESS);
uint8_t TASTEN = 0;
int aktiverKanal = 0; // 0=alle, 1-4=einzelner Kanal
bool letzteTasten[4] = {0,0,0,0}; // Entprellung
void setup() {
Wire.begin();
// Display starten
display.begin(LCD_ADDRESS, true);
display.clearDisplay();
display.setTextColor(SH110X_WHITE);
// MCP3424 starten
adc.begin();
adc.setResolution(12);
adc.setContinuousMode();
// PCF8574A alle Pins Eingang
Wire.beginTransmission(PCF_ADDRESS);
Wire.write(0xFF);
Wire.endTransmission();
}
void loop() {
// PCF8574A lesen
Wire.requestFrom(PCF_ADDRESS, 1);
while(Wire.available() == 0);
TASTEN = 255 - Wire.read(); // Invertieren
// Tastenabfrage mit Entprellung (Bit 0,1,2)
bool tasteLinks = (TASTEN & 0x01) && !letzteTasten[0]; // Bit 0 = <-
bool tasteRechts = (TASTEN & 0x02) && !letzteTasten[1]; // Bit 1 = ->
bool tasteOk = (TASTEN & 0x04) && !letzteTasten[2]; // Bit 2 = ok
bool tasteAlle = (TASTEN & 0x08) && !letzteTasten[3]; // Bit 3 = Alle
letzteTasten[0] = TASTEN & 0x01;
letzteTasten[1] = TASTEN & 0x02;
letzteTasten[2] = TASTEN & 0x04;
letzteTasten[3] = TASTEN & 0x08;
// Tastenaktionen
if (tasteLinks) { // Bit 0: Kanal runter
if (aktiverKanal > 1) aktiverKanal--;
}
if (tasteRechts) { // Bit 1: Kanal rauf
if (aktiverKanal < 4) aktiverKanal++;
}
if (tasteAlle) { // Bit 2: ALLE anzeigen
aktiverKanal = 0;
}
// Alle 4 Messwerte auslesen
float volts[4];
for (int ch = 0; ch < 4; ch++) {
adc.setChannel(ch);
delay(adc.getConversionDelay());
volts[ch] = adc.readVolts() * 5.0;
}
display.clearDisplay();
display.setTextColor(SH110X_WHITE);
if (aktiverKanal == 0) {
// Modus 0: Alle 4 Kanäle klein
display.setTextSize(1);
for (int ch = 1; ch <= 4; ch++) {
display.setCursor(0, (ch - 1) * 12);
display.print("Kanal ");
display.print(ch);
display.print(": ");
display.print(volts[ch-1], 2);
display.println(" V");
}
}
else {
// Modus 1-4: Einzelner Kanal groß
int ch = aktiverKanal;
display.setTextSize(2);
display.setCursor(20, 2);
display.print("Kanal ");
display.print(ch);
display.setTextSize(2);
display.setCursor(30, 25);
display.print(volts[ch-1], 2);
display.print(" V");
}
// Zeile 5: Menü
display.setTextSize(1);
display.setCursor(0, 57);
display.print("<- -> ok Alle");
display.display();
delay(100);
}Nur seriell: Ideal zum Testen, wenn noch kein Display vorhanden ist.
Und hier noch eine Minimal-Lösung, in der nur die vier Messwerte vom MCP3424 gelesen und auf die serielle Schnittstelle ausgegeben werden.
- Nur MCP3424 + Serial Monitor
- 2 Sekunden Update-Zyklus
- Alle 4 Kanäle gleichzeitig
- Direkt kopierbar!
// =========================================================================
// Beispiel für Arduino UNO
// I2AE18 Analoge Eingangskarte 4 Kanal mit mit MCP3424
//
// Ausgabe der aktuellen Messwerte über die serielle Schnittstelle
// =========================================================================
#include <Wire.h>
#include <MCP3424.h> // getestet mit V 0.1.4 von Rob Tillaart
#define MCP_ADDRESS 0x68
MCP3424 adc(MCP_ADDRESS);
void setup() {
Wire.begin();
Serial.begin(115200); // Baudrate für den seriellen Monitor
while (!Serial) {;} // (optional) auf die serielle Schnittstelle warten
// MCP3424 initialisieren
adc.begin();
adc.setResolution(12);
adc.setContinuousMode();
Serial.println(F("I2AE18 MCP3424 Demo - 0..10 V (Spannungsteiler 1:5)"));
}
void loop() {
// Alle 4 Kanalspannungen auslesen
float volts[4];
for (int ch = 0; ch < 4; ch++) {
adc.setChannel(ch);
delay(adc.getConversionDelay());
float v_adc = adc.readVolts(); // Spannung am ADC-Eingang (0..2 V)
volts[ch] = v_adc * 5.0; // reale 0..10 V (1:5-Teiler)
}
// Ausgabe auf den seriellen Monitor
Serial.println(F("---------------"));
for (int ch = 0; ch < 4; ch++) {
Serial.print(F("Kanal "));
Serial.print(ch + 1);
Serial.print(F(": "));
Serial.print(volts[ch], 3); // 3 Nachkommastellen
Serial.println(F(" V"));
}
Serial.println();
delay(2000); // Aktualisierung alle 2 Sekunden
}So sieht die Ausgabe vom seriellen Monitor dann aus
---------------
Kanal 1: 4.290 V
Kanal 2: 2.600 V
Kanal 3: 7.370 V
Kanal 4: 8.930 V
Code-Sprache: CSS (css) 