Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

Sender
2020-10-27 19:40:40

Создатель библиотеки уже помог мне. Всем спасибо!

г0сть
2020-10-27 19:03:14

Blink without Delay в помощь.

Sender
2020-10-27 18:54:57

Да, но как запустить серию постоянно повторяющихся  "Waiting" с периодичностью 500мс по короткому клику? По длинному нажатию серию я уже запускал по инструкции библиотеки, а с ONECLICK не знаю как запустить серию повторений.

г0сть
2020-10-27 18:50:18
Sender пише:

Я уже понял, что эта библиотека не способна выдавать серию по короткому нажатию

А BTN_ONECLICK это что? Все что не двойной клик и не удерживание можно расценивать как короткое нажатие  smile

Sender
2020-10-27 18:30:35

Та не, дружище, с LONGCLICK я уже разобрался и буду его применять для других функций, а теперь мне надо написать код, который по КОРОТКОМУ нажатию на кнопку должен выдать сначала Serial.println("Ready"); , а потом запустить СЕРИЮ из одинаковых Serial.println("Waiting..."); с периодичностью 500мс, эту серию чтобы можно было остановить ВТОРОЙ кнопкой. Я уже понял, что эта библиотека не способна выдавать серию по короткому нажатию, только через длинное нажатие. Поэтому надо делать свой код запуска серии, а с этим у меня проблемы))

г0сть
2020-10-27 17:19:56

Вам еще одну кнопку нужно добавить? Тогда как-то так

#include <shButton.h>

#define button1 5
#define button2 4

int flag2=0;

shButton btn1(button1);
shButton btn2(button2);

void setup()
{
  Serial.begin(9600);
}

void loop()
{
   if (!digitalRead(button1) && !flag2)
  {
   switch (btn1.getButtonState())
  {Serial.println("Ready");
    
    case BTN_DOWN:
    Serial.println("Ready");
    break;

case BTN_LONGCLICK:
      Serial.println("Waiting...");
    delay(500);
       break;

    case BTN_UP:
    Serial.println("Good!");
     break;  
   }
  }

 switch (btn2.getButtonState())
  {
  case BTN_DOWN:
  flag2=1;
  Serial.println("GOOD");
  break;
   }
}
Sender
2020-10-27 15:58:22

Не получается, попробовал сделал так

case BTN_DOWN:
  Serial.println("Ready");
  case BTN_ONECLICK:
  Serial.println("Waiting...");

Но серия при этом не запускается, а только дублируется Waiting..., вот так:

Ready
Waiting...
Waiting...

#include <shButton.h> // https://github.com/VAleSh-Soft/shButton

#define button1 5
#define button2 4

shButton btn1(button1);
shButton btn2(button2);

void setup()
{
  Serial.begin(115200);
  btn1.setLongClickMode(LCM_CLICKSERIES);
  btn1.setVirtualClickOn(true);
  
}

void loop()
{
  switch (btn1.getButtonState())
  {
  case BTN_DOWN:
  Serial.println("Ready");
  case BTN_ONECLICK:
  Serial.println("Waiting...");
  break;
  } 
       
  switch (btn2.getButtonState())
  {
  case BTN_DOWN:
  Serial.println("GOOD");
  break;
   }
}

Чет никак не могу придумать как настроить ONECLICK на выдачу серии как при LONGCLICK и выключить эту серию нажатием другой кнопки.

г0сть
2020-10-27 15:16:41

Попробуйте с этим поиграться
BTN_ONECLICK (5) - виртуальный одиночный клик, следует через некоторый интервал после нажатия кнопки, если за это время не последовал двойной клик или длительное удержание кнопки нажатой; по умолчанию событие отключено, включается методом btn.setVirtualClickOn(true); режим виртуального клика позволяет раздельно обрабатывать одиночный, двойной клик и удержание кнопки нажатой без написания дополнительного кода в скетче;

