Zweiten Multiplexer in Arduino Programm einbinden

OP #6441380
Lesenswert?

Hallo,

ich möchte einen zweiten Multiplexer in mein Programm einbinden
Hardware: Arduino Uno
Multiplexer:CD74HC4067 16-Kanal Analog Digital Multiplexer

Das Programm und die Empfangenen Daten laufen stabil mit einem 
Multiplexer. Nun möchte ich in das Programm mit einen zweiten 
Multiplexer erweitern um Analoge Daten zu empfangen.

Ich möchte den zweiten Multiplexer auf
S0 : 4
S1 : 5
S2 : 6
S3 : 7
Eingang: A1
einbinden. Es wäre cool wenn mir jemand helfen könnte das Programm zu 
erweitern.

Hier mein Programm:

int pin_Out_S1 = 9;
int pin_Out_S2 = 10;
int pin_Out_S3 = 11;
int pin_In_Mux1 = A0;
int Mux1_State[16] = {0};

//int val = 0;

void setup() {
  pinMode(pin_Out_S0, OUTPUT);
  pinMode(pin_Out_S1, OUTPUT);
  pinMode(pin_Out_S2, OUTPUT);
  pinMode(pin_Out_S3, OUTPUT);

  //pinMode(pin_In_Mux1, INPUT);
  Serial.begin(9600);
}

void loop() {
  updateMux1();
  for(int i = 0; i < 16; i ++) {
    if(i == 15) {
      Serial.println(Mux1_State[i]);


    } else {
      Serial.print(Mux1_State[i]);
      Serial.print(";");
    }
  }
}

void updateMux1 () {
  for (int i = 0; i < 16; i++){
    digitalWrite(pin_Out_S0, HIGH && (i & B00000001));
    digitalWrite(pin_Out_S1, HIGH && (i & B00000010));
    digitalWrite(pin_Out_S2, HIGH && (i & B00000100));
    digitalWrite(pin_Out_S3, HIGH && (i & B00001000));

    Mux1_State[i] = analogRead(pin_In_Mux1);

  }
}


Danke und Gruß
Beitrag #6441389 wurde von einem Moderator gelöscht.
Gast #6441393
Lesenswert?

Die Aufgabe ist so simpel, dass ich echt Hemmungen habe, die Lösung vor 
zu kauen. Du musst doch nur das Array verdoppeln und in der for-Schleife 
beide analogen Eingänge abfragen.

Versuche es erst mal selbst und melde dich dann mit dem Versuch wieder.
OP #6441616
Lesenswert?

Ich habe bereits versucht den Code anzupassen. Kam aber nur mist raus.
1
int pin_Out_S0 = 8;
2
int pin_Out_S1 = 9;
3
int pin_Out_S2 = 10;
4
int pin_Out_S3 = 11;
5
int pin_In_Mux1 = A0;
6
int Mux1_State[16] = {0};
7

8
int pin_Out_S4 = 4;
9
int pin_Out_S5 = 5;
10
int pin_Out_S6 = 6;
11
int pin_Out_S7 = 7;
12
int pin_In_Mux2 = A1;
13
int Mux2_State[32] = {0};
14
//int val = 0;
15

16
void setup() {
17
  
18
  pinMode(pin_Out_S0, OUTPUT);
19
  pinMode(pin_Out_S1, OUTPUT);
20
  pinMode(pin_Out_S2, OUTPUT);
21
  pinMode(pin_Out_S3, OUTPUT);
22

23
  pinMode(pin_Out_S4, OUTPUT);
24
  pinMode(pin_Out_S5, OUTPUT);
25
  pinMode(pin_Out_S6, OUTPUT);
26
  pinMode(pin_Out_S7, OUTPUT);
27

28
  //pinMode(pin_In_Mux1, INPUT);
29
  Serial.begin(9600);
30
}
31

