Проблема с библиотекой <JC_Button.h>

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

Парни, помогите разобраться. Вот код:

  btnLEFT.read(); 

// Если нажатие короткое, то включаем / выключаем левый поворотник 

if (btnLEFT.wasReleased()){leftTurn = !leftTurn;} 

// Если нажатие длинное, и оба джойстика отпущены, то уменьшаем расходы 

if (btnLEFT.pressedFor(LONG_PRESS)) {consumption --; 
if (consumption == 0) {consumption = 1;} 
MainScreen(); 
delay(200);} 

// Считываем показания BUTTON_RIGHT / правый поворотник 

btnRIGHT.read(); 

// Если нажатие короткое, то включаем / выключаем правый поворотник 

if (btnRIGHT.wasReleased()){rightTurn = !rightTurn;} 

// Если нажатие длинное, и оба джойстика отпущены, то увеличиваем расходы 

if (btnRIGHT.pressedFor(LONG_PRESS)) {consumption ++; 
if (consumption == 6) {consumption = 5;} 
MainScreen(); 
delay(200);} 

// Считываем показания BUTTON_PROG / включаем / выключаем фары 
btnPROG.read(); 

// if (btnPROG.wasReleased()) {headLight = !headLight;} 

// btnPROG.read(); 

// Если нажатие короткое, то включаем / выключаем правый поворотник 

if (btnPROG.wasReleased()){headLight = !headLight;} 


// Считываем показания BUTTON_OK / включаем / выключаем спецсигнал 
btnOK.read(); 

if (btnOK.wasReleased()) {specialLight = !specialLight;}

Библиотека <JC_Button.h>

отрабатываются только первые 2 кнопки, которые идут по тексту. т.е. в данном случае будут работать кнопки btnLEFT и btnRIGHT. Поставлю первым btnOK и btnPROG - будут отрабатываться только они...

MaksVV
Offline
Зарегистрирован: 06.08.2015

по кнопкам берите лучше титоновый велосипед, библиотека проверенная. 

GarryC
Offline
Зарегистрирован: 08.08.2016

Ну это не код, а фрагмент кода ...

Так, на всякий случай, а почему изменение первых двух кнопкок вызывает перерисовку экрана, а остальных - нет ?

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

Ну, это франмент кода который приводит к ошибке. Вернее, работает не как хочется.

Пилю универсвльный пульт управляние на nrf24. Есть экран, на котором отображается номер выбранной модели и "расход", (не знаю, как правильно назвать, вроде как consumption, т.е. максимальная скорость). Длительное нажатие кнопок меню "влево" и "вправо" по идее должно увеличивать и уменьшать "расход". При этом меняется отображаемая информация на экране.

Короткое нажатие на кнопки работает как триггер для каждого канала, отображение на экране не требуется.

vvadim
Offline
Зарегистрирован: 23.05.2012

GarryC пишет:

Ну это не код, а фрагмент кода ...

Так, на всякий случай, а почему изменение первых двух кнопкок вызывает перерисовку экрана, а остальных - нет ?

 

наверное потому что для остальных перерисовка экрана не прописана.

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

Попробую "велосипед"

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

Так меняю порядок команд, ставлю первыми без прописовки экрана. Работают отлично, а те, что с экраном - нет.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vdm пишет:

Так меняю порядок команд, ставлю первыми без прописовки экрана. Работают отлично, а те, что с экраном - нет.

У Вас словесное описание и код различаются.

Если необходимо различать короткое и длинное нажатие, то на короткое нажатие необходимор реагировать только при отсутствии длинного. 

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

andriano пишет:

vdm пишет:

Так меняю порядок команд, ставлю первыми без прописовки экрана. Работают отлично, а те, что с экраном - нет.

У Вас словесное описание и код различаются.

Если необходимо различать короткое и длинное нажатие, то на короткое нажатие необходимор реагировать только при отсутствии длинного. 

А чем они различаются? 2 кнопки с отрабатыванием короткого и длинного нажатия, две - с отрабатыванием просто короткого...
Проблема в том, что отрабатываются только ЛЮБЫЕ 2 кнопки в коде...

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Уважаемый, прочитав этот пост, я так и не понял, что Вы хотите получить. Напишите как-нибудь попроще.Типа:

1) Если кнопка 1 будет нажата и отпущена в течении 1 секунды, то я включаю лампочку

2) Если кнопка 2 будет нажата и отпущена в течении 1 секунды, то я включаю бомбу

3) Если кнопка 1 будет нажата и более 1 секунды, то я выключаю лампочку

....

и. т.д.

Иначе все, что Вы пытаетесь запрограммировать упирается в Ваше непонятие того, что Вы хотите получить.

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

mykaida пишет:

Уважаемый, прочитав этот пост, я так и не понял, что Вы хотите получить. Напишите как-нибудь попроще.Типа:

1) Если кнопка 1 будет нажата и отпущена в течении 1 секунды, то я включаю лампочку

2) Если кнопка 2 будет нажата и отпущена в течении 1 секунды, то я включаю бомбу

3) Если кнопка 1 будет нажата и более 1 секунды, то я выключаю лампочку

....

и. т.д.

Иначе все, что Вы пытаетесь запрограммировать упирается в Ваше непонятие того, что Вы хотите получить.

 

Блин... Ну разве можно так читать?

MaksVV
Offline
Зарегистрирован: 06.08.2015
#include <Button.h>
Button test;

#define Button_Apin    7     // пин кнопки А
#define Button_Bpin    8     // пин кнопки B
#define Button_Cpin    9     // пин кнопки C
#define Button_Dpin    10    // пин кнопки D

#define Button_A       0     // программный номер кнопки А
#define Button_B       1     // программный номер кнопки B
#define Button_C       2     // программный номер кнопки C
#define Button_D       3     // программный номер кнопки D

void setup() {
Serial.begin(9600);
test.NO();                         // кнопки нормально разомкнутые 
test.pullUp();                     // включена внутрення подтяжка к питанию (кнопки при нажатии замыкают на GND)
test.duration_bounce       (  50); // время антидребезга
test.duration_click_Db     ( 250); // время дабл клика 
test.duration_inactivity_Up(5000); // время неактивности отпущенной кнопки
test.duration_inactivity_Dn(1000); // время неактивности нажатой кнопки
test.duration_press        ( 500); // время длительного нажатия

// ниже через запятую пишутся пины кнопок, соответственно в скетче программные номера у этих кнопок будут 0, 1 , 2 и т.д. и обращение к ним далее уже будет по программым номерам, поэтому выше рядом с дефайнами пинов сделаны дефайны программных номеров: 
test.button(Button_Apin, Button_Bpin, Button_Cpin, Button_Dpin);
}
void loop (){ 
test.read(); 

if (test.event_press_short  (Button_A)) {Serial.println("shortA");}
if (test.event_press_long   (Button_A)) {Serial.println("longA");}

if (test.event_press_short  (Button_B)) {Serial.println("shortB");}
if (test.event_press_long   (Button_B)) {Serial.println("longB");}

if (test.event_press_short  (Button_C)) {Serial.println("shortC");}
if (test.event_press_long   (Button_C)) {Serial.println("longC");}

if (test.event_press_short  (Button_D)) {Serial.println("shortD");}
if (test.event_press_long   (Button_D)) {Serial.println("longD");}


}

 

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

Спасибо за разные варианты.

Попробовал, но ни в одном случае не смог добиться 100% повторяемости результата. Иной раз приходится повторно нажимать на кнопку, чтоб свершилось "чудо". Это так и надо или у меня слишком завышенные требования к результату?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vdm пишет:

Спасибо за разные варианты.

Попробовал, но ни в одном случае не смог добиться 100% повторяемости результата. Иной раз приходится повторно нажимать на кнопку, чтоб свершилось "чудо". Это так и надо или у меня слишком завышенные требования к результату?

Без кода это сообщение абсолютно неинформативно.

Если же судить по исходному сообщению, то там у Вас куча delay(200) - с ним ничего устойчиво работать и не должно.

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

andriano пишет:

то там у Вас куча delay(200) - с ним ничего устойчиво работать и не должно.

Не куча, а 2... Это при обработке состояния "долго нажато" изменялись значения счетчика и выводилось значение на экран. Задержка нужна, чтоб  цифры не так быстро бежали. 

В обшем, побдел я эту неприятность. Дело было не в бабине. И Serial.println (параметр) очень помог. Код прекрасно отрабатывал все нажатия и менял значения соответственно, а изменения значений на какие попало происходило при заполнении массива.

