Библа кнопки на аналоговом

dim3740

✩✩✩✩✩✩✩
17 Июн 2020
16
0
Нужна библа или метод обработки ОДНОЙ кнопки, но минимум с 3-я событиями (к примеру, короткое, 1 сек 3 сек или двойное).

На аналоговом пине A7.

C++:
vbool flag = false;
uint32_t btnTimer = 0;
bool btnState = false;

void loop()
{
  if (analogRead(A7) < 30)
  {
    btnState = 1;
  }
  else
  {
    btnState = 0;
  }

  if (btnState && !flag && (millis() - btnTimer) > 100)  // дребезг коротко
  {
    flag = true;
    btnTimer = millis();
    //..... бла -бла
  }

  if (btnState && flag && (millis() - btnTimer) > 1000) // долгое
  {
    btnTimer = millis();
    //..... бла -бла 2
  }

  if (!btnState && flag && millis() - btnTimer > 1000)
  {
    flag = false;
    btnTimer = millis();
  }

  // нужно третье
}
 

dim3740

✩✩✩✩✩✩✩
17 Июн 2020
16
0
Хорошо, спасибо. Лучше всего тогда я методом тыка проверю. В примерах у него я такого не вижу, и на сайте тоже не замечал описания такой возможности.
 

dim3740

✩✩✩✩✩✩✩
17 Июн 2020
16
0
У меня даже штатный пример не работает...

C++:
#include "GyverButton.h"

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

void setup() {
  Serial.begin(9600);
  // меняем тип на LOW_PULL, потому что по умолчанию стоит HIGH_PULL
  myButt1.setType(LOW_PULL);   // комментил, тоже не работает стоит внешний резистор на 2 ком
  //myButt2.setType(LOW_PULL);
  //myButt3.setType(LOW_PULL);
}

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

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

  // проверяем у каждой кнопки свой диапазон (+- 20 от полученного значения)
  myButt1.tick(analog < 1023 && analog > 0);   // стоит внешний резистор на 2 ком
  //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);  // задержка тут не нужна, чисто для вывода
}
вот другой оттуда же.... срабатывает хаотично..... Может резистор мешает на 2 ком внешний?

C++:
#include "AnalogKey.h"
// указываем пин и количество кнопок
AnalogKey<A7, 1> keys;

#include <GyverButton.h>
GButton btn1;

void setup() {
  Serial.begin(9600);
  // указываем сигналы кнопок аналоговой клавы
  keys.attach(0, 100);
 // keys.attach(1, 927);
 // keys.attach(2, 856);
}

void loop() {
  // тикаем кнопки как статусы аналоговых
  btn1.tick(keys.status(0));
 // btn2.tick(keys.status(1));
 // btn3.tick(keys.status(2));
 
  if (btn1.isClick()) Serial.println("click 0");
 // if (btn2.isClick()) Serial.println("click 1");
 // if (btn3.isClick()) Serial.println("click 2");

 // if (btn1.isHolded()) Serial.println("click 0");
 // if (btn2.isHolded()) Serial.println("hold 1");
 // if (btn3.isHolded()) Serial.println("hold 2");
}
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,237
942
штатный пример не работает
Похоже, Вы не только в header файлах разобраться не можете. Ну, например, Вы изменили условие нажатия аналоговой кнопки:
myButt1.tick(analog < 1023 && analog > 0); // стоит внешний резистор на 2 ком
Можете придумать сходу значение analog, которое бы не удовлетворяло этому условию? Внешний резистор 2кОм куда подключен? Как подключена кнопка?
Вы когда пример смотрите, сразу смотрите и описание к нему, а не "методом тыка".
 
  • Лойс +1
Реакции: dim3740

dim3740

✩✩✩✩✩✩✩
17 Июн 2020
16
0
да уж... я накосячил с диапазоном.... спасибо. Первый пример заработал. Второй пока и не буду тестить. Резистор - как внешняя подтяжка - вроде не мешает.