32
void loop() {
33
  updateMux1();
34
  for(int i = 0; i < 15; i ++) {
35
    if(i == 16) {
36
      Serial.println(Mux1_State[i]);
37
      Serial.println(Mux2_State[i]);
38
      
39
    } else {
40
      Serial.print(Mux1_State[i]);
41
      Serial.print(Mux2_State[i]);
42
      Serial.print(";");
43
    }
44
  }
45
}
46

47
void updateMux1 () {
48
  for (int i = 0; i < 16; i++){
49
    digitalWrite(pin_Out_S0, HIGH && (i & B00000001));
50
    digitalWrite(pin_Out_S1, HIGH && (i & B00000010));
51
    digitalWrite(pin_Out_S2, HIGH && (i & B00000100));
52
    digitalWrite(pin_Out_S3, HIGH && (i & B00001000));
53

54
    digitalWrite(pin_Out_S4, HIGH && (i & B00000001));
55
    digitalWrite(pin_Out_S5, HIGH && (i & B00000010));
56
    digitalWrite(pin_Out_S6, HIGH && (i & B00000100));
57
    digitalWrite(pin_Out_S7, HIGH && (i & B00001000));
58

59
    Mux1_State[i] = analogRead(pin_In_Mux1);
60
    Mux2_State[i] = analogRead(pin_In_Mux2);
61

62
  }
63
}
Gast #6441628
Lesenswert?

S4, S5, S6 und S7 brauchst du nicht. Du kannst beide Multiplexer 
parallel über S0, S1, S2 und S3 ansteuern. Schadet aber auch nicht.

Mux2_State[32] ist unnötig groß, du willst doch nur 16 Werte speichern. 
AUch das schadet nichts.

> Serial.print(Mux1_State[i]);
> Serial.print(Mux2_State[i]);

Dazwischen würde ich ein Trennzeichen (z.B. Komma) ausgeben, sonst 
kleben die beiden Zahlen direkt aneinander.

Will sagen: Dein Programm sieht fast gut aus. Vielleicht hast du die 
Schaltung falsch aufgebaut.
Beitrag #6441801 wurde von einem Moderator gelöscht.
OP #6441816
Lesenswert?

Ich habe das Skipt jetzt wie folgt geändert und bekomme folgende Ausgabe 
(siehe Bild). Der letze Wert wird in einer neuen Zeile dargestellt.
1
int pin_Out_S0 = 8;
2
int pin_Out_S1 = 9;
3
int pin_Out_S2 = 10;
4
int pin_Out_S3 = 11;
5
int pin_In_Mux1 = A0;
6
int Mux1_State[16] = {0};
7

8
int pin_Out_S4 = 4;
9
int pin_Out_S5 = 5;
10
int pin_Out_S6 = 6;
11
int pin_Out_S7 = 7;
12
int pin_In_Mux2 = A1;
13
int Mux2_State[16] = {0};
14
//int val = 0;
15

16
void setup() {
17
  
18
  pinMode(pin_Out_S0, OUTPUT);
19
  pinMode(pin_Out_S1, OUTPUT);
20
  pinMode(pin_Out_S2, OUTPUT);
21
  pinMode(pin_Out_S3, OUTPUT);
22

23
  pinMode(pin_Out_S4, OUTPUT);
24
  pinMode(pin_Out_S5, OUTPUT);
25
  pinMode(pin_Out_S6, OUTPUT);
26
  pinMode(pin_Out_S7, OUTPUT);
27

28
  //pinMode(pin_In_Mux1, INPUT);
29
  Serial.begin(9600);
30
}
31

32
void loop() {
33
  updateMux1();
34
  for(int i = 0; i < 16; i ++) {
35
    if(i == 15) {
36
      Serial.println(Mux1_State[i]);
37
      Serial.println(";");
38
      Serial.println(Mux2_State[i]);
39
      Serial.println(";");
40
      
41
      
42
    } else {
43
      Serial.print(Mux1_State[i]);
44
      Serial.print(";");
45
      Serial.print(Mux2_State[i]);
46
      Serial.print(";");
47
    }
48
  }
49
}
50

