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

Старик Похабыч

★★★★★★★
14 Авг 2019
4,189
1,280
Москва
библиотека читает millis() , это не то. что использовать таймер. Обычно несовместимость идет кода используют аппаратные прерывания таймера, у кнопке такого нет.
Но раз ты все знаешь, то зачем задаешь вопросы ? возьми да попробуй
 
  • Лойс +1
Реакции: AndrySmart

StoneTL

✩✩✩✩✩✩✩
21 Фев 2020
2
0
Столкнулся с такой же прблемой. Из кода "создателя темы"

if(butt1.isPress() && day_flag == 0){
day_flag = 1;
}

if(butt1.isPress() && day_flag == 1){
day_flag = 2;
}

ПЕРВОЕ СРАБОТАЕТ
ВТОРОЕ НЕТ. Хотя казалось бы должно.

Даже не смотря на то что флаг закроет первое условие и открыто будет только второе в единственном виде. Оно почему то работать не будет. Только если менять тип не Press а Click например


Есть решение данной проблемы?
 

Roman-RV

★✩✩✩✩✩✩
21 Июн 2019
51
13
45
Столкнулся с такой же прблемой. Из кода "создателя темы"
Есть решение данной проблемы?
Можно так
C++:
if( day_flag == 0 && butt1.isPress()){
day_flag = 1;
}
if( day_flag == 1 && butt1.isPress()){
day_flag = 2;
}
или так лучше
C++:
if(  butt1.isPress()){
  if(day_flag == 0){
  day_flag = 1;
  }else if(day_flag == 1){
   day_flag = 2;
 }
}
 
Изменено:
  • Лойс +1
Реакции: StoneTL

Kir

★✩✩✩✩✩✩
28 Мар 2020
69
16
Столкнулся с такой же прблемой. Из кода "создателя темы"

if(butt1.isPress() && day_flag == 0){
day_flag = 1;
}

if(butt1.isPress() && day_flag == 1){
day_flag = 2;
}

ПЕРВОЕ СРАБОТАЕТ
ВТОРОЕ НЕТ. Хотя казалось бы должно.
Потому что метод isPress() сбрасывает внутренний флаг при первом вызове, и все последующие уже не сработают. Точно также работают и другие подобные методы типа isClick, isHold и т.д.
 
  • Лойс +1
Реакции: StoneTL

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
если ты хочеш сделать переключающееся меню при нажатии всего одной кнопки, то это делается не так
 
  • Лойс +1
Реакции: StoneTL

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
вот недавно делал тут

конкретно
C++:
    if (butt1.isHolded())
    {
        if (state == 2)
        {
            state = 0;
        }
        else
        {
            state++;
        }
        tone(BEEPER_PIN, 500, 100);
        set_mode();
    }
 

Вложения

  • Лойс +1
Реакции: StoneTL

Misha1tigr

✩✩✩✩✩✩✩
29 Янв 2020
4
0
Помогите пж. Мне нужно переделать GyverButton так, чтоб она читала не цифровой, а аналоговый сигнал(т.е. значение на пине таком-то больше Х - кнопка нажата). Понимаю что нужно копать в сторону 135 строки cрр файла, а именно if (!flags.mode) flags.btn_state = !digitalRead(_PIN) ^ (flags.inv_state ^ flags.type); Но как это реализовать не знаю. Буду очень признателен
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
C++:
    // Пример использования библиотеки GyverButton с аналоговой клавиатурой
    // аналоговая клавиатура подключена на А7
    // Схему смотри на странице библиотеки https://alexgyver.ru/gyverbutton/
    // также она есть в папке с примером
    #include "GyverButton.h"
    // создаём кнопки без привязки к пину
    GButton myButt1;
    GButton myButt2;
    GButton myButt3;
    void setup() {
      Serial.begin(9600);
      // меняем тип на LOW_PULL, потому что по умолчанию стоит HIGH_PULL
      myButt1.setType(LOW_PULL);
      myButt2.setType(LOW_PULL);
      myButt3.setType(LOW_PULL);
    }
    void loop() {
      // читаем значение
      int analog = analogRead(7);
      // для начала нужно вывести и запомнить значение для каждой кнопки
      //Serial.println(analog);
      // проверяем у каждой кнопки свой диапазон (+- 20 от полученного значения)
      myButt1.tick(analog < 860 && analog > 820);
      myButt2.tick(analog < 740 && analog > 700);
      myButt3.tick(analog < 650 && analog > 600);
      // проверка на удержание, например
      if (myButt1.isHolded()) {
        Serial.println("hold 1");
      }
      if (myButt2.isHolded()) {
        Serial.println("hold 2");
      }
      if (myButt3.isHolded()) {
        Serial.println("hold 3");
      }
      
      delay(10);  // задержка тут не нужна, чисто для вывода
    }
 

Misha1tigr