Sender
2020-10-27 14:43:26

Спасибо, все получилось и от delay избавился. Но не могу придумать как решить другую задачу - Короткое нажатие кнопки - выдает 1 раз Serial.println("Ready"); и запускается серия Serial.println("Waiting..."); которая должна продолжаться пока не нажать кликом другую кнопку. Чет в библиотеке я не нашел запуск серии по короткому клику.

г0сть
2020-10-27 12:10:40
Sender пише:

Так это и есть полный код, я только не показал первую строку адреса библиотеки #include <shButton.h> // https://github.com/VAleSh-Soft/shButton

Здесь не у всех есть хрустальные шары чтобы видеть что за бибиотеки вы используете.

Sender пише:

Попробовал сейчас обернуть в while (digitalRead(button1) == LOW) - получилось, при нажатой кнопке выдает каждую секунду "Waiting" но вылезла другая проблема - мне понадобилось чтобы при нажатой кнопке 1 раз  выдало сообщение "Ready", а потом постоянно каждую секунду "Waiting", но при отпускании кнопки сразу выдает поток из 30-40 сообщений "Ready" и только потом  "Good" , а надо чтобы при отпускании кнопки просто переставало выдавать каждую секунду "Waiting" и сразу показало сообщение "Good".

А зачем вам while если в используемой вами библиотеке есть процедура BTN_LONGCLICK. Читайте внимательно описание того что применяете и не изобретайте велосипед.

з/ы и избавьтесь от delay

Sender
2020-10-27 10:29:37
г0сть пише:

Для начала покажите полный код

Так это и есть полный код, я только не показал первую строку адреса библиотеки #include <shButton.h> // https://github.com/VAleSh-Soft/shButton

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

Попробовал сейчас обернуть в while (digitalRead(button1) == LOW) - получилось, при нажатой кнопке выдает каждую секунду "Waiting" но вылезла другая проблема - мне понадобилось чтобы при нажатой кнопке 1 раз  выдало сообщение "Ready", а потом постоянно каждую секунду "Waiting", но при отпускании кнопки сразу выдает поток из 30-40 сообщений "Ready" и только потом  "Good" , а надо чтобы при отпускании кнопки просто переставало выдавать каждую секунду "Waiting" и сразу показало сообщение "Good".

#include <shButton.h> // https://github.com/VAleSh-Soft/shButton

#define button1 5

shButton btn1(button1);

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  switch (btn1.getButtonState())
  {
    case BTN_DOWN:
    Serial.println("Ready");
    while (digitalRead(button1) == LOW) {
    Serial.println("Waiting...");
    delay(1000);
     }
     break;
    case BTN_UP:
    Serial.println("Good!");
     break;  
   }
}

может надо правильно условие задать для while, я просто не знаю как.
Понятное дело, что эти сообщения чисто для примера и проверки кода, в конечном коде будут команды для управления другим устройством по serial порту. Просто мне сейчас нужно отладить функциональные элементы кода. Второй раз в жизни леплю скетч и ничего пока не знаю, учусь на ходу.

г0сть
2020-10-27 09:35:30

Для начала покажите полный код

Sender
2020-10-26 21:37:58

Товарищи, может кто подскажет, только начинаю осваивать азы, написал скетч чтобы при нажатии кнопки в порт выдавало сообщение Waiting... , а при отпускании Good!, так вот не получается сделать так, чтобы при нажатой кнопке сообщение Waiting... постоянно выдавалось каждую секунду, а при отпускании кнопки прекращало и 1 раз выдавало Good!. Пытался заворачивать Serial.println("Waiting..."); в for, но не работает так как надо.

#define button1 5

shButton btn1(button1);

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  switch (btn1.getButtonState())
  {
    case BTN_DOWN:
    Serial.println("Waiting...");
    break;
    
    case BTN_UP:
    Serial.println("Good!");
    break;
   }
}

Підвал форуму