Кнопки с подключением через АЦП

Esteriman

✩✩✩✩✩✩✩
4 Июн 2025
41
1
Приветствую!
Все порты заняты и две кнопки подключаю через АЦП (ардуино нано). Одна напрямую, другая через 10КОм. Вопрос в том есть ли библиотека для кнопок поддерживающая подключение через АЦП?
 

Esteriman

✩✩✩✩✩✩✩
4 Июн 2025
41
1
Да я тоже не нашел библиотеку.
Вот такой код написал, но работает не так как надо. При нажатии цифры перескакивают. Не понимаю что нужно сделать, чтобы четко отрабатывало нажатие: одно нажатие + одна цифра.

C++:
// обработать кнопки
void keysRoutine() {
  uint8_t a;
    if (millis()-t5 > 20) {
      t5 = millis();
      a = pressKey();
      if ((a == 1) && (pressed == 0)) { pressed = 1; alarmTimeInc(); t3 = millis(); }
      if ((a == 0) && (pressed == 1)) { pressed = 0; }
      if (a == 2) { modeHM = !modeHM; t3 = millis(); }
      if (millis()-t3 > 5000) { modeAlarm = 0; modeKeyT = 1; } // выключаем режим установления времение будильника
  }
}
uint8_t pressKey() {
int keyRead;
int static code;
  if (millis()-t6 > 5) {
    t6 = millis();
    keyRead = analogRead(keyPin); // прочитали значение
    if (keyRead < 128) code = 1;
    if ((keyRead > 128) && (keyRead < 812)) code = 2;
    return code;
  }
}
 

poty

★★★★★★★
19 Фев 2020
3,630
1,033

@Esteriman, gyverbutton поддерживает.
Нужно иметь в виду, что для простой аналоговой клавиатуры невозможно отследить нажатие комбинации клавиш. Это тоже можно сделать, но потребуется более сложная схема подключения.
 
  • Лойс +1
Реакции: Sana956

Esteriman

✩✩✩✩✩✩✩
4 Июн 2025
41
1
@poty нет gyverbutton только для обычного подключения. АЦП не поддерживается.
 

Мишутк

★✩✩✩✩✩✩
29 Мар 2025
91
38
Для аналога нужно точно так же как и для "обычной" кнопки делать обработку антидребезга. Кратко - устойчивый сигнал с уровнем в диапазоне одной из кнопок должен продержаться заданное время. Иначе в процессе "нажатия" кнопки с низким сопротивлением вы переходите через высокое сопротивление в момент замыкания (и АЦП вдобавок усредняет часть замера до замыкания и часть после), и вы получаете ошибочное значение.
 

Мишутк

★✩✩✩✩✩✩
29 Мар 2025
91
38
@Esteriman, подбирайте уже на своей сборке. 50мс для начала. Слишком короткий интервал - больше вероятность ошибки. Слишком длинный интервал - запаздывание в реакции на нажатие кнопок. Добейтесь работы без ошибок (программной части) на 50мс, потом, если не устроит получившееся запаздывание, уменьшайте интервал до тех пор, пока не начнут появляться ошибочные распознавания не тех кнопок.
 
  • Лойс +1
Реакции: Esteriman

EugeneFrol

★✩✩✩✩✩✩
17 Апр 2024
83
12
50
Мне, кажется, кнопки надо сканировать постоянно, чтобы не упустить изменения на входе.
Как-то так.:
uint32_t tsKey = 0;
int keyRead, keyCode, oldCode;

void loop(){
  keyRead = analogRead(keyPin);

  if(keyRead < 128) keyCode = 0;
  if(keyRead >= 128 && keyRead < 520) keyCode = 1;
  if(keyRead >= 520 && keyRead < 620) keyCode = 2;
  if(keyRead >= 620 && keyRead < 820) keyCode = 3;

  if(keyCode != oldCode){ tsKey = millis(); oldCode = keyCode; } // Фиксируем изменение на входе
  if(tsKey > 0 && millis() - tsKey > 50){ // Есть нажатие или отпускание, если keyCode = 0
    switch(keyCode){  // обработаем
      case 0: break;
      case 1: break;
      case 2: break;
      case 3: break;
    }
    tsKey = 0;  // Ждем нового изменения кода на входе
  }
}
 
Изменено:
  • Лойс +1
Реакции: Esteriman

Bruzzer

★★★★✩✩✩
23 Май 2020
796
245
@EugeneFrol,
Изначально вы спрашивали - есть ли библиотеки для аналоговых кнопок.
Вам ответили, что есть, в том числе и GyverButton.
Если же вы хотите написать свой код, то вариантов очень много, как и примеров в инете.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,350
1,328
Москва
@Esteriman,

analogKeyboard.ino:
// Пример использования библиотеки GyverButton с аналоговой клавиатурой
// аналоговая клавиатура подключена на А7
// Схему смотри на странице библиотеки https://alexgyver.ru/gyverbutton/
// также она есть в папке с примером

#include "GyverButton.h"

// создаём кнопки без привязки к пину
GButton myButt1;
GButton myButt2;
GButton myButt3;

void setup() {
  Serial.begin(9600);
  // меняем тип на LOW_PULL, потому что по умолчанию стоит HIGH_PULL
  myButt1.setType(LOW_PULL);
  myButt2.setType(LOW_PULL);
  myButt3.setType(LOW_PULL);
}

void loop() {
  // читаем значение
  int analog = analogRead(7);

  // для начала нужно вывести и запомнить значение для каждой кнопки
  //Serial.println(analog);

  // проверяем у каждой кнопки свой диапазон (+- 20 от полученного значения)
  myButt1.tick(analog < 860 && analog > 820);
  myButt2.tick(analog < 740 && analog > 700);
  myButt3.tick(analog < 650 && analog > 600);

  // проверка на удержание, например
  if (myButt1.isHolded()) {
    Serial.println("hold 1");
  }
  if (myButt2.isHolded()) {
    Serial.println("hold 2");
  }
  if (myButt3.isHolded()) {
    Serial.println("hold 3");
  }
 
  delay(10);  // задержка тут не нужна, чисто для вывода
}
 

Вложения

Esteriman

✩✩✩✩✩✩✩
4 Июн 2025
41
1
Благодарю всех за примеры кода и отзывы. Попробую сделать два варианта с библиотекой и без.
https://alexgyver.ru/gyverbutton/ страницы не существует. Ну и вот только что нашел новую библиотеку GyverKey, где присутствует поддержка аналоговой клавиатуры. И старая библиотека AnalogKey.
 

Esteriman

✩✩✩✩✩✩✩
4 Июн 2025
41
1
В общем, и Poty и Старик Похабыч совершенно правы: библиотека gyverbutton поддерживает аналоговые клавиатуры. Не увидел этого сразу т.к. на главной странице, на гитхабе, не заметил что-нибудь про аналоговую клавиатуру. Она только есть в примерах. Также и в более свежей EncButton.