Вопросы по библиотеке GyverButton

bort707

★★★★★★✩
21 Сен 2020
3,060
912
Мне не простое мигание нужно было, а затухание с обратным эффектом в цикле,
с точки зрения программирования это тоже самое, как простое мигание. Пример показывает, как это сделать без задержки
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
573
Вы не поняли смысла первого кода и библиотеки. Мне не простое мигание нужно было, а затухание с обратным эффектом в цикле, то есть Fade Out -> Fade In -> Fade Out -> ... (и так в цикле пока работает любой режим кроме режима 0).
Целый урок этому посвящен https://alexgyver.ru/lessons/arduino-led/
 

veniamin

✩✩✩✩✩✩✩
15 Фев 2020
27
0
Всем привет при использовании библиотеки GyverButton заметил одну проблему: при включении платы (arduino Nano) все кнопки которые объявлены GButton butt1(pin); один раз нажимаются! хоть я на кнопку и не нажимал, кнопка считается нажатой. Выяснил что кнопка считается нажатой только при проверке нажатия через butt1.isPress(); при использовании butt1.isClick(); такого не наблюдается. что делать? конечно я прописал в скетче чтобы кнопка выполняла условие только со второго нажатия, но приходится использовать глобальные переменные, а место в памяти для глобальных переменных уже кончается. Я проверил эту ошибку на примерах с библиотеки и там эта ошибка тоже возникает.

вот скетч:

Код:
// Пример использования библиотеки GyverButton на нажатие
#define BTN_PIN 5   // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND)
#include "GyverButton.h"
GButton butt1(BTN_PIN);
void setup() {
  Serial.begin(9600);
}
void loop() {
  butt1.tick();  // обязательная функция отработки. Должна постоянно опрашиваться
  if (butt1.isPress()) Serial.println("Single");     // проверка на один клик
}
 

ixycu

✩✩✩✩✩✩✩
24 Окт 2020
1
0
Подпаяй кнопку к ардуинке. Дребезг контактов
 

Neo110001

✩✩✩✩✩✩✩
14 Окт 2020
16
4
попробуй pinMODE(5, INPUT_PULLUP ); это объявление режима работы пина. Он используется, как вход с подтяжкой. Да, я знаю, что криво и плохо объясняю
 

veniamin

✩✩✩✩✩✩✩
15 Фев 2020
27
0
пробовал с антидребезгом, с объявлением режима работы пина pinMode (5, INPUT_PULLUP). Все равно "нажимается", с самой кнопкой это не связано, поскольку если прописать в коде: if (digitalRead (5) == HIGH) Serial.println ("кнопка нажата"); То условие не будет выполнено! поясняю: действие ниже проверяет была ли нажата кнопка обходя библиотеку, если кнопка нажата то вывести в монитор порта "кнопка нажата" если кнопка не нажата то ничего не делать, но при подключении питания в монитор порта приходит только сообщение "Single", сообщение что "кнопка нажата" не приходит. Это значит что при подключении питания сама библиотека думает что один раз кнопка нажата, типо того как написать в void setup() { Serial.println ("Single"); }
 

veniamin

✩✩✩✩✩✩✩
15 Фев 2020
27
0
Это нажата? А как она подключена?
Роль кнопки у меня играет радио модуль, при нажатии на кнопку пульта, приемник выдает на выходе "грязный" сигнал высокого порядка HIGH (при одном нажатии выдает сразу несколько). Пин к которому подключен радио модуль "подтянут" резистором (PULL_DOWN). и поскольку выходной сигнал не чистый, я воспользовался данной библиотекой, как оказалось функция butt1.isPress каким то образом сглаживает все эти помехи и выдает чистый единичный HIGH при единичном нажатии на кнопку пульта. Но все бы ничего если бы он не выдавал ложное нажатие при включении ардуино.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@veniamin, будет проще перевернуть сигнал с радиомодуля, чтобы активной стал не HIGH, а LOW. Тогда и рихтовать ничего не придётся. Например так:
Invertor.JPG
А впрочем, хотите секса с переделкой скетча - так дело Ваше. 😁
 