b707
Offline
Зарегистрирован: 26.05.2017

vdm пишет:

Код прекрасно отрабатывал все нажатия и менял значения соответственно, а изменения значений на какие попало происходило при заполнении массива.

В итоге после полутора десятков сообщений пришли к тому, что ошибка была за пределами выложенной части кода :)

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

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

b707 пишет:

В итоге после полутора десятков сообщений пришли к тому, что ошибка была за пределами выложенной части кода :)

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

 

Зато я узнал еще несколько методов обработки событий с кнопками:)

Но никто из мЭтров не сказал, "слыш, нуб, тут у тебя все нормально, ищи в другом месте"

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vdm пишет:

Но никто из мЭтров не сказал, "слыш, нуб, тут у тебя все нормально, ищи в другом месте"

И даже, зараза, не сказал, в какой строке этого другого места.

 

А вообще, интересно - с чего это Вы решили, что "тут у тебя все нормально"? По выложенному фрагменту этого не скажешь.

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

andriano пишет:

И даже, зараза, не сказал, в какой строке этого другого места.

А вообще, интересно - с чего это Вы решили, что "тут у тебя все нормально"? По выложенному фрагменту этого не скажешь.

Я не спорю, программы пишу... Ну не долго. Очень не долго. Но я учусь.

Код, может быть и не идеален, но он работает.

А можно узнать, на что обратить внимание в приведенном коде для улучшения процесса?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vdm, Вы, вообще-то, начинаете совсем не с того.

Начинать нужно с подробного описания алгоритма. По-русски.

Вы же предлагаете взять код с ошибками и "исправить" его. 

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

Вы понимаете разницу между "сейчас работает" и "должен работать"?

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

Дальше: отладка - процесс примерно на порядок более трудоемкий, чем написание кода. Следовательно, код надо писать так, чтобы его легче было отлаживать. Следовательно, во многих случаях переписать код с нуля - рациональнее, чем пытаться исправить существующий код. А чтобы написать с нуля, опять же, нужно описание алгоритма, и совершенно не нужен неправильно работающий код.

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

andriano пишет:

vdm, Вы, вообще-то, начинаете совсем не с того.

Хорошо, учту. Исправлюсь.

Цитата:

Начинать нужно с подробного описания алгоритма. По-русски.

Код должен обабатывать кнопки btnLEFT, btnRIGHT, btnPROG и btnOK.

В результате короткого нажатия инвертируется состояние leftTurn, rightTurn, headLight и specialLight соответственно.

Длительное нажатие и удержание кнопок btnLEFT и btnRIGHT приводит к уменьшению и увеличению переменной consumption.

Переменные leftTurn, rightTurn, headLight и specialLight типа boolean.

- integer

Значения переменных leftTurn, rightTurn, headLight, specialLight и consumption записываются с массив и отправоляются в модуль nrf24l01.

int port[6];

Изначально был обьявлен массив port[6] куда я все и записывал. При этом возникала ошибка в переменных headLight, specialLight и consumption. 

  port[0] = thortle;                  // Записываем газ
  port[1] = steering;                 // записываем положение руля
  port[2] = leftTurn;                 // Левый поворотник
  port[3] = rightTurn;                // правый поворотник
  port[4] = headLight;                // фары
  port[5] = specialLight;             // спецсигнал
  port[6] = consumption;              // расходы

 

Когда изменил размер массива на 8, ошибка ушла.

Вероятнее всего вся проблема была в том, что я записывал в массив как значения int, так и boolean

MaksVV
Offline
Зарегистрирован: 06.08.2015

если у вас так:

vdm пишет:
 

  port[0] = thortle;                  // Записываем газ
  port[1] = steering;                 // записываем положение руля
  port[2] = leftTurn;                 // Левый поворотник
  port[3] = rightTurn;                // правый поворотник
  port[4] = headLight;                // фары
  port[5] = specialLight;             // спецсигнал
  port[6] = consumption;              // расходы

то вообще-то нужно создавать массив int port[7],  если что. 

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

MaksVV пишет:

если у вас так:

то вообще-то нужно создавать массив int port[7],  если что. 

Ну правильно... Если [6] то и пунктов 6.... [0] то не считаем... В)))))