#1 2020-10-26 21:37:58

Sender
Учасник
Зареєстрований: 2020-10-26
Повідомлень: 7

Как зациклить выдачу сообщения в serial порт

Товарищи, может кто подскажет, только начинаю осваивать азы, написал скетч чтобы при нажатии кнопки в порт выдавало сообщение 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;
   }
}

Неактивний

#2 2020-10-27 09:35:30

г0сть
Гість

Re: Как зациклить выдачу сообщения в serial порт

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

#3 2020-10-27 10:29:37

Sender
Учасник
Зареєстрований: 2020-10-26
Повідомлень: 7

Re: Как зациклить выдачу сообщения в serial порт

г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 порту. Просто мне сейчас нужно отладить функциональные элементы кода. Второй раз в жизни леплю скетч и ничего пока не знаю, учусь на ходу.

Остання редакція Sender (2020-10-27 10:46:47)

Неактивний

#4 2020-10-27 12:10:40

г0сть
Гість

Re: Как зациклить выдачу сообщения в serial порт

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

#5 2020-10-27 14:43:26

Sender
Учасник
Зареєстрований: 2020-10-26
Повідомлень: 7

Re: Как зациклить выдачу сообщения в serial порт

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

Остання редакція Sender (2020-10-27 14:55:23)

Неактивний

#6 2020-10-27 15:16:41

г0сть
Гість

Re: Как зациклить выдачу сообщения в serial порт

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

#7 2020-10-27 15:58:22

Sender
Учасник
Зареєстрований: 2020-10-26
Повідомлень: 7

Re: Как зациклить выдачу сообщения в serial порт

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

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 и выключить эту серию нажатием другой кнопки.

Остання редакція Sender (2020-10-27 16:01:26)

Неактивний

#8 2020-10-27 17:19:56

г0сть
Гість

Re: Как зациклить выдачу сообщения в serial порт

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

#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;
   }
}

#9 2020-10-27 18:30:35

Sender
Учасник
Зареєстрований: 2020-10-26
Повідомлень: 7

Re: Как зациклить выдачу сообщения в serial порт

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

Неактивний

#10 2020-10-27 18:50:18

г0сть
Гість

Re: Как зациклить выдачу сообщения в serial порт

Sender пише:

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

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

#11 2020-10-27 18:54:57

Sender
Учасник
Зареєстрований: 2020-10-26
Повідомлень: 7

Re: Как зациклить выдачу сообщения в serial порт

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

Остання редакція Sender (2020-10-27 18:56:28)

Неактивний

#12 2020-10-27 19:03:14

г0сть
Гість

Re: Как зациклить выдачу сообщения в serial порт

Blink without Delay в помощь.

#13 2020-10-27 19:40:40

Sender
Учасник
Зареєстрований: 2020-10-26
Повідомлень: 7

Re: Как зациклить выдачу сообщения в serial порт

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

Остання редакція Sender (2020-10-27 19:41:04)

Неактивний

Швидке повідомлення

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

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