bort707

★★★★★★✩
21 Сен 2020
3,060
912
@veniamin, стандартно библиотека работает с кнопками, подтянутыми к VCC и замыкающимися на GND. Однако библиотека может работать и с обратными подключением, все что для эттого нужно сделать - описать кнопку вот так:
C++:
GButton btn(pin, LOW_PULL);
Полезно читать мануалы иногда, а не просто копипастить
 

veniamin

✩✩✩✩✩✩✩
15 Фев 2020
27
0
Александр Симонов воспользовался данными настройками и получилось что при использовании (LOW_PULL) каким то образом дальность приема сигнала радио модуля снизилась, понять и не имею как это связано. PiratFox, сейчас попробую перевернуть сигнал с радио модуля.
настройки:
Код:
  // HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC (BTN_PIN --- КНОПКА --- GND)
  // LOW_PULL  - кнопка подключена к VCC, пин подтянут к GND
  // по умолчанию стоит HIGH_PULL
  butt1.setType(LOW_PULL);
 
// NORM_OPEN - нормально-разомкнутая кнопка
// NORM_CLOSE - нормально-замкнутая кнопка
// по умолчанию стоит NORM_OPEN
butt1.setDirection(NORM_OPEN);
 

bort707

★★★★★★✩
21 Сен 2020
3,060
912
воспользовался данными настройками и получилось что при использовании (LOW_PULL) каким то образом дальность приема сигнала радио модуля снизилась
фиг с ней с дальностью, дефект-то (включение кнопки про рестарте) - остался или пропал?
 

veniamin

✩✩✩✩✩✩✩
15 Фев 2020
27
0
фиг с ней с дальностью, дефект-то (включение кнопки про рестарте) - остался или пропал?
Да дефект ушел, но теперь мне бы хотелось узнать каким образом дальность приема сигнала уменьшилась (дальность приема где то 5 см), и как это исправить, думаю дело в силе сигнала, чем ближе пульт к приемнику, тем сильнее сигнал и ардуино воспринимает этот сильный сигнал как HIGH, если же пульт дальше то сигнал слабее и ардуино его воспринимает как LOW. Но это всего лишь мои догадки.
 

bort707

★★★★★★✩
21 Сен 2020
3,060
912
чем ближе пульт к приемнику, тем сильнее сигнал и ардуино воспринимает этот сильный сигнал как HIGH, если же пульт дальше то сигнал слабее и ардуино его воспринимает как LOW.
это фантастика :)
С такими, простите, знаниями :)... проверяйте каждый пин и каждый провод и сверяйте со схемой подключения.
У вас подтяжка пина на GND как сделана? внешним резистором ? или в приемнике уже есть ?
А может вы вообще про нее забыли?
 
Изменено:

veniamin

✩✩✩✩✩✩✩
15 Фев 2020
27
0
подтяжка сделана внешним резистором на 10 Ком (GND - D5), без резистора дальность была на много дальше.
У вас подтяжка пина на GND как сделана? внешним резистором ? или в приемнике уже есть ?
А может вы вообще про нее забыли?
 
Изменено:

eXPert

✩✩✩✩✩✩✩
14 Авг 2018
22
0
Мне удалось со всем разобраться кроме самого контроллера WAVGAT AVGA328P (он же LGT8F328P), подскажите какие выводы у него поддерживают ШИМ? На основе WAVGAT Arduino Pro Mini естственно, а то я их много заказал, а вот те пины которые у обычной Arduino Pro Mini с ATMega328P поддерживали ШИМ не совсем сходятся с пинами ШИМ WAVGAT Arduino Pro Mini. Сюда просьба не посылать, тут не указано именно про ШИМ-порты. Либо я не понял принципа работы ШИМ у AVGA328P, потому как ШИМ на пине D11 работает, а вот на D3 и D10 нет (согласно моему скетчу конечно), в то время как тот же скетч отлично работает с ШИМ на Arduino UNO c ATMega328P...