✩✩✩✩✩✩✩
29 Янв 2020
4
0
C++:
    // Пример использования библиотеки GyverButton с аналоговой клавиатурой
    // аналоговая клавиатура подключена на А7
    // Схему смотри на странице библиотеки https://alexgyver.ru/gyverbutton/
    // также она есть в папке с примером
    #include "GyverButton.h"
    // создаём кнопки без привязки к пину
    GButton myButt1;
    GButton myButt2;
    GButton myButt3;
    void setup() {
      Serial.begin(9600);
      // меняем тип на LOW_PULL, потому что по умолчанию стоит HIGH_PULL
      myButt1.setType(LOW_PULL);
      myButt2.setType(LOW_PULL);
      myButt3.setType(LOW_PULL);
    }
    void loop() {
      // читаем значение
      int analog = analogRead(7);
      // для начала нужно вывести и запомнить значение для каждой кнопки
      //Serial.println(analog);
      // проверяем у каждой кнопки свой диапазон (+- 20 от полученного значения)
      myButt1.tick(analog < 860 && analog > 820);
      myButt2.tick(analog < 740 && analog > 700);
      myButt3.tick(analog < 650 && analog > 600);
      // проверка на удержание, например
      if (myButt1.isHolded()) {
        Serial.println("hold 1");
      }
      if (myButt2.isHolded()) {
        Serial.println("hold 2");
      }
      if (myButt3.isHolded()) {
        Serial.println("hold 3");
      }
     
      delay(10);  // задержка тут не нужна, чисто для вывода
    }
Спасибо, то что надо
 

Misha1tigr

✩✩✩✩✩✩✩
29 Янв 2020
4
0

Старик Похабыч

★★★★★★★
14 Авг 2019
4,189
1,280
Москва
Давай сразу выкладывай что еще "забыл" ) А то стараешься , пишешь, а потом тебе "на"
Все остальные пины заняты ? Поменять местами нельзя А6 и А7 с другими какими ?
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
567
Столкнулся с такой же прблемой. Из кода "создателя темы"

if(butt1.isPress() && day_flag == 0){
day_flag = 1;
}

if(butt1.isPress() && day_flag == 1){
day_flag = 2;
}

ПЕРВОЕ СРАБОТАЕТ
ВТОРОЕ НЕТ. Хотя казалось бы должно.

Даже не смотря на то что флаг закроет первое условие и открыто будет только второе в единственном виде. Оно почему то работать не будет. Только если менять тип не Press а Click например


Есть решение данной проблемы?
Это не проблема, а "как запрограммировал - так и работает". Любая "is" - функция сбрасывает внутренний флаг при вызове, а если ты вызываешь её два раза подряд - естественно на второй опрос она уже вернёт false, потому что уже была вызвана выше. Чтобы работала такая конструкция, нужно либо делать общим условие isSingle и внутри него проверять x==0 x==1, или читать урок про условия, конкретно про порядок условий. Если написать (x == 0 and butt1.isSingle() ) то всё будет работать и с двойными условиями.
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
567
Подскажите не будет ли эта библиотека конфликтовать с библиотеками
FreqCount.h
Adafruit_SSD1306.h
PWM.h
?

а то они кажись используют таймер.
библиотека использует millis(), который сидит на таймере 0. Абсолютно все ардуино-библиотеки не трогают таймер 0, иначе это сломало бы всю совместимость и экосистему ардуино
 

eXPert

✩✩✩✩✩✩✩
14 Авг 2018
22
0
Решил переделать довольно хороший фонарик из китая на работу с Arduino, а с не известно каким родным контроллером похожим на Attiny13A (надписи на контроллере затёрты). Вроде сделал схему, собрал/спаял, проверил отдельно компоненты схемы на работоспособность, всё работает.
Но код для ардуинки работает как-то очень тормознуто, ну просто совсем, задержка срабатывания после нажатия на кнопку более 4х секунд, да не спорю, что код написан на сплошных костылях, но вот понять почему он так тормозит при смене режимов (mode в коде) я понять не могу. В большинстве случаев mode даже не хочет менятся с 1 на следующий режим. После нажатия на кнопку сразу включается BackLight (см. код), а уже через 3-5 секунд включается MainLight (mode = 1).
На C#-подобных языках ранее не писал, только на ObjectPascal, так что сильно тапками не закидывайте.

C++:
#include <GyverButton.h>

int mode, brightness, brigh_tick, cycle;
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)
/*
int MainLPin = 0; //PWM = P0 = Main-Light
int MiniLPin = 4; //PWM = P4 = 2 Mini-Light
int SoftLPin = 2; //NoPWM = P2 = Soft-Light
int BackLPin = 1; //PWM = P1 = Back-Light
int BtnPin = 3; //BTN = P3 Main Button
*/
GButton butt1(BtnPin);

