Как работать с аналоговыми контактами в цикле?

Я хочу сделать что-то в духе

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

Что, по-видимому, работает, но следующее-нет:

for (int i = 0; i < 4; i++) {
  pinMode(i, INPUT);
  pinMode(i + 4, OUTPUT); // должен превратить аналоговый вывод (i + 4) в выход
  digitalWrite(i + 4, LOW);
  analogRead(i);
}

Вместо этого он, по-видимому, рассматривает пин, адресованный digitalWrite(i + 4, LOW), как один из цифровых пинов.

Действительно ли я должен явно указывать A0, A1, A2, ... в любое время, когда я хочу зациклиться на аналоговых выводах?

, 👍8

Обсуждение

Мне нравятся ваши поэтические описания различных ответов! Метафоры уместны - но вы можете поместить их в кавычки для наших неродных английских читателей, чтобы подчеркнуть, что вы немного гиперболичны: "ядерный бункер", "бумажный самолетик" и т. Д., @John Burger


6 ответов


Лучший ответ:

11

Да, аналоговые контакты должны быть адресованы с использованием A0, A1,... при использовании их для цифрового ввода-вывода.

В зависимости от используемой платы A0,A1 и т.д. Сопоставляются с разными значениями (например,похоже, что A0 равно 18 на некоторых платах, но 14 на других.

Одним из решений для зацикливания аналоговых контактов было бы следующее:

static const uint8_t analog_pins[] = {A0,A1,A2,A3,A4};
// Настройка контактов для ввода
for (int i = 0; i < 5; i++) { //or i <= 4
  digitalRead(analog_pins[i]);
}

Если вы используете аналоговые контакты только с вызовом analogRead (), вы можете использовать 0,1,... вместо A0, A1,...

,

Согласно http://arduino.cc/en/Reference/analogRead вы можете считывать данные с аналоговых выводов просто по номеру (например, 0, 1, 2, 3 и т.д.); буква "А" в "А0" необязательна. Конечно, это может быть более понятным, если вы различаете их с префиксом "А", но это не требуется для analogRead. С другой стороны, "digitalWrite(i)" предполагает, что " i "относится к цифровому контакту; чтобы использовать digitalWrite с аналоговым контактом, необходимо включить префикс "A"., @heypete

Хороший улов. Я обновил ответ., @Craig

Это самое портативное решение, которое я видел до сих пор, и я использую его сейчас, спасибо., @Alex Shroyer


0

Ваш первый цикл действительно будет работать просто отлично, однако вы можете добавить задержку(1); после того, как вы прочитаете аналог(i);, чтобы дать АЦП некоторое время на урегулирование.

Не могли бы вы подробнее рассказать о том, что вы пытаетесь сделать со своим вторым фрагментом кода? Как это выглядит прямо сейчас, на самом деле нет смысла использовать аналоговые входы в качестве цифровых выходов.

Кроме того, вы пытаетесь прочитать ввод контакта всего через пару строк после того, как указали, что контакт является выходом.

Пожалуйста, объясните, чего вы пытаетесь достичь, чтобы добрые люди здесь могли вам лучше помочь.

,

5

По крайней мере, Uno/Megas/leonardos, все значения, сопоставленные с аналоговыми номерами контактов, являются последовательными, поэтому

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

установит A0, A1, A2 и A3 для ВЫВОДА, а затем НИЗКИЙ.

,

0

Контакты с 14 по 19 являются аналоговыми контактами от A0 до A5. A0-это просто псевдоним для 14 и так далее.

Итак, еще один способ написания ответа БреттА:

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

Это работает не на всех платах Arduino. Не все платы используют контакты 14-19., @Craig


0

Я знаю, что это устарело, но если вы наведете курсор мыши на A0-A7 в visual micro, он покажет вам истинное значение, это всего лишь переменная (на самом деле она отображается как 14U, но при обращении вам не нужно включать U). То, что сказал Крейг, неправильно, они НЕ должны решаться с помощью A0, A1 ect..

A0 = 14 А1 = 15 . . А7 = 21

//Установит все контакты, цифровые и аналоговые, на LOW (0)
for (int i = 1; i < 22; i++) {
    digitalWrite(i, LOW);
}

//Установит все аналоговые контакты на LOW (0)
for (int i = 14; i < 22; i++) {
    digitalWrite(i, LOW);
}

//Установит все аналоговые контакты на LOW (0)
for (int i = A0; i < A7 + 1; i++) {
    digitalWrite(i, LOW);
}

Последний цикл for в основном говорит, что i = 1 (A0), и останавливается на 21 (A7).

,

0

Предполагая, что номера контактов являются последовательными, вы можете перебирать их:

int acc = 0;
for (int Ai = A0; Ai < A0 + NUM_ANALOG_INPUTS; Ai++) {
    acc += analogRead(Ai);
}
Serial.println(acc);
,