Wie kann man analoge Pins durchlaufen?

8

Ich möchte etwas in der Art von tun

for (int i = 0; i < 4; i++) {
  analogRead(i);
}

Was zu funktionieren scheint, aber das Folgende nicht:

for (int i = 0; i < 4; i++) {
  pinMode(i, INPUT);
  pinMode(i + 4, OUTPUT); // should make Analog Pin (i + 4) into an output
  digitalWrite(i + 4, LOW);
  analogRead(i);
}

Stattdessen scheint es den von adressierten Pin digitalWrite(i + 4, LOW);als einen der digitalen Pins zu behandeln.

Muss ich A0, A1, A2, ... wirklich explizit angeben, wenn ich die analogen Pins durchlaufen möchte?

hoosierEE
quelle
Die Schweizer Uhr von BrettAM erscheint mir sehr vernünftig, da sie nur im Falle einer nicht aufeinanderfolgenden Abbildung fehlschlägt, die meines Wissens nach ein rein hypothetisches Problem bleibt. Die Antwort von BrettAM macht am besten deutlich, dass A0 nur eine vordefinierte Konstante des gleichen Typs (8-Bit-Ganzzahl ohne Vorzeichen) ist wie jedes Literal, das Sie in dieser for-Schleife vernünftigerweise verwenden könnten. A0 ist nur eine Zahl. Welche Nummer ist es genau? Nun, das hängt davon ab und spielt außerdem keine Rolle. Sie können sich jedoch darauf verlassen, dass es sich um eine Zahl handelt und dass Sie sie als solche verwenden können.
Es tut mir leid, diesen Thread wiederzubeleben, aber ich wollte die Vor- und Nachteile der oben angegebenen Antworten beachten. Der Atombunker von Craig ist der kugelsicherste. es würde funktionieren, selbst wenn es nicht aufeinanderfolgende Zuordnungen gäbe. Das Papierflugzeug von Geometrikal ist am wenigsten kugelsicher, da seine magischen Zahlen versagen, sobald Sie zu einem anderen Board wechseln (da es keine Hypothese gibt, dass die Zuordnungen zwischen den Boards unterschiedlich sind). Fairerweise machen sie jetzt deutlich, dass sie "eine andere Art des Schreibens der Antwort von BrettAM" anbieten und daher möglicherweise überhaupt keine ernsthafte Empfehlung aussprechen.
Ich mag deine poetischen Beschreibungen der verschiedenen Antworten! Die Metaphern sind passend - aber vielleicht möchten Sie sie für unsere nicht-englischen Muttersprachler in Anführungszeichen setzen, um hervorzuheben, dass Sie ein wenig hyperbolisch sind: "Atombunker", "Papierflugzeug" usw.
John Burger

Antworten:

11

Ja, die analogen Pins müssen mit A0, A1, ... adressiert werden, wenn sie für digitale E / A verwendet werden.

Je nach Karte verwenden Sie A0, A1 usw. werden unterschiedlichen Werten zugeordnet (zum Beispiel sieht es so aus, als ob A0 auf einigen Karten 18, auf anderen 14 ist.

Eine Lösung für das Schleifen über die analogen Pins wäre folgende:

static const uint8_t analog_pins[] = {A0,A1,A2,A3,A4};
// Setup pins for input
for (int i = 0; i < 5; i++) { //or i <= 4
  digitalRead(analog_pins[i]);
}

Wenn Sie die analogen Pins nur mit dem analogRead()Anruf verwenden, können Sie 0,1, ... anstelle von A0, A1, ... verwenden.

Craig
quelle
4
Laut arduino.cc/en/Reference/analogRead können Sie von analogen Pins nur nach Zahlen lesen (z. B. 0, 1, 2, 3 usw.); Das "A" in "A0" ist optional. Natürlich kann es klarer sein, wenn Sie sie mit dem Präfix "A" unterscheiden, aber es ist für analogRead nicht erforderlich. Auf der anderen Seite, wird digitalWrite(i)davon ausgegangen , dass ian einen digitalen Stift bezieht; Um digitalWrite mit einem analogen Pin zu verwenden, muss das Präfix "A" angegeben werden.
Heypete
Guter Fang. Ich habe die Antwort aktualisiert.
Craig
Dies ist die tragbarste Lösung, die ich bisher gesehen habe, und ich verwende sie jetzt, danke.
HoosierEE
4

Zumindest ein Uno / Megas / Leonardo, alle Werte, die analogen Pin-Nummern zugeordnet sind, sind also aufeinanderfolgend

for (int i = A0; i < A4; i++) {
  pinMode(i, OUTPUT); 
  digitalWrite(i, LOW);
}

setzt A0, A1, A2 und A3 auf OUTPUT und dann auf LOW.

BrettAM
quelle
1

Die Pins 14 bis 19 sind die analogen Pins A0 bis A5. A0ist nur ein Alias ​​für 14und so weiter.

Also eine andere Art, BrettMs Antwort zu schreiben:

for (int i = 14; i < 18 i++) {
  pinMode(i, OUTPUT); 
  digitalWrite(i, LOW);
}
geometrisch
quelle
Dies funktioniert nicht auf allen Arduino-Boards. Nicht alle Boards verwenden 14-19.
Craig
0

Ihre erste Schleife wird gut funktionieren in der Tat, aber man könnte hinzufügen möchten , delay(1);nachdem Sie analogRead(i);, der ADC einige Zeit , um sich zu geben.

Könnten Sie näher erläutern, was Sie mit Ihrem zweiten Code tun möchten? Aus heutiger Sicht ist es nicht wirklich sinnvoll, analoge Eingänge als digitale Ausgänge zu verwenden .

Außerdem versuchen Sie, den Eingang eines Pins nur ein paar Zeilen zu lesen, nachdem Sie den Pin als Ausgang angegeben haben.

Bitte erklären Sie, was Sie erreichen möchten, damit die netten Leute hier Ihnen besser helfen können.

Tom
quelle
0

Ich weiß, dass dies alt ist, aber wenn Sie Ihre Maus in Visual Micro über A0 bis A7 bewegen, wird der wahre Wert angezeigt. Es handelt sich lediglich um eine Variable (tatsächlich wird 14U angezeigt, aber während der Adressierung müssen Sie das U nicht einschließen). . Was Craig gesagt hat, ist falsch, sie müssen NICHT von A0, A1 usw. angesprochen werden.

A0 = 14 A1 = 15. . A7 = 21

//Will set all pins, digital and analog to LOW (0)
for (int i = 1; i < 22; i++) {
    digitalWrite(i, LOW);
}

//Will set all analog pins to LOW (0)
for (int i = 14; i < 22; i++) {
    digitalWrite(i, LOW);
}

//Will set all analog pins to LOW (0)
for (int i = A0; i < A7 + 1; i++) {
    digitalWrite(i, LOW);
}

Die letzte for-Schleife sagt im Grunde i = 1 (A0) und stoppt bei 21 (A7).

Wenig Regen
quelle