C++:
#include <LEDFader.h>
#include <GyverButton.h>

int mode, brightness = 255, brigh_tick, cycle, fadeAmount = 5;
unsigned long currentTime, loopTime;
boolean brightDirection = true, wasStep = false;

int MainLPin = 3; //PWM = D3 = Main-Light (Yellow Wire)
int MiniLPin = 10; //PWM = D10 = 2 Mini-Light (Green Wire)
int SoftLPin = 12; //NoPWM = D12 = Soft-Light (White Wire)
int BackLPin = 11; //PWM = D11 = Back-Light (Blue Wire)
int BtnPin = A0; //BTN = A0 Main Button (Black Wires)

GButton butt1(BtnPin);
LEDFader led = LEDFader(BackLPin);

/*
Modes:
=One Btn Click change mode
=Holding Btn - Brightness +/-
=Double Click - All Off in 1-5 Modes
0 - All off
1 - Main Light On
2 - Soft Light On
3 - 2 Mini-lights On
4 - Main Light & Soft Light On
5 - 2 Mini-lights & Soft Light On
*/

void setup() {
led.fade(255, 2500);
mode = 0;
cycle = 0;
brigh_tick = 0; // if bright_tick = 0 then brightness go low, if bright_tick = 1 then brightness go high
currentTime = millis();
loopTime = currentTime;
pinMode(MainLPin,OUTPUT);
pinMode(MiniLPin,OUTPUT);
pinMode(SoftLPin,OUTPUT);
pinMode(BackLPin,OUTPUT);
butt1.setDebounce(90);
butt1.setTimeout(300);
butt1.setType(HIGH_PULL);
butt1.setDirection(NORM_OPEN);
butt1.setTickMode(AUTO);
butt1.setStepTimeout(30);
digitalWrite(MainLPin, LOW);
digitalWrite(MiniLPin, LOW);
digitalWrite(SoftLPin, LOW);
digitalWrite(BackLPin, LOW);
}

void loop() {
if (mode == 0){ //Mode:0 ALL OFF
 digitalWrite(MainLPin, LOW);
 digitalWrite(MiniLPin, LOW);
 digitalWrite(SoftLPin, LOW);
 digitalWrite(BackLPin, LOW);
 if (butt1.isSingle()) mode++;
}

if (mode > 0){ //Turn On Back Light Fading mode for all modes except 0
  led.update();
  if (led.is_fading() == false) {
    // Fade from 255 - 0
    if (led.get_value() == 255) {
      led.fade(0, 3000);
    }
    // Fade from 0 - 255
    else {
      led.fade(255, 3000);
    }
  }
}

if (mode == 1){ //Turn On Main Light
 digitalWrite(MiniLPin, LOW);
 digitalWrite(SoftLPin, LOW);
 if (cycle == 1) brightness = 255;

if (butt1.isSingle()) mode++;
if (butt1.isDouble()){
  mode = 0;
  brigh_tick = 0;
  brightness = 255;
}

if (butt1.isStep()) {
  wasStep = true;
      if (brightDirection) {
        brightness -= 5;
      } else {
        brightness += 5;
      }
      brightness = constrain(brightness, 3, 255);
}

  if (butt1.isRelease()) {
    if (wasStep) {
      wasStep = false;
      brightDirection = !brightDirection;
    }
  }

analogWrite(MainLPin, brightness);
}

if (mode == 2){ //Turn On Soft Light
 digitalWrite(MainLPin, LOW);
 digitalWrite(MiniLPin, LOW);
 digitalWrite(SoftLPin, HIGH);
 cycle = 1;
if (butt1.isSingle()) mode++;
if (butt1.isDouble()){
  mode = 0;
  brigh_tick = 0;
  brightness = 255;
}
}

if (mode == 3){ //Turn On 2 Mini-Lights
 digitalWrite(MainLPin, LOW);
 digitalWrite(SoftLPin, LOW);
 if (cycle == 1) brightness = 255;

if (butt1.isSingle()) mode++;
if (butt1.isDouble()){
  mode = 0;
  brigh_tick = 0;
  brightness = 255;
}

if (butt1.isStep()) {
  wasStep = true;
      if (brightDirection) {
        brightness -= 5;
      } else {
        brightness += 5;
      }
      brightness = constrain(brightness, 3, 255);
}

  if (butt1.isRelease()) {
    if (wasStep) {
      wasStep = false;
      brightDirection = !brightDirection;
    }
  }

analogWrite(MiniLPin, brightness);
}

if (mode == 4){ //Turn On Main Light & Soft Light
 digitalWrite(MainLPin, HIGH);
 digitalWrite(MiniLPin, LOW);
 digitalWrite(SoftLPin, HIGH);
if (butt1.isSingle()) mode++;
if (butt1.isDouble()){
  mode = 0;
  brigh_tick = 0;
  brightness = 255;
}
}

if (mode == 5){ //Turn On 2 Mini-lights & Soft Light On
 digitalWrite(MainLPin, LOW);
 digitalWrite(MiniLPin, HIGH);
 digitalWrite(SoftLPin, HIGH);
if (butt1.isSingle()) mode++;
  if (mode == 6){
    mode = 0;
    cycle = 1;
  }
if (butt1.isDouble()){
  mode = 0;
  brigh_tick = 0;
  brightness = 255;
} 
}

}
 

