Forum: Mikrocontroller und Digitale Elektronik Zweiten Multiplexer in Arduino Programm einbinden


von Björn R. (bjoern_2335)


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.
von Stefan F. (Gast)


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.

von Björn R. (bjoern_2335)


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
}

: Bearbeitet durch Moderator
von Stefan F. (Gast)


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.

von Björn R. (bjoern_2335)


Lesenswert?

Ok Danke für die Rückmeldung. Ich werde es mal versuchen. Melde mich 
dann nochmal

Beitrag #6441801 wurde vom Autor gelöscht.
von Björn R. (bjoern_2335)


Angehängte Dateien:

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
}

: Bearbeitet durch Moderator
von Stefan F. (Gast)


Lesenswert?

Du hast vergessen, eine Frage zu stellen.

Informiere dich mal über den Unterschied zwischen print und println.

von Falk B. (falk)


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?

von Falk B. (falk)


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
}

von Björn R. (bjoern_2335)


Lesenswert?

Das Programm läuft die Spannung verändert sich. Das Blöde ist nur das 
der letze Kanal in einer neuen Zeile dargestellt wird. Damit kann ich 
den Datensatz nicht weiter verarbeiten.

von Falk B. (falk)


Lesenswert?

Björn R. schrieb:
> Das Blöde ist nur das
> der letze Kanal in einer neuen Zeile dargestellt wird.

Das sollte sich sehr leicht ändern lassen.

von Björn R. (bjoern_2335)


Lesenswert?

Wie kann ich das ändern?

von Stefan F. (Gast)


Lesenswert?

Björn R. schrieb:
> Wie kann ich das ändern?

Indem du dich wie gesagt über den Unterschied zwischen print und println 
informierst. Denn genau da liegt der Hase im Pfeffer.

von Thomas R. (r3tr0)


Lesenswert?

Unterschied zwischen
Serial.print(""); und
Serial.println(""); kennen lernen ;)

von Björn R. (bjoern_2335)


Lesenswert?

Habe das Skipt geändert. Jetzt läuft es so wie es soll. :-)
Danke Leute

von Stefan F. (Gast)


Lesenswert?

Björn R. schrieb:
> Habe das Skipt geändert.

Es heisst "Sketch" oder Quelltext, meinetwegen auch Programm.

Ein Script ist etwas anderes.

von Peter D. (peda)


Lesenswert?

Björn R. schrieb:
> ich möchte einen zweiten Multiplexer in mein Programm einbinden

Einfach die 4 Steuereingänge parallel schalten und den Ausgang auf einen 
2. ADC-Eingang legen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Björn R. schrieb:
> mein Programm
Bitte verwende die [c] Tags für deinen Code. Wie das geht steht über 
jeder Eingabebox bei "Antwort schreiben  Wichtige Regeln - erst lesen, 
dann posten!"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.