Aby odpowiedzieć na szczegółowe pytania Tyilo:
analogRead(5)
i digitalRead(5)
będzie czytać z dwóch różnych miejsc. Pierwszy odczyta z kanału analogowego 5
lub A5
drugi odczyta z pinu 5, który okazuje się być pinem cyfrowym. Tak, jeśli chcesz czytać analogowy pin digitalRead
, powinieneś go używać A5
.
Dlaczego?
analogRead
wymaga numeru kanału wewnętrznie, ale pozwoli ci również nadać mu numer PIN. Jeśli nadasz mu numer pinu, przekształci go w odpowiedni numer kanału. O ile wiem, analogRead
jedyna funkcja, która korzysta z numeru kanału wewnętrznie, jest jedyną, która pozwala na numer kanału i jest jedyną funkcją z tą nieudokumentowaną konwersją pin-to-channel. Aby to zrozumieć, zacznijmy od kilku przykładów.
Jeśli chcesz użyć analogRead
pierwszego pinu analogowego A0
, możesz zrobić, analogRead(0)
który używa numeru kanału lub analogRead(A0)
który używa numeru pinu. Jeśli użyjesz wariantu numeru pinu, analogRead
przekonwertujesz numer pinu A0
na właściwy numer kanału 0
.
Jeśli chcesz użyć digitalWrite
pierwszego analogowego pinu, A0
możesz to zrobić tylkodigitalWrite(A0, x)
. digitalWrite
nie korzysta z kanałów analogowych wewnętrznie i nie pozwala przekazać numeru kanału. Cóż, to niech cię ale ty wybrałeś niewłaściwy kod PIN. To samo dotyczy, digitalRead
a nawet analogWrite
.
Co z konwersjami pin-to-channel wykonanymi przez analogRead
? Źródło tej funkcji można znaleźć w hardware/arduino/avr/cores/arduino/wiring_analog.c
: Zobaczysz, że wykonuje ona proste odejmowanie w zależności od typu płytki. Plik A0
/ A1
/ A2
/ itp. Stałe reprezentują liczbę pinów kanałów analogowych i mogą być używane wszędzie tam, gdzie potrzebujesz odwoływać się do wejść analogowych. Z tego powodu są najlepszą opcją do użycia w kodzie Arduino, ponieważ jest oczywiste, że używasz tego samego portu fizycznego, nawet jeśli używasz różnych funkcji. Definicje tych stałych zależą od twojej planszy.
Na przykład, oto kod definicji pinów analogowych dla Arduino Uno w 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;
Dla porównania tutaj jest analogowy kod definicji pin dla 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;
Dalsza dyskusja EE na temat pinów analogowych: Czy mogę używać analogowych pinów na Arduino dla mojego projektu jako cyfrowego?
analogRead
na pinach analogowych! Z drugiej stronyanalogWrite
może być stosowany zarówno na pinie analogowym, jak i PWM.Spędziłem nad tym godziny. Myślałem, że mam problem ze sprzętem. Okazuje się, że dzwoniłem
analogRead()
niepoprawnie.Niepoprawny (błędny przykładowy kod z DFRobot 😣):
Poprawny:
Aktualizacja :
analogRead()
pobiera numery pinów GPIO.A0
itd. to #definicja numerów pinów Arduino, gdzieA0 == 36
.Bądź ostrożny: np. Na FireBeetle ESP32, pin oznaczony „IO36 / A0” (GPIO36) równa się Arduino
A0
, ale „IO39 / A1” (GPIO39) równa się ArduinoA3
(nieA1
), „IO34 / A2” (GPIO34) równa się ArduinoA6
(nieA2
) itp.źródło