Um Tyilos spezifische Fragen zu beantworten:
analogRead(5)
und digitalRead(5)
wird von zwei verschiedenen Orten lesen. Ersteres liest vom analogen Kanal 5
oder A5
Letzteres von Pin 5, der zufällig ein digitaler Pin ist. Also ja, wenn du einen analogen Pin mit lesen digitalRead
willst solltest du verwenden A5
.
Warum?
analogRead
erfordert eine interne Kanalnummer, aber Sie können auch eine PIN-Nummer vergeben. Wenn Sie eine PIN-Nummer vergeben, wird diese in die entsprechende Kanalnummer umgewandelt. Soweit ich weiß, analogRead
ist dies die einzige Funktion, die intern eine Kanalnummer verwendet, die einzige, die eine Kanalnummer zulässt, und die einzige Funktion bei dieser undokumentierten Pin-zu-Kanal-Konvertierung. Um dies zu verstehen, beginnen wir mit einigen Beispielen.
Wenn Sie analogRead
den ersten analogen Pin verwenden möchten, A0
können Sie festlegen, analogRead(0)
welcher die Kanalnummer oder analogRead(A0)
welcher die Pin-Nummer verwendet. Wenn Sie die Pin-Nummer-Variante verwenden analogRead
würden , würden Sie die Pin-Nummer A0
in die richtige Kanalnummer umwandeln 0
.
Wenn Sie digitalWrite
auf dem ersten analogen Stift verwenden möchten, A0
können Sie nur tun digitalWrite(A0, x)
. digitalWrite
verwendet keine analogen Kanäle intern und lässt Sie keine Kanalnummer übergeben. Nun, es wird Ihnen erlauben , aber Sie werden den falschen Stift auswählen. Gleiches gilt für digitalRead
und gerade analogWrite
.
Was ist mit den Pin-zu-Kanal-Konvertierungen von analogRead
? Die Quelle für diese Funktion finden Sie unter hardware/arduino/avr/cores/arduino/wiring_analog.c
Sie werden sehen, dass sie eine einfache Subtraktion basierend auf dem Kartentyp ausführt. Die A0
/ A1
/ A2
/ etc. Konstanten stellen die Pin-Nummer der analogen Kanäle dar und können überall dort verwendet werden, wo Sie auf die analogen Eingänge verweisen müssen. Aus diesem Grund sind sie die beste Option, um sie in Ihrem Arduino-Code zu verwenden, da es sehr offensichtlich ist, dass Sie denselben physischen Port verwenden, auch wenn Sie verschiedene Funktionen verwenden. Die Definitionen dieser Konstanten hängen von Ihrer Karte ab.
Hier ist zum Beispiel der analoge PIN-Definitionscode für den Arduino Uno in hardware/arduino/avr/variants/standard/pins_arduino.h
static const uint8_t A0 = 14;
static const uint8_t A1 = 15;
static const uint8_t A2 = 16;
static const uint8_t A3 = 17;
static const uint8_t A4 = 18;
static const uint8_t A5 = 19;
static const uint8_t A6 = 20;
static const uint8_t A7 = 21;
Zum Vergleich hier der analoge Pin-Definitionscode für den Arduino Mega:
static const uint8_t A0 = 54;
static const uint8_t A1 = 55;
static const uint8_t A2 = 56;
[...]
static const uint8_t A13 = 67;
static const uint8_t A14 = 68;
static const uint8_t A15 = 69;
Weitere EE-Diskussion zu analogen Pins: Kann ich die analogen Pins auf dem Arduino für mein Projekt als digital verwenden?
analogRead
auf analoge Stifte! Auf der anderen SeiteanalogWrite
können sowohl die analogen als auch die PWM-Pins verwendet werden.Ich habe Stunden damit verbracht. Ich dachte, ich hätte ein Hardwareproblem. Es stellt sich heraus, dass ich
analogRead()
falsch angerufen habe .Falscher (fehlerhafter Beispielcode von Falscher DFRobot 😣):
Richtig:
Aktualisieren :
analogRead()
Nimmt GPIO-Pin-Nummern an.A0
usw. sind #definiert für Arduino-Pin-Nummern, wobeiA0 == 36
.Seien Sie vorsichtig: Auf dem FireBeetle ESP32 entspricht der Pin mit der Bezeichnung "IO36 / A0" (GPIO36) Arduino
A0
, aber "IO39 / A1" (GPIO39) entspricht ArduinoA3
(nichtA1
), "IO34 / A2" (GPIO34) entspricht ArduinoA6
(nichtA2
) , etc.quelle