vivatgm

✩✩✩✩✩✩✩
26 Янв 2021
23
0
здравствуйте. столкнулся с такой проблемой. находясь в функции внутри вечного цикла где прописаны действия для кнопок, так же срабатывает и те действия для кнопок что и прописаны в loop. то есть: в loop происходит опрос датчиков кнопок и отображается информация на дисплей. если задержать кнопку ок то мы переходим в меню, и зайдя в подменю , к примеру настройка времени, где прописаны действия кнопок в соответствии с этим разделом меню так же срабатывает и действия прописанные в loop (при зажатии кнопки вниз уменьшается значение переменной в настройки времени и включается инвертор). как не наследовать действия кнопок из loop() находясь в void setVremya (void)подскажите пожалуйста
C++:
#include <GyverButton.h>      // библиотека кнопок
GButton up(4, LOW_PULL);     // Кнопки
GButton down(5, LOW_PULL);
GButton ok(3, LOW_PULL);
bool n=1;                       // флаг инвертора
void setup() {
    ok.setTickMode(AUTO);           //
  up.setTickMode(AUTO);           // кнопки опрашиваются автоматически
  down.setTickMode(AUTO);
}
void loop() {
  if (ok.isHolded()) {        //вход в меню при удержании кнопки ок
    menu();
  }
  if (up.isClick() || down.isClick()) {
    disp = !disp;
    oled.clear();
  }
   if (down.isHolded()) {        //вкл/выкл инвертора удержанием кнопки
    n=!n;
    digitalWrite(Check220, n);
  }
  ammetr();

  printTime();                //вывод инфы на дисплей
  provBudil();                //проверка исполнения таймеров
  saveAccum();                //проверка сохранения жизни аккумулятора панели и переключение при низком заряде на сеть 220В
  peredacha ();               //отправка данных на esp

}
void printTime() {                                      // вывод главное экрана с временем и значениями
  switch (disp) {
    case 0: {
        if (millis() - bmeup >= 2000) {

          bme.oneMeasurement();                               // Просим датчик проснуться и сделать одно преобразование
          while (bme.isMeasuring());
          temp = bme.readTemperature();
          Humidity = int(bme.readHumidity());
          davlen = int(pressureToMmHg((bme.readPressure())));
          bmeup = millis();
          }
        DateTime now = rtc.getTime();
        bool ftimer[3]; EEPROM.get(12, ftimer);
        oled.home();
        oled.setScale(2);
        if (now.hour < 10) oled.print(F("0"));
        oled.print(now.hour);
        oled.print(F(":"));
        if (now.minute < 10) oled.print(F("0"));
        oled.print(now.minute);
        oled.print(F(":"));
        if (now.second < 10) oled.print(F("0"));
        oled.print(now.second);
        printFromPGM(&week[now.day - 1]);
        oled.println();
        oled.setScale(1);
        oled.print(F(" "));
        oled.print(now.date);
        oled.print(F(" "));
        printFromPGM(&mesyac[now.month - 1]); //oled.print(now.month);
        oled.print(F(" "));
        oled.print(now.year);
        oled.println(F("г."));
        oled.setCursor(0, 4);
        oled.print(F("Темп = "));
        oled.print(temp,1);
        oled.print(F("*C"));
        oled.println(F("                               "));
        oled.print(F("Влажность = "));
        oled.print(Humidity);
        oled.print(F("%"));
        oled.println(F("                               "));
        oled.print(F("Давлен = "));
        oled.print(davlen);
        oled.print(F("mmHg"));
        oled.println(F("                               "));
        if (contr) oled.print(F("hold menu for exit"));
        else oled.print(F("сменить вид нажми +-"));
        oled.setCursor(0, 3);
        if (contr) {
          oled.print(F("Яркость: "));
          oled.invertText(true);
          oled.print(cont / 10);
          oled.invertText(false);
          if (cont/10>=10) oled.print(F(" "));
          else oled.print(F("  "));
        }
        else oled.print(F("            "));
        if(faccum) {
          oled.invertText(true); oled.print(F(" ! ")); oled.invertText(false);
          }
          else oled.print(F("   "));
       if(!n) {
          oled.setCursor(85, 3); oled.invertText(true); oled.print(F(" Ин ")); oled.invertText(false);
          }
           else oled.print(F("   "));
        for (byte i = 0; i < 3; i++) {
          if (flagTimer[i]) {
            oled.invertText(true); oled.print(F(" T ")); oled.invertText(false);
          }
        }
        
        oled.update();
        break;}
    case 1: {
        oled.home();
        oled.setScale(1);
        oled.print(F("Напряжение: "));                             //напряжение сети
        oled.print(analogRead(Volt) * 0.01464, 1);
        oled.print(F("V"));
        oled.println(F("                               "));
        oled.print(F("потреб = "));
        if (Watt > 1000) {
          oled.print (Watt / 1000, 3);
          oled.print(F(" kВт"));
          oled.println(F("                               "));
        }
        else {
          oled.print (Watt, 2);
          oled.print(F(" Вт"));
          oled.println(F("                               "));
        }
        oled.print(F("сила тока= "));
        oled.print((analogRead(Amp) * 0.05922));
        oled.print(F(" А"));
        oled.println(F("                               "));
        oled.print(F("сменить вид нажми +-"));
        oled.update();
        break;
      }
  }

}

