При удержании кнопки параметр значение увеличивает(уменьшают) шаг константы

anjik
Offline
Зарегистрирован: 26.02.2020

Всем доброго время суток......... Есть такая задача: при удержании кнопки для задания значения изменяются с заданным шагом. В моем случаи это "мм", это все работает нормально. Только когда надо задать 1000мм, 5000мм или 10000мм это превращается в очень долгий процесс. Вопрос: как реализовать увеличение скорости изменения задаваемого значения или константы при удержании кнопки? Вот пример который я допиливаю под себя. 

Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему), 
 

Актуальна любая помощь..........

-NMi-
Offline
Зарегистрирован: 20.08.2018

Скачай гайверобатонную библу. Там есть несколько типов событий, типа OneClick, DoubleClick и так далее, кароче как в ООП. Потом в коде по событию удержания баттона инкременть на нужную цифру. Ничо сложного нет.

Ну или "подсмотри" укогонить )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

если бы валкодер, то там от скорости вращения, чем быстрее крутим тем быстрее идёт приращение, а у кнопки скорости нет, тогда двойные м тройные нажатия делают шаг к примеру 10, 100 одиночное возвращает к 1

vk007
Offline
Зарегистрирован: 16.06.2015

Можно и без библиотеки. Засекать время (миллис), когда нажали кнопку и, если прошло допустим 5 сек, изменять нужную величину уже не на 1, а на 10, 100, 1000...

Еще можно использовать такой вариант: сначала при нажатии на кнопку величина изменяется по 1, если набежал десяток (и кнопка при этом не отпускалась), то дальше уже делаем прирост/уменьшение на 10, нащелкали сотню (10 раз по 10) - дальше меняем по сотне и т.д.

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

anjik
Offline
Зарегистрирован: 26.02.2020

чтоб посмотреть-нужно правильно спросить что надо........спрашиваю здесь потому-что не нашел. За библеотеку спасибо

anjik
Offline
Зарегистрирован: 26.02.2020

ua6em пишет:

если бы валкодер, то там от скорости вращения, чем быстрее крутим тем быстрее идёт приращение, а у кнопки скорости нет, тогда двойные м тройные нажатия делают шаг к примеру 10, 100 одиночное возвращает к 1

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

anjik
Offline
Зарегистрирован: 26.02.2020

vk007 пишет:

Можно и без библиотеки. Засекать время (миллис), когда нажали кнопку и, если прошло допустим 5 сек, изменять нужную величину уже не на 1, а на 10, 100, 1000...

Еще можно использовать такой вариант: сначала при нажатии на кнопку величина изменяется по 1, если набежал десяток (и кнопка при этом не отпускалась), то дальше уже делаем прирост/уменьшение на 10, нащелкали сотню (10 раз по 10) - дальше меняем по сотне и т.д.

А можно пример? Или ссылку на проект где это реализовано....... Вот это я искал, но не нашел...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

... "ну какая такая любовь"... )))
 

if(millis() - press_button_miillis >=5000 && flag_button){
step+=10;
press_button_miillis = millis();
}

 

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

Может кнопок добавить?

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

mykaida пишет:

Может кнопок добавить?

или денег....

anjik
Offline
Зарегистрирован: 26.02.2020

b707 пишет:

mykaida пишет:

Может кнопок добавить?

или денег....


Я почему то ждал такой ответ, чувствуется новое поколение. Вот только Вы сами вспомните сколько отдали денег тому человеку который просто подсказал, поправил, научил. Делай добро и оно к тебе вернётся. Спасибо за подсказки всем кто ответил....

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

anjik пишет:

Я почему то ждал такой ответ, чувствуется новое поколение..

а сколько вам лет, молодой человек? :) я "новым поколением" был лет этак тридцать назад :)

"Новое поколение" тут не при чем. Либо ты учишься сам, либо платишь деньги. Задавать бесконечные вопросы на форумах - бессмысленно - ничему не научишься.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

anjik пишет:
b707 пишет:

mykaida пишет:

Может кнопок добавить?

или денег....

Я почему то ждал такой ответ, чувствуется новое поколение. Вот только Вы сами вспомните сколько отдали денег тому человеку который просто подсказал, поправил, научил. Делай добро и оно к тебе вернётся. Спасибо за подсказки всем кто ответил....

так подсказал, разжевал и, в рот положил, опять
"за мутными глазницами авто
я в непорочности своей, как рак-отшельник
и всё не то и все вокруг не те и,
каждый день как будто понедельник"
(С) Iren P. Unknown

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

в сообщении #3 расписан алгоритм - бери и кодируй

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

del

 

anjik
Offline
Зарегистрирован: 26.02.2020

b707 пишет:

 

а сколько вам лет, молодой человек? 

Я рожден в СССР и Брежнева помню......

прошу не пинать сильно, учу матчасть поэтому спрашиваю.

anjik
Offline
Зарегистрирован: 26.02.2020
//------------------------------- librarys ----------------------------------
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

//------------------------------- lcd ----------------------------------
LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей

//------------------------------- stepper ----------------------------------
#define stepPin 7
#define dirPin 8

