Ви не увійшли.
Товарищи, может кто подскажет, только начинаю осваивать азы, написал скетч чтобы при нажатии кнопки в порт выдавало сообщение 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;
}
}
Неактивний
Для начала покажите полный код
Для начала покажите полный код
Так это и есть полный код, я только не показал первую строку адреса библиотеки #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)
Неактивний
Так это и есть полный код, я только не показал первую строку адреса библиотеки #include <shButton.h> // https://github.com/VAleSh-Soft/shButton
Здесь не у всех есть хрустальные шары чтобы видеть что за бибиотеки вы используете.
Попробовал сейчас обернуть в while (digitalRead(button1) == LOW) - получилось, при нажатой кнопке выдает каждую секунду "Waiting" но вылезла другая проблема - мне понадобилось чтобы при нажатой кнопке 1 раз выдало сообщение "Ready", а потом постоянно каждую секунду "Waiting", но при отпускании кнопки сразу выдает поток из 30-40 сообщений "Ready" и только потом "Good" , а надо чтобы при отпускании кнопки просто переставало выдавать каждую секунду "Waiting" и сразу показало сообщение "Good".
А зачем вам while если в используемой вами библиотеке есть процедура BTN_LONGCLICK. Читайте внимательно описание того что применяете и не изобретайте велосипед.
з/ы и избавьтесь от delay
Спасибо, все получилось и от delay избавился. Но не могу придумать как решить другую задачу - Короткое нажатие кнопки - выдает 1 раз Serial.println("Ready"); и запускается серия Serial.println("Waiting..."); которая должна продолжаться пока не нажать кликом другую кнопку. Чет в библиотеке я не нашел запуск серии по короткому клику.
Остання редакція Sender (2020-10-27 14:55:23)
Неактивний
Попробуйте с этим поиграться
BTN_ONECLICK (5) - виртуальный одиночный клик, следует через некоторый интервал после нажатия кнопки, если за это время не последовал двойной клик или длительное удержание кнопки нажатой; по умолчанию событие отключено, включается методом btn.setVirtualClickOn(true); режим виртуального клика позволяет раздельно обрабатывать одиночный, двойной клик и удержание кнопки нажатой без написания дополнительного кода в скетче;
Не получается, попробовал сделал так
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)
Неактивний
Вам еще одну кнопку нужно добавить? Тогда как-то так
#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;
}
}
Та не, дружище, с LONGCLICK я уже разобрался и буду его применять для других функций, а теперь мне надо написать код, который по КОРОТКОМУ нажатию на кнопку должен выдать сначала Serial.println("Ready"); , а потом запустить СЕРИЮ из одинаковых Serial.println("Waiting..."); с периодичностью 500мс, эту серию чтобы можно было остановить ВТОРОЙ кнопкой. Я уже понял, что эта библиотека не способна выдавать серию по короткому нажатию, только через длинное нажатие. Поэтому надо делать свой код запуска серии, а с этим у меня проблемы))
Неактивний
Я уже понял, что эта библиотека не способна выдавать серию по короткому нажатию
А BTN_ONECLICK это что? Все что не двойной клик и не удерживание можно расценивать как короткое нажатие
Да, но как запустить серию постоянно повторяющихся "Waiting" с периодичностью 500мс по короткому клику? По длинному нажатию серию я уже запускал по инструкции библиотеки, а с ONECLICK не знаю как запустить серию повторений.
Остання редакція Sender (2020-10-27 18:56:28)
Неактивний
Blink without Delay в помощь.