void printFromPGM(int charMap) {                                  //чтение данных из массивов progmem и вывод на экран
  char buffer[24];                                                // буфер для хранения строки
  uint16_t ptr = pgm_read_word(charMap);                          // получаем адрес из таблицы ссылок
  uint8_t i = 0;                                                  // переменная - индекс массива буфера
  do {
    buffer[i] = (char)(pgm_read_byte(ptr++));                     // прочитать символ из PGM в ячейку буфера, подвинуть указатель
  } while (buffer[i++] != NULL);                                  // повторять пока прочитанный символ не нулевой, подвинуть индекс буфера
  oled.print(buffer);
} // печатаем готовую строку

void menu() {                                                     //меню настроек устройства
  oled.clear(); 
  while (1) {                                                     //меню настроек при удержании кнопки ок
    static int8_t pointer = 0;                                    // Переменная указатель

    /* Кнопки */

    if (up.isClick() or up.isHold()) {                            // Если кнопку нажали или удерживают
      pointer = constrain(pointer - 1, 0, ITEMS - 1);             // Двигаем указатель в пределах дисплея
    }

    if (down.isClick() or down.isHold()) {
      pointer = constrain(pointer + 1, 0, ITEMS - 1);
    }

    if (ok.isClick()) {                                           // Нажатие на ОК - переход в пункт меню
      switch (pointer) {                                          // По номеру указателей располагаем вложенные функции (можно вложенные меню)
        case 0: Budilnic(); break;                                // По нажатию на ОК при наведении на 0й пункт вызвать функцию
        case 1: setVremya(); break;
        case 2: Yarkoct(); break;
      }
    }

    /* меню */
  //  oled.clear();           // Очищаем буфер
    oled.home();            // Курсор в левый верхний угол

    oled.println (F("  SET таймер 220В"));
    oled.println (F("  SET дата и время"));
    oled.println (F("  Яркость экрана"));

    printPointer(pointer);                                        // Вывод указателя
    oled.update();                                                // Выводим кадр на дисплей
    provBudil();                                                  //проверка исполнения таймеров
    saveAccum();                                                 //проверка сохранения жизни аккумулятора панели и переключение при низком заряде на сеть 220В
    peredacha ();
    ammetr();
    if (ok.isHolded()) return;
  }
}