//------------------------------- servo ----------------------------------
Servo snippers;
#define servo 10
#define openAngle 180
#define closedAngle 0

//------------------------------- input ----------------------------------

#define leftButton 14
#define rightButton 9
#define upButton 15
#define downButton 6

//------------------------------- user settings ----------------------------------
unsigned int wireLength = 0;
unsigned int wireQuantity = 0;

//------------------------------- system settings ----------------------------------
int state = 0;
int incrementSpeed = 1;
int previousWireLength = 0;
int previousWireQuantity = 0;
float mmPerStep = 0.18096;


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


  lcd.init();
  lcd.backlight();// Включаем подсветку дисплея


  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(leftButton, INPUT_PULLUP);
  pinMode(rightButton, INPUT_PULLUP);

  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);

  snippers.attach(servo);

  snippers.write(openAngle);

  delay(1000);
}

void loop() {
  if (!digitalRead(rightButton)) {
    if (state == 5) {
      state = 0;
    }
    else {
      state += 1;
    }
    delay(200);
    lcd.clear();
  }
  if (!digitalRead(leftButton) && state > 0 && state < 4) {
    state -= 1;
    delay(200);
    lcd.clear();
  }


  switch (state) {
    case 0:
      homeScreen();
      break;
    case 1:
      chooseWireLength();
      break;
    case 2:
      chooseWireQuantity();
      break;
    case 3:
      confirm();
      break;
    case 4:
      currentlyCutting();
      break;
    case 5:
      finishedCutting();
      break;
  }

}


void homeScreen() {
  lcd.setCursor(0, 0);
  lcd.print("ZUBASTIK PIP");
  lcd.setCursor(9, 1);
  lcd.print("VPERED>");
  delay(100);
}


void chooseWireLength() {
  wireLength = changeValue(wireLength);

  //clear LCD if required
  if (previousWireLength != wireLength) {
    lcd.clear();
    previousWireLength = wireLength;
  }

  //Display information on LCD
  lcd.setCursor(0, 0);
  lcd.print("DLINA:" + (String)wireLength + "mm");
  displayNavigation();
}

void chooseWireQuantity() {
  wireQuantity = changeValue(wireQuantity);

  //clear LCD if required
  if (previousWireQuantity != wireQuantity) {
    lcd.clear();
    previousWireQuantity = wireQuantity;
  }

  //Display information on LCD
  lcd.setCursor(0, 0);
  lcd.print("KOL-VO:" + (String)wireQuantity);
  displayNavigation();
}

void confirm() {
  lcd.setCursor(0, 0);
  lcd.print((String)wireLength + "mm x " + (String)wireQuantity + "pcs");
  lcd.setCursor(0, 1);
  lcd.print("<BACK");
  lcd.setCursor(10, 1);
  lcd.print("START>");
  delay(100);
}

void currentlyCutting() {
  lcd.setCursor(0, 0);
  lcd.print((String)0 + "/" + (String)wireQuantity);
  lcd.setCursor(0, 1);
  lcd.print("???s");
  int stepsToTake = (int)wireLength / mmPerStep;
  for (int i = 0; i < wireQuantity; i++) {
    unsigned long timeForOneCycle = millis();
    digitalWrite(dirPin, HIGH);
    for (int x = 0; x < stepsToTake; x++) {
      digitalWrite(stepPin, HIGH);
      delayMicroseconds(500);
      digitalWrite(stepPin, LOW);
      delayMicroseconds(500);
    }

    lcd.setCursor(0, 0);
    lcd.print((String)(i + 1) + "/" + (String)wireQuantity);

    snippers.write(closedAngle);
    delay(600);
    snippers.write(openAngle);
    delay(600);


    lcd.setCursor(0, 1);

    unsigned long timeRemaining = ((millis() - timeForOneCycle) * (wireQuantity - (i + 1))) / 1000;
    lcd.print((String)timeRemaining + "s    ");

  }
  wireLength = 0;
  wireQuantity = 0;
  state = 5;
}

void finishedCutting() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("VSE POREZAL");
  lcd.setCursor(11, 1);
  lcd.print("NEXT>");
  delay(100);
}


int changeValue(int currentValue) {
  if (!digitalRead(upButton)) {
    delay(100);
    currentValue += incrementSpeed;

  }
  if (!digitalRead(downButton)) {
    if (currentValue - incrementSpeed >= 0) {
      delay(100);
      currentValue -= incrementSpeed;

    }
    else {
      currentValue = 0;
    }
  }
  if (!digitalRead(downButton) && !digitalRead(upButton)) {
    incrementSpeed = 1;
  }
  return currentValue;
}

void displayNavigation() {
  lcd.setCursor(0, 1);
  lcd.print("<BACK");
  lcd.setCursor(11, 1);
  lcd.print("NEXT>");
  delay(100);
}

Вот скетч который я допиливаю под себя

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

anjik пишет:

Вот скетч который я допиливаю под себя

Ну вот! Добавить комментарии, понять, а чего как работает, убрать строку #3 (а нахера она Вам нужна?) И нормальная программа.

Ну умеете-же копирастить!