Arduino – I2AE18 Analogwerte lesen MCP3424

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ösungDatenrate (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

Analoge Eingangskarte I2AE18 mit MCP3424 4 Kanäle 0-10V, 0-2V oder 0-20mA

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

Hardware-Aufbau 
Arduino-UNO Master
Analoge EIngangskarte mit MCP3424
OLED-Display

 

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)
Speichere in deinen Favoriten diesen permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert