Подключение аналоговой клавиатуры

martinways
Offline
Зарегистрирован: 25.09.2020

Товарищи знатоки, подскажите начинающему если не трудно. Из-за необходимости освободить цифровые порты пришлось использовать аналоговую клавиатуру, подключил библиотеку Алекса Гайвера, все функции получается реализовать, а вот с одной никак не выходит, хотя этот же код работал на другой библиотеке для цифровых выходов. Кнопка myButt1 запускает серию сообщений "Working" с интервалом 1000ms, а нажатие на кнопку myButt2 должно остановить эту серию и выдать сообщение STOP. Так вот серия запускается, но на кнопку butt2  нет реакции. Возможно я неправильно выставил условие if (myButt2.isClick()) ? Вот ссылка на гайд по библиотеке  https://alexgyver.ru/gyverbutton/

#include "GyverButton.h" /// https://github.com/AlexGyver/GyverLibs/releases/download/GyverButton/Gyv...

GButton myButt1;
GButton myButt2;
GButton myButt3;

long previousMillis = 0;
long interval = 1000;

void runSeries(){
  for (;;)
{
if (myButt2.isClick())
{
   Serial.println("STOP");
} 
else 
{
unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) 
  {
  previousMillis = currentMillis;
  Serial.println("Working");
  }
}
}
}

void setup() {
  Serial.begin(9600);
}
void loop() {
  int analog = analogRead(0);
  myButt1.tick(analog < 860 && analog > 820);
  myButt2.tick(analog < 740 && analog > 700);
  myButt3.tick(analog < 650 && analog > 600);

  if (myButt1.isClick()) {
    Serial.println("Start");
    runSeries();
  }
  if (myButt3.isClick()) {
    Serial.println("Button 3 pressed");
  }
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Используй флаг(и). 
А гайвера тут не показывай, не любят его тут. 

martinways
Offline
Зарегистрирован: 25.09.2020

BOOM пишет:

Используй флаг(и). 
А гайвера тут не показывай, не любят его тут. 

А можно подробнее про флаг? Мне просто еще не приходилось его применять)) Просто пару дней как с ардуинкой начал играться впервые. А про Гайвера не знал, точнее я про него узнал только тогда, когда нашел эту его библиотеку))

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

чтобы кнопка срабатывала, необходимо вызывать ее метод tick() как можно чаще. А чтобы работала аналоговая кнопка - еще и читать analogRead() Переташите эти действия в процедуру runSeriaes() - решите проблему.

Но это кривое решение "в лоб". Правильнее будет переписать программу, избавится от бесконечного цикла  for в процедуре и использовать флаги. Старайтесь сразу привыкать к правильной логике программа - не использовать delay, while и бесконечные циклы

martinways
Offline
Зарегистрирован: 25.09.2020

b707 пишет:

чтобы кнопка срабатывала, необходимо вызывать ее метод tick() как можно чаще. А чтобы работала аналоговая кнопка - еще и читать analogRead() Переташите эти действия в процедуру runSeriaes() - решите проблему.

Но это кривое решение "в лоб". Правильнее будет переписать программу, избавится от бесконечного цикла  for в процедуре и использовать флаги. Старайтесь сразу привыкать к правильной логике программа - не использовать delay, while и бесконечные циклы

Мне хотя бы и в лоб для начала сделать ,чтобы заработало, я перфекционизмом можно заниматься когда уже хоть немножко буду знать что к чему)) Значит в процедуру runSeries  надо скопировать 

int analog = analogRead(0);

  myButt1.tick(analog < 860 && analog > 820);
  myButt2.tick(analog < 740 && analog > 700);
  myButt3.tick(analog < 650 && analog > 600);
 
Так? А как "вызывать ее метод tick() как можно чаще" ? Только не сердитесь на мои элментарные вопросы, я же только пару дней как начал изучать ардуино на основе чужих скетчей смотрю принцип как сделано и леплю свои.
b707
Offline
Зарегистрирован: 26.05.2017

martinways пишет:

 изучать ардуино на основе чужих скетчей смотрю принцип как сделано и леплю свои.

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

martinways
Offline
Зарегистрирован: 25.09.2020

b707 пишет:

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

Да это понятно, без теории никуда, но кое-что конечно можно сделать и просматривая другие скетчи, я уже пару своих устройств запустил таким образом и доволен как слон)) Просто мне очень хотелось бы запустить еще одно устройство сегодня и вот только вышеописанная проблемка не дает мне этого сделать. Сами понимаете, что  довольно маленькая вероятность того, что если я возьмусь прямо сейчас за учебник С++, то мне удастся понять как применить Ваш совет насчет вызова метод tick(). Если не хотите показать пример как это сделать просто так, то за какую сумму сможете мне в этом помочь? Заранее благодарю!

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

martinways пишет:

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

да я вам уже помог. Строчки, которые я сказал перенести - и есть метод tick() для трех кнопок. Смотрите внимательнее на начало строчки:

myButt3.tick(analog < 650 && analog > 600);

Учите теорию. А то вам ответ подскажут, а вы даже не сможете понять, о чем разговор, как в этом случае.

 

martinways
Offline
Зарегистрирован: 25.09.2020

b707 пишет:

да я вам уже помог. Строчки, которые я сказал перенести - и есть метод tick() для трех кнопок. Смотрите внимательнее на начало строчки:

К сожалению, никаких изменений не произошло после копирования, серия запускается, но так же не останавливается кнопкой myButt2, программа застревает внутри runSeries

#include "GyverButton.h" /// https://github.com/AlexGyver/GyverLibs/releases/download/GyverButton/GyverButton.zip

GButton myButt1;
GButton myButt2;
GButton myButt3;

long previousMillis = 0;
long interval = 1000;

void runSeries(){
  int analog = analogRead(0);
  myButt2.tick(analog < 740 && analog > 700);
  for (;;)
{
if (myButt2.isClick())
{
   Serial.println("STOP");
} 
else 
{
unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) 
  {
  previousMillis = currentMillis;
  Serial.println("Working");
  }
}
}
}

void setup() {
  Serial.begin(9600);
}
void loop() {
  int analog = analogRead(0);
  myButt1.tick(analog < 860 && analog > 820);
  myButt2.tick(analog < 740 && analog > 700);
  myButt3.tick(analog < 650 && analog > 600);
  if (myButt1.isClick()) {
    Serial.println("Start");
    runSeries();
  }
  if (myButt3.isClick()) {
    Serial.println("Button 3 pressed");
  }
}

 

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

Потому что неправильно перенесли. Попробуйте все же понять, как работает ваш (ваш ? :) код, в частности процедура runSeries()

А подсказывать конкретное место, куда надо поставить каждую строчку - это уже не уважать ни вас, ни себя.

martinways
Offline
Зарегистрирован: 25.09.2020

b707 пишет:

Потому что неправильно перенесли. Попробуйте все же понять, как работает ваш (ваш ? :) код, в частности процедура runSeries()

А подсказывать конкретное место, куда надо поставить каждую строчку - это уже не уважать ни вас, ни себя.

Ну я не считаю, что подсказав Вы проявляете неуважение к кому-либо. Тем не менее, посмотрел, подумал, получилось! Огромное спасибо! Будем грызть гранит науки, а то идей разных полезных устройств масса, а каждый раз платить за каждый скетч довольно накладно, я имею ввиду не то, что программисты дорого берут, а то, что допустим задумал устройство, сформировал прогеру задачу, он сделал, я оплатил, а тут в процессе возникли еще мысли по внедрению еще какой-то функции или изменения существующей и получается человек уже недоволен тем, что договорились по одному набору функций, а тут прибавляются постоянно еще изменения и это все довольно сложно оценивать. Сразу взять и придумать что-то крутое не допиливая тех задание по ходу разработки практически невозможно.

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

Конечно лучше самому! Вливайтесь...

"как хорошо уметь курить - не надо бабушку просить"

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

....

Не надо звать,

Не надо ждать,

А можно взять

И написать!