void printPointer(uint8_t pointer) {                              //отображеие курсора в меню

  oled.setCursor(0, pointer);
  oled.print(">");

}

void setVremya (void) {                                           //раздел меню Set дата и время, установка текущей даты и времени
  oled.clear();
  DateTime now = rtc.getTime();
  int8_t sec = now.second; int8_t minu = now.minute; int8_t chas = now.hour; int8_t den = now.date; int8_t mes = now.month; int16_t god = now.year;
  int8_t fmesto = 0; bool save = 0;
  while (1) {
    provBudil();                                                  //проверка исполнения таймеров
    saveAccum();                                                  //проверка сохранения жизни аккумулятора панели и переключение при низком заряде на сеть 220В
    peredacha ();
    ammetr();
    if (ok.isHolded()) {                                          //при удержании кнопки ок выход с сохранением если настройка времени в сохраняется или без сохранения
      if (save) {
        rtc.setTime(sec, minu, chas, den, mes, god);
        oled.clear();
        return;
      } else {
        oled.clear();
        return;
      }
    }
    if (ok.isClick()) {                                           // при клике ок меняется что будет изменяться
      fmesto++;
    }
    if (fmesto >= 6) {                                            //при клике ок на последнем настраиваемом пункте возвращается на первый
      fmesto = 0;
    }
    if (up.isClick() or up.isHold()) {                            // клик или удержание кнопки вверх увеличивает значение с проверкой предотвращающей неправильные значения
      switch (fmesto) {
        case 0: {
            chas++;
            if (chas >= 24) {
              chas = 0;
            };
            break;
          }
        case 1: {
            minu++;
            if (minu >= 60) {
              minu = 0;
            };
            break;
          }
        case 2: {
            den++;
            if (den >= provdate(mes, god) + 1) {
              den = 1;
            };
            break;
          }
        case 3: {
            mes++;
            if (mes >= 13) {
              mes = 1;
            };
            break;
          }
        case 4: {
            god++;
            if (god >= 2101) {
              god = 2020;
            };
            break;
          }
        case 5: {
            save = !save;
            break;
          }
      }
    }
    if (down.isClick() or down.isHold()) {                        // клик или удержание кнопки вниз уменьшает значение значение с проверкой предотвращающей неправильные значения
      switch (fmesto) {
        case 0: {
            if (chas == 0) {
              chas = 23;
            } else {
              chas--;
            } break;
          }
        case 1: {
            if (minu == 0) {
              minu = 59;
            } else {
              minu--;
            } break;
          }
        case 2: {
            if (den == 1) {
              den = provdate(mes, god);
            } else {
              den--;
            } break;
          }
        case 3: {
            if (mes == 1) {
              mes = 12;
            } else {
              mes--;
            } break;
          }
           case 4: {
            god--;
            if (god <= 2020) {
              god = 2101;
            };
            break;
          }
        case 5: {
            save = !save;
            break;
          }
      }
    }
  //  oled.clear();                                                 // далее до конца функции код вывода инфы на дисплей
    oled.home();
    oled.println(F(" установка времени"));
    oled.setCursor (7, 2);
    if (fmesto == 0) oled.invertText(true);
    if (chas < 10) oled.print(F("0"));
    oled.print(chas);
    oled.invertText(false);
    oled.print(F(":"));
    if (fmesto == 1) oled.invertText(true);
    if (minu < 10) oled.print(F("0"));
    oled.print(minu);
    oled.invertText(false);
    oled.print(F(":"));
    if (sec < 10)oled.print(F("0"));
    oled.print(sec);
    oled.setCursor (2, 4);
    if (fmesto == 2) oled.invertText(true);
    oled.print(den);
    oled.invertText(false);
    oled.print(F(" "));
    if (fmesto == 3) oled.invertText(true);
    printFromPGM(&mesyac[mes - 1]);
    oled.invertText(false);
    oled.print(F(" "));
    if (fmesto == 4) oled.invertText(true);
    oled.print(god);
    oled.invertText(false);
    oled.print(F("г."));
    if (fmesto == 5) oled.invertText(true);
    if (save) {
      oled.setCursor(5, 6);
      oled.print(F("Сохранить"));
    } else {
      oled.setCursor(4, 6);
      oled.print(F("не сохранять"));
    }
    oled.invertText(false);
    oled.update();
  }
}
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
465
134
@vivatgm,
Не понял ваш вопрос (довольно путано написано).
На первый взгляд:
Вы входите из loop в меню if (ok.isHolded()) { //вход в меню при удержании кнопки ок
И потом в первом же цикле while выходите из меню назад в loop if (ok.isHolded()) return;
 

vivatgm

✩✩✩✩✩✩✩
26 Янв 2021
23
0
@Bruzzer, вот такая каша в голове). попробую еще раз. в луп стоит проверка нажатия кнопок. если сработано удержание "ок" то входит в меню (в коде вызывается функция menu()). в меню выбирается подменю, ну допустим, настройка времени (в коде из функции menu() вызывается функция настройки времени (setVremy())). в функции настройка времени зациклено вечным циклом и выход из нее через return, ну и в этом цикле организован свой опрос нажатия кнопок и их действия (если в лупе при опросе кнопок выявлялось удержание кнопки down то включался инвертор, а в функции настройка времени удержанию down присваивается уменьшение выделенного значения). если в функции setVremy() я удерживаю down, то уменьшается значение переменноей, как это и прописано в опросах кнопки в функции setVremy(), и включается инвертор, как это прописано в loop(), хотя я туда не попадаю, так как нахожусь в вечном цикле функции
 

