Multiplexer

Grundlagen

Die Anzahl der Pins am Arduino ist begrenzt. Am Uno können 18 Pins verwendet werden: D2-D13 und A0-A5.
Um mehr Sensoren oder Aktoren anzuschließen, kann ein Multiplexer verwendet werden. Mit diesem Bauteil werden 4 Pins (S0-S3) auf 16 Pins (Y0-Y15) verschaltet. Die 16 Pins werden binär codiert:

S0 S1 S2 S3 Y-Pin
0 0 0 0 Y0
1 0 0 0 Y1
0 1 0 0 Y2
1 1 0 0 Y3
0 0 1 0 Y4
1 0 1 0 Y5
0 1 1 0 Y6
1 1 1 0 Y7
0 0 0 1 Y8
1 0 0 1 Y9
0 1 0 1 Y10
1 1 0 1 Y11
0 0 1 1 Y12
1 0 1 1 Y13
0 1 1 1 Y14
1 1 1 1 Y15

Beschreibung der Pins

Ansteuern von 16 LEDs

Mit diesem Code leuchten die LEDs nacheinander auf:

// Pins Definition
const int pinS0 = 2;
const int pinS1 = 3;
const int pinS2 = 4;
const int pinS3 = 5;
const int pinEN = 6;

void setup() {
  // Steuerpins als Output definieren
  pinMode(pinS0, OUTPUT);
  pinMode(pinS1, OUTPUT);
  pinMode(pinS2, OUTPUT);
  pinMode(pinS3, OUTPUT);
  pinMode(pinEN, OUTPUT);

  // Multiplexer deaktiviert starten
  digitalWrite(pinEN, HIGH);
}

void loop() {
  for (int channel = 0; channel < 16; channel++) {
    setMuxChannel(channel); // Kanal wählen
    digitalWrite(pinEN, LOW);  // Multiplexer aktivieren → LED an
    delay(300);                // 300 ms warten

    digitalWrite(pinEN, HIGH); // Multiplexer deaktivieren → LEDs aus
    delay(300);                // 300 ms warten, LED aus
  }
}

// Funktion zum Setzen des Kanals
void setMuxChannel(int channel) {
  digitalWrite(pinS0, (channel & 0x01) ? HIGH : LOW);
  digitalWrite(pinS1, (channel & 0x02) ? HIGH : LOW);
  digitalWrite(pinS2, (channel & 0x04) ? HIGH : LOW);
  digitalWrite(pinS3, (channel & 0x08) ? HIGH : LOW);
}

Erläuterungen zum Code

setMuxChannel(int channel)

Die Methode setMuxChannel(int channel) aktiviert den Kanal mit der Nummer channel. Hierzu schaltet sie die entsprechenden Pins S0 bis S3 HIGH, bzw. LOW.
Die Anweisung channel & 0x01 prüft, ob das Bit 0001 gesetzt ist. Wenn das der Fall ist, wird der Pins S0 HIGH geschaltet, sonst LOW. Analog wird das 2. Bit (2), das 3. Bit(4) und das vierte Bit(8) untersucht.

digitalWrite(pinEN, LOW / HIGH)

Über den Enabled-Pin wird die Spannung vom Z-Pin auf die Ausgänge durchgeschaltet (LOW) oder gesperrt (HIGH). Die LED wird damit ein- oder ausgeschaltet.

Einlesen von 16 Sensoren

// Pin-Definitionen
const int pinS0 = 2;
const int pinS1 = 3;
const int pinS2 = 4;
const int pinS3 = 5;
const int pinEN = 6;
const int pinAnalog = A0;   // Analogeingang für SIG / COM
const int pinDigital = 7;   // Optional für digitale Werte, falls benötigt

void setup() {
  Serial.begin(9600);
  
  // Steuerpins als Ausgang definieren
  pinMode(pinS0, OUTPUT);
  pinMode(pinS1, OUTPUT);
  pinMode(pinS2, OUTPUT);
  pinMode(pinS3, OUTPUT);

  pinMode(pinEN, OUTPUT);
  digitalWrite(pinEN, LOW);      // Multiplexer aktivieren
  
  pinMode(pinDigital, INPUT);    // Optional digitaler Pin
}

void loop() {
  for (int channel = 0; channel < 16; channel++) {
    setMuxChannel(channel);             // Kanal setzen
    delay(5);                          // Kurze Wartezeit für Signalstabilisierung

    int analogValue = analogRead(pinAnalog);             // Analogwert lesen
    // int digitalValue = digitalRead(pinDigital);       // Optional digital lesen

    // Ausgabe über Serial
    Serial.print("Kanal ");
    Serial.print(channel);
    Serial.print(": Analog = ");
    Serial.println(analogValue);

    delay(200); // Zeit zwischen den Messungen, optional anpassen
  }
}

// Funktion: setzt die 4 Steuerleitungen S0..S3 zum gewünschten Kanal
void setMuxChannel(int channel) {
  digitalWrite(pinS0, (channel & 0x01) ? HIGH : LOW);
  digitalWrite(pinS1, (channel & 0x02) ? HIGH : LOW);
  digitalWrite(pinS2, (channel & 0x04) ? HIGH : LOW);
  digitalWrite(pinS3, (channel & 0x08) ? HIGH : LOW);
}