Использование аналогового входа для чтения кнопки
Я работаю над проектом, в котором использую множество контактов Arduino; У меня закончилось большинство контактов, и мне нужно прочитать значение кнопки.
Можно ли прочитать значение переключателя в аналоговых пинах на плате??
Если да, то как это реализовать?
@JacobCaldwell, 👍2
4 ответа
Лучший ответ:
Можно ли считать значение переключателя на аналоговых входных контактах на плате??
Да. Аналоговые входные контакты также являются цифровыми контактами ввода-вывода. Вы можете использовать их точно так же, как и все остальные контакты на плате.
На устройствах 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, когда все переключатели открыты.
Сначала можно использовать быстрое аналоговое считывание (около 13 мкс), чтобы определить, нажат ли какой-либо переключатель; например, если первое показание выше 1/2 В. В некоторых системах быстрое считывание может быть достаточно хорошим само по себе для декодирования номера переключателя; если нет, возьмите второе показание с помощью обычного аналогового считывания. В любом случае, учитывая аналоговое считывание ar
, и позволяя CPS
быть ожидаемым шагом в подсчетах от одного переключателя до следующего (в этом случае либо 256/5, либо 1024/5 в зависимости от использования 8 или 10 бит показаний), вычислите номер переключателя с помощью чего-то вроде s = (ar+CPS/2)/CPS;
.
То же самое происходит и со мной.
Вот мой код. У меня работает.
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); // Иначе светодиод выключен
}
Можно ли прочитать значение переключателя в аналоге в пинах на доске??
Как говорят другие ответы, вы можете использовать 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);
}
}
- Преобразование строки в массив символов
- Как работать с аналоговыми контактами в цикле?
- Можно ли использовать цифровые контакты в качестве выхода ШИМ?
- Bluetooth-модуль HC-05 не принимает AT-команды
- Двоичный в десятичный с использованием побитовых операторов
- Объединение кода для нескольких датчиков в одной программе
- Неверные показания аналогового термистора
- Использование модуля JYETech 2.4 Inch LCD Display Screen Module с Arduino?
например
digitalRead(A1)
, @Gerben