analogRead (0) або analogRead (A0)


14

У посиланні arduino вказується, що ви будете використовувати наступний код для читання значення з аналогового штифта №5:

int val1 = analogRead(5);

Однак для читання з цифрового штифта №5 ви передасте той самий номер контакту digitalRead:

int val2 = digitalRead(5);

Чи не слід використовувати analogRead(A5)замість цього analogRead(5)?

Якщо ні, то що робить наступний код:

int val3 = analogRead(A5);

Відповіді:


28

Щоб відповісти на конкретні запитання Тіло:

analogRead(5)і digitalRead(5)буде читати з двох різних місць. Колишній буде зчитувати з аналогового каналу 5або A5і останній буде читати з пальця 5 , який відбувається , щоб бути цифровий контактний. Так що так, якщо ви хочете прочитати аналоговий штифт, digitalReadвам слід скористатися A5.

Чому?

analogReadпотрібен номер каналу внутрішньо, але це дозволить вам надати і номер PIN-коду. Якщо ви дасте йому PIN-код, він перетворить його на відповідний номер каналу. Наскільки я можу сказати, analogReadце єдина функція, яка використовує номер каналу внутрішньо, єдина, яка дозволяє номер каналу, і є єдиною функцією з цим незадокументованим перетворенням між каналами. Щоб зрозуміти це, почнемо з кількох прикладів.

Якщо ви хочете використовувати analogReadна першому аналоговому штифті, A0ви можете зробити analogRead(0)номер каналу або analogRead(A0)номер контакту. Якби ви використовували варіант номера PIN-коду, analogReadвін перетворив би номер PIN-коду A0у його власний номер каналу 0.

Якщо ви хочете використовувати digitalWriteна першому аналоговому штифті, A0ви можете лише зробити digitalWrite(A0, x). digitalWriteне використовує аналогові канали внутрішньо і не дозволяє вам передавати йому номер каналу. Ну, це дозволить , але ви виберете неправильний штифт. Це ж стосується digitalReadі рівних analogWrite.

Що з конверсіями між каналами 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;

Для порівняння ось аналоговий код визначення штифтів для Argaino 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 для свого проекту як цифрові?


1
Я хоч і був саме так, як ви пояснили, я просто заплутався в посиланні на Arduino, яке містить неправдиву інформацію.
Тиїло

1
Також ви можете робити тількиanalogRead на аналогових штифтах! З іншого боку, analogWriteможна використовувати як аналогові, так і ШІМ-штифти.
Тиїло

1
@Tyilo Я оновив свою відповідь дещо точнішою інформацією, взятою з вихідного коду.
Кевін Марк

3
analogWrite () можна викликати на будь-якому із штифтів, але це лише щось робить на PWM-штифтах. На невідомих штифтах, що не належать до ШІМ, та на всіх аналогових штирях, він просто викликає digitalWrite ().
baldengineer

3
@powtac - Загальновизнано, що документація на ардуїно досить мерзотна, принаймні тут. Не відчувайте, що вам щось не вистачає, це не ви, це люди ардуїно.
Connor Wolf

3

Я витратив на це години. Я думав, що у мене проблема з обладнанням. Виявляється, я дзвонив analogRead()неправильно.

Неправильний (помилковий зразок коду від DFRobot 😣):

val = analogRead(0); //connect sensor to Analog 0

Правильно:

val = analogRead(A0); //connect sensor to Analog 0

Оновлення : analogRead()приймає штифтові номери GPIO. A0тощо - #defines для номерів штифтів Arduino, де A0 == 36.

Будьте уважні: наприклад, FireBeetle ESP32, штифт з написом "IO36 / A0" (GPIO36) дорівнює Arduino A0, але "IO39 / A1" (GPIO39) дорівнює Arduino A3(не A1), "IO34 / A2" (GPIO34) дорівнює Arduino A6(не A2) тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.