Использование аналогового входа для чтения кнопки

Я работаю над проектом, в котором использую множество контактов Arduino; У меня закончилось большинство контактов, и мне нужно прочитать значение кнопки.

Можно ли прочитать значение переключателя в аналоговых пинах на плате??

Если да, то как это реализовать?

, 👍2


4 ответа


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

1

Можно ли считать значение переключателя на аналоговых входных контактах на плате??

Да. Аналоговые входные контакты также являются цифровыми контактами ввода-вывода. Вы можете использовать их точно так же, как и все остальные контакты на плате.

,

например digitalRead(A1), @Gerben


2

На устройствах ATmega640/ATmega1280/ATmega1281/ATmega2560/ATmega2561 (с Arduino Mega, использующим ATmega640 или 2560) аналоговые входные контакты имеют свои аналоговые возможности в дополнение к стандартным цифровым возможностям. Их можно использовать для чтения или записи цифровых значений, как и другие цифровые контакты на устройстве.

На устройствах ATmega48A/PA/88A/PA/168A/PA/328/P (с Arduino Uno, использующим устройство семейства ATmega168 или 328) аналоговые входы A0 ... A5 имеют стандартные цифровые возможности, но A6 и A7 их нет. A6 и A7 на Uno или Nano ограничены аналоговым входом. Однако вы можете использовать схему, подобную следующей, для мультиплексирования нескольких кнопок. При подключении этой схемы к A6 вы получите 1 В на A6 при нажатии S1; 2 В при нажатии S2; 3 В при нажатии S3 и т. д. Вы получите 0 В на A6, когда все переключатели открыты. лестничная схема с 5 переключателями и 9 резисторами

Сначала можно использовать быстрое аналоговое считывание (около 13 мкс), чтобы определить, нажат ли какой-либо переключатель; например, если первое показание выше 1/2 В. В некоторых системах быстрое считывание может быть достаточно хорошим само по себе для декодирования номера переключателя; если нет, возьмите второе показание с помощью обычного аналогового считывания. В любом случае, учитывая аналоговое считывание ar, и позволяя CPS быть ожидаемым шагом в подсчетах от одного переключателя до следующего (в этом случае либо 256/5, либо 1024/5 в зависимости от использования 8 или 10 бит показаний), вычислите номер переключателя с помощью чего-то вроде s = (ar+CPS/2)/CPS;.

,

1

То же самое происходит и со мной.

Вот мой код. У меня работает.

const int kPinBtn = A0;  // Кнопка, подключенная к аналоговому выводу A0
const int kPinLED = 13;  // Светодиод подключен к цифровому выводу 13

void setup()
{
  pinMode(kPinBtn, OUTPUT); // Обычно в кнопке мы принимаем ВХОД как параметр, но здесь мы берем ВЫХОД, потому что АНАЛОГОВЫЙ ПИН

  digitalWrite(kPinBtn, HIGH); // Сделать условие кнопки HIGH

  pinMode(kPinLED, OUPUT);
}

void loop()
{
  // Теперь обычная работа кнопки, светодиод мигает при нажатии кнопки

  if(digitalRead(kPinBtn) == LOW)  // Если кнопка нажата
  {
    digitalWrite(kPinLED, HIGH);   // Мигание светодиода
  }
  else digitalWrite(kPinLED, LOW); // Иначе светодиод выключен
}
,

1

Можно ли прочитать значение переключателя в аналоге в пинах на доске??

Как говорят другие ответы, вы можете использовать digitalRead на большинстве аналоговых контактов. Но чтобы ответить на вопрос: да, вы можете читать аналоговый вход, что полезно для таких контактов, как A6/A7, которые нельзя использовать в качестве цифровых контактов.

Вы должны соединить контакт с подтягивающим резистором — для контактов Arduino A0-A5 (в зависимости от платы, я имею в виду Nano) это можно сделать внутренне, используя:

pinMode(5, INPUT_PULLUP); // Включаем внутренний подтягивающий резистор на контакте 5

Если вы работаете с контактами A6/A7, вы не можете получить доступ к внутреннему подтягивающему резистору, поэтому вам необходимо добавить свой собственный, чтобы предотвратить плавающий вход. Резистор номиналом 10 КБ должен ставиться между входным контактом и VCC.

Наконец, пример чтения входных данных:

const int buttonPin = A7;     // номер контакта кнопки
const int ledPin =  13;      // номер контакта светодиода

void loop() {
  // читаем состояние значения кнопки:
  buttonState = analogRead(buttonPin);

  Serial.println(buttonState);

  // проверяем, нажата ли кнопка. Если это так, то состояние кнопки ВЫСОКОЕ:
  if (buttonState > 512) {
    // включаем светодиод:
    digitalWrite(ledPin, HIGH);
  } else {
    // выключаем светодиод:
    digitalWrite(ledPin, LOW);
  }
}
,