vivatgm

✩✩✩✩✩✩✩
26 Янв 2021
23
0
@Bruzzer, ok.isHolded() в loop() это вход в меню. далее в хождениях по меню ok.isHolded() это выход в предыдущее меню. (пример: находясь в setVremyа() при ok.isHolded() сохраняются все введенные изменения и возвращается в меню, при удержании в меню возdращается на главный экран(loop())
при зажатии "down" находясь в меню -> настройки времени обрабатывается down.isHolded() строки 263 и строки 19, то есть включается инвертор и уменьшается значение переменной, а должно только уменьшаться значение переменной
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
465
134
@vivatgm,
Новая версия .Не знаю, может в вашей версии библиотеки по другому, в той что я смотрел, если признак isHolded установился, то он будет сброшен только его проверкой isHolded(). Поэтому если было длинное нажатие down в листании меню, то как только вы вернетесь в loop и проверите down.isHolded() в 19, то это будет истина и инвертор включится. В строке 263 вы используете другую функцию down.isHold() и она не сбрасывает флаг длинного нажатия.

@vivatgm,
В строке 142 желательно добавить проверку на выход за границы буфера.
 
  • Лойс +1
Реакции: vivatgm

vivatgm

✩✩✩✩✩✩✩
26 Янв 2021
23
0
@Bruzzer,я Вас правильно понял, для лечения проблемы в 263 строке down.isHold() заменить на down.isHolded() ?