Чтобы ответить на конкретные вопросы Tyilo:
analogRead(5)
и digitalRead(5)
будет читать из двух разных мест. Бывший будет считывать с аналогового канала 5
или A5
и последний будет читать из пальца 5 , который происходит , чтобы быть цифровой контактный. Так что да, если вы хотите прочитать аналоговый пин-код, digitalRead
вы должны использовать A5
.
Почему?
analogRead
требуется внутренний номер канала, но это также позволит вам присвоить ему пин-код. Если вы дадите ему пин-код, он будет преобразован в соответствующий ему номер канала. Насколько я могу судить, analogRead
единственная функция, которая использует номер канала внутри, единственная, которая разрешает номер канала, и единственная функция с этим недокументированным преобразованием pin-to-channel. Чтобы понять это, давайте начнем с нескольких примеров.
Если вы хотите использовать analogRead
первый аналоговый вывод, A0
вы можете analogRead(0)
использовать номер канала или analogRead(A0)
номер контакта. Если бы вы использовали вариант с номером контакта, analogRead
конвертировал бы номер контакта A0
в его правильный номер канала 0
.
Если вы хотите использовать digitalWrite
на первом аналоговом выводе, A0
вы можете только сделать digitalWrite(A0, x)
. digitalWrite
не использует аналоговые каналы внутри и не позволяет передавать ему номер канала. Ну, это позволит вам, но вы выберете неправильный контакт. То же касается digitalRead
и даже analogWrite
.
А как насчет преобразований pin-to-channel analogRead
? Источник этой функции можно найти в. hardware/arduino/avr/cores/arduino/wiring_analog.c
Вы увидите, что она выполняет простое вычитание в зависимости от типа платы. A0
/ A1
/ A2
/ И т.д.. Константы представляют номер контакта аналоговых каналов и могут использоваться везде, где вам нужно обратиться к аналоговым входам. По этой причине они являются лучшим вариантом для использования в вашем коде Arduino, потому что совершенно очевидно, что вы используете один и тот же физический порт, даже если вы используете разные функции. Определения этих констант зависят от вашей доски.
Например, вот код определения аналогового вывода для Arduino Uno в 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;
Для сравнения вот код определения аналогового вывода для 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;
Дальнейшее обсуждение EE аналоговых выводов: Могу ли я использовать аналоговые выводы на Arduino для моего проекта в качестве цифрового?
analogRead
на аналоговые контакты! С другой стороны,analogWrite
может использоваться как на аналоговых, так и на ШИМ-выводах.Я потратил часы на это. Я думал, что у меня проблема с оборудованием. Оказывается, я звонил
analogRead()
неправильно.Неверно (ошибочный пример кода от DFRobot 😣):
Верный:
Обновление :
analogRead()
принимает номера контактов GPIO.A0
и т. д. являются #defines для номеров выводов Arduino, гдеA0 == 36
.Будьте осторожны: например, в FireBeetle ESP32, вывод с меткой «IO36 / A0» (GPIO36) равен Arduino
A0
, но «IO39 / A1» (GPIO39) равен ArduinoA3
(неA1
), «IO34 / A2» (GPIO34) равен ArduinoA6
(неA2
) , и т.д.источник