/*

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() {
Serial.begin(9600);
mode = 0;
cycle = 0;
brightness = 255;
brigh_tick = 0; // if bright_tick = 0 then brightness go low, if bright_tick = 1 then brightness go high
pinMode(MainLPin,OUTPUT);
pinMode(MiniLPin,OUTPUT);
pinMode(SoftLPin,OUTPUT);
pinMode(BackLPin,OUTPUT);
//pinMode(BtnPin,INPUT);
butt1.setDebounce(90);
butt1.setTimeout(300);
butt1.setType(HIGH_PULL);
butt1.setDirection(NORM_OPEN);
butt1.setTickMode(AUTO);
digitalWrite(MainLPin, LOW);
digitalWrite(MiniLPin, LOW);
digitalWrite(SoftLPin, LOW);
digitalWrite(BackLPin, LOW);
}

void loop() {
Serial.println(analogRead(A0));
if (mode == 0){ //Mode:0 ALL OFF
Serial.println("Mode = 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
  Serial.println("BackLight is ON");
   for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
    analogWrite(BackLPin, fadeValue);
    delay(50);
  }
   for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
    analogWrite(BackLPin, fadeValue);
    delay(50);
  }
}

if (mode == 1){ //Turn On Main Light
Serial.println("Main Light is ON");
digitalWrite(MiniLPin, LOW);
digitalWrite(SoftLPin, LOW);
if (cycle == 1) brightness = 255;
brightness = constrain(brightness, 50, 255);

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

if (butt1.isHold()) { //Universal brightness function
  if (brigh_tick = 0){
    brightness = brightness - 10;
    brigh_tick = 1;
  } else {
    brightness = brightness + 10;
    brigh_tick = 0;
  }
}

analogWrite(MainLPin, brightness);
}

if (mode == 2){ //Turn On Soft Light
Serial.println("Soft Light is ON");
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
Serial.println("Mini Lights is ON");
digitalWrite(MainLPin, LOW);
digitalWrite(SoftLPin, LOW);
if (cycle == 1) brightness = 255;
brightness = constrain(brightness, 50, 255);

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

if (butt1.isHold()) { //Universal brightness function
  if (brigh_tick == 0){
    brightness = brightness - 10;
    brigh_tick = 1;
  } else {
    brightness = brightness + 10;
    brigh_tick = 0;
  }
}

analogWrite(MiniLPin, brightness);
}

if (mode == 4){ //Turn On Main Light & Soft Light
Serial.println("Main Light & Soft Light is ON");
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
Serial.println("Mini-lights & Soft Light is 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;
}
}

}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,189
1,280
Москва
50*255=12750 , это задержка в каждом цикле loop, 12 секунд на минуточку.. так чего ж хотеть то?

прдон, еще на 2 умножить надо. 25 секунд. Как кнопки работают с задержкой в 4 секунды непонятно.
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
50*255=12750 , это задержка в каждом цикле loop, 12 секунд на минуточку.. так чего ж хотеть то?

прдон, еще на 2 умножить надо. 25 секунд. Как кнопки работают с задержкой в 4 секунды непонятно.
Шаг цикла 5. Так что 50 мс * 51шаг * 2 цикла = ~5 сек задержки
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,189
1,280
Москва

eXPert

✩✩✩✩✩✩✩
14 Авг 2018
22
0
Поразбиравшись около 4х часов и почитав разные форумы/статьи/уроки я уже и так понял в чём ошибка. Код исправил убрав delay'и и заменив на библиотеку LEDFader. Тесты проводил на Arduino Uno (точнее RobotDyn Uno) c МК ATMega328P, всё работало нормально и без задержек. А заливать сам код собирался в другую "ардуинку", но вот оказалось, что не все функции кода работают на контроллере WAVGAT AVGA328P (WAVGAT Arduino Pro Mini). А именно не работает часть кода отвечающая за регулировку яркости (строки 86-101 и 129-144).

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

int mode, brightness = 255, 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;
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;
  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;
  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;
  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;
  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;
  brightness = 255;
}
}

}
 

kostyamat

★★★★★★✩
29 Окт 2019
1,097
630
Госпадя, да зачем вам целая библиотека?
Поищите, и вразумите для себя, в будущем пригодится, пример http://arduino.ru/tutorials/BlinkWithoutDelay
Вам по факту ваш for с делаем нужно заменить на что-то аналогичное.
Разобрав пример, думаю сами осилите код поправить. Все в ваших руках. ;)
 

eXPert

✩✩✩✩✩✩✩
14 Авг 2018
22
0
Госпадя, да зачем вам целая библиотека?
Вы не поняли смысла первого кода и библиотеки. Мне не простое мигание нужно было, а затухание с обратным эффектом в цикле, то есть Fade Out -> Fade In -> Fade Out -> ... (и так в цикле пока работает любой режим кроме режима 0).
 

kostyamat

★★★★★★✩
29 Окт 2019
1,097
630
@eXPert, похоже это вы не поняли почему я вас к примеру отослал. Вы пример то гляньте и разберите. А код я ваш понял аж бегом, там и понимать то нечего ;)