51
void updateMux1 () {
52
  for (int i = 0; i < 16; i++){
53
    
54
    digitalWrite(pin_Out_S0, HIGH && (i & B00000001));
55
    digitalWrite(pin_Out_S1, HIGH && (i & B00000010));
56
    digitalWrite(pin_Out_S2, HIGH && (i & B00000100));
57
    digitalWrite(pin_Out_S3, HIGH && (i & B00001000));
58

59
    digitalWrite(pin_Out_S4, HIGH && (i & B00000001));
60
    digitalWrite(pin_Out_S5, HIGH && (i & B00000010));
61
    digitalWrite(pin_Out_S6, HIGH && (i & B00000100));
62
    digitalWrite(pin_Out_S7, HIGH && (i & B00001000));
63

64
    Mux1_State[i] = analogRead(pin_In_Mux1);
65
    Mux2_State[i] = analogRead(pin_In_Mux2);
66

67
  }
68
}
Angehängte Dateien:
#6441837
Lesenswert?

Björn R. schrieb:
> Ich habe das Skipt jetzt wie folgt geändert und bekomme folgende Ausgabe
> (siehe Bild). Der letze Wert wird in einer neuen Zeile dargestellt.

Reichlich unlogisch.

Prinzipiell sollte dein Programm jetzt funktionieren, wenn gleich man 
das eher etwas anders strukturieren würde.

Wie testest du dein Programm? Kannst du die Spannungen an den 
MUX-Eingängen verändern? Reagiert die Programm richtig?
#6441846
Lesenswert?

Man kann das ein wenig besser aufbauen und straffen. Schlcukt der 
Arduino die B000001 Schreibweise? Ist das nicht eher 0b000001?
1
int pin_Out_S0 = 8;
2
int pin_Out_S1 = 9;
3
int pin_Out_S2 = 10;
4
int pin_Out_S3 = 11;
5
int pin_In_Mux1 = A0;
6
int Mux1_State[16];
7

8
int pin_Out_S4 = 4;
9
int pin_Out_S5 = 5;
10
int pin_Out_S6 = 6;
11
int pin_Out_S7 = 7;
12
int pin_In_Mux2 = A1;
13
int Mux2_State[16];
14
//int val = 0;
15

16
void setup() {
17

18
  pinMode(pin_Out_S0, OUTPUT);
19
  pinMode(pin_Out_S1, OUTPUT);
20
  pinMode(pin_Out_S2, OUTPUT);
21
  pinMode(pin_Out_S3, OUTPUT);
22

23
  pinMode(pin_Out_S4, OUTPUT);
24
  pinMode(pin_Out_S5, OUTPUT);
25
  pinMode(pin_Out_S6, OUTPUT);
26
  pinMode(pin_Out_S7, OUTPUT);
27

28
  //pinMode(pin_In_Mux1, INPUT);
29
  Serial.begin(9600);
30
}
31

32
void loop() {
33
  updateMux1();
34

35
  for(int i = 0; i < 16; i ++) {
36
    Serial.print(Mux1_State[i]);
37
    Serial.print(";");
38
  }
39
  Serial.println("");
40

41
  for(int i = 0; i < 16; i ++) {
42
    Serial.print(Mux2_State[i]);
43
    Serial.print(";");
44
  }
45
  Serial.println("");
46
  Serial.println("");
47
}
48

49
void updateMux1 () {
50
  for (int i = 0; i < 16; i++){
51

52
    digitalWrite(pin_Out_S0, (i & B00000001));
53
    digitalWrite(pin_Out_S1, (i & B00000010));
54
    digitalWrite(pin_Out_S2, (i & B00000100));
55
    digitalWrite(pin_Out_S3, (i & B00001000));
56

57
    digitalWrite(pin_Out_S4, (i & B00000001));
58
    digitalWrite(pin_Out_S5, (i & B00000010));
59
    digitalWrite(pin_Out_S6, (i & B00000100));
60
    digitalWrite(pin_Out_S7, (i & B00001000));
61

62
    Mux1_State[i] = analogRead(pin_In_Mux1);
63
    Mux2_State[i] = analogRead(pin_In_Mux2);
64
  }
65
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren