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

Dairis

✩✩✩✩✩✩✩
9 Авг 2018
8
0
Я пишу прошивку для часов и для оброботки кнопок я использую библиотеку "GyverButton". У меня возникла проблема в том что я могу использовать функцию isPress() один раз и больше он не работает. Что делать? П.с желательно писать мне в Вк https://vk.com/redninya
 

Dairis

✩✩✩✩✩✩✩
9 Авг 2018
8
0
Всё подключено отлично, почему-то это библиотека позволяет использовать кнопку по одному разу каждый режим работы кнопки
 

Your_Andrew

✩✩✩✩✩✩✩
19 Окт 2018
14
1
Подскажите пожалуйста как подключить сенсорную кнопку к библиотеке GyverButton. Стандартное подключение не действует.
 

flashguy

✩✩✩✩✩✩✩
5 Ноя 2018
29
2
А стандартное - это какое. В этом ролике
есть пример и подключения и работы с кнопкой.
 

Dairis

✩✩✩✩✩✩✩
9 Авг 2018
8
0
Да я знаю что можно было сделать компактнее :)

#include <GyverTM1637.h>
#include <GyverButton.h>

#define CLK A1
#define DIO A2

GyverTM1637 disp(CLK, DIO);



byte sec = 50;
byte mins = 58;
byte hours = 23;
byte day = 29;
byte month = 12;
byte alarm_min;
byte alarm_hour = 8;


#define buzer 9
#define mode 0



GButton butt1(3, LOW_PULL, NORM_OPEN);
GButton butt2(3, LOW_PULL, NORM_OPEN);
GButton butt3(3, LOW_PULL, NORM_OPEN);
GButton butt4(3, LOW_PULL, NORM_OPEN);



unsigned long timer;
unsigned long halfsec;



boolean baner_flag = 0;
byte day_flag = 0;
boolean set_flag;




boolean dots;



byte TIME[4];
byte DATE[4];
byte ALARM[4];


void setup() {

pinMode(A4, INPUT);
pinMode(A3, OUTPUT);
pinMode(A5, OUTPUT);
pinMode(buzer, OUTPUT);


digitalWrite(A3, false);
digitalWrite(A5, true);

digitalWrite(buzer, false);



butt1.setDebounce(150);
butt1.setTimeout(4000);

butt2.setDebounce(150);
butt2.setTimeout(4000);

butt3.setDebounce(150);

butt4.setDebounce(150);


Serial.begin(9600);

}


void scrollClock(){
disp.displayClockScroll(hours, mins, 70);
}

void loop() {
int analog = analogRead(7);

butt1.tick(analog < 925 && analog > 860);
butt2.tick(analog < 1015 && analog > 970);
butt3.tick(analog < 540 && analog > 370);
butt4.tick(analog < 750 && analog > 680);

Serial.println(day_flag);

//--------------------------------------------------------------------------------------------------------------------------

if(baner_flag == 0){
byte welcome_baner[] = {_H, _E, _L, _L, _O, _empty, _empty, _empty, _empty, _L, _O, _A, _d, _1, _N, _G, 0x40, 0x40, 0x40,
0x0c, 0x42, 0x03, 0x44, 0x0c, 0x42, 0x03, 0x44, 0x0c, 0x42, 0x03, 0x44, 0x08, 0x08, 0x08};
disp.runningString(welcome_baner, sizeof(welcome_baner), 250);
}

baner_flag = 1;

//--------------------------------------------------------------------------------------------------------------------------

int val = analogRead(4);
val = map(val, 0, 1023, 0, 7);
val = constrain(val, 0, 7);

disp.brightness(val);

//--------------------------------------------------------------------------------------------------------------------------
// ОБОЗНАЧЕНИЕ ВРЕМЕНИ
//--------------------------------------------------------------------------------------------------------------------------

if(millis() - timer > 1000){
sec++;
timer = millis();
}

if(sec == 60){
mins++;
sec = 0;
}

if(mins == 60){
hours++;
mins = 0;
}
if(mins == 255){
mins = 59;
}

if(hours == 24){
day++;
hours = 0;
}
if(hours == 255){
hours = 23;
}

if(month == 13){
month = 1;
}
if(month == 0){
month = 12;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

if(day == 32 && month == 1){
month++;
day = 1;
}
if(day == 32 && month == 3) {
day = 1;
month++;
}

if(day == 32 && month == 5) {
day = 1;
month++;
}

if(day == 32 && month == 7) {
day = 1;
month++;
}
if(day == 32 && month == 8) {
day = 1;
month++;
}

if(day == 32 && month == 10) {
day = 1;
month++;
}
if(day == 32 && month == 12) {
day = 1;
month = 1;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if(day == 31 && month == 4){
month++;
day = 1;
}

if(day == 31 && month == 6){
month++;
day = 1;
}
if(day == 31 && month == 9){
month++;
day = 1;
}
if(day == 31 && month == 11){
month++;
day = 1;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if(day == 29 && month == 2){
month++;
day = 1;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

if(alarm_min == 60){
alarm_min = 0;
}

if(alarm_min == 255){
alarm_min = 59;
}

if(alarm_hour == 24){
alarm_hour = 0;
}

if(alarm_hour == 255){
alarm_hour = 23;
}

if(day == 0 && month == 1){
day = 31;
}

if(day == 0 && month == 3){
day = 31;
}

if(day == 0 && month == 5){
day = 31;
}

if(day == 0 && month == 7){
day = 31;
}

if(day == 0 && month == 8){
day = 31;
}

if(day == 0 && month == 10){
day = 31;
}

if(day == 0 && month == 12){
day = 31;
}

if(day == 32 && month == 1){
day = 1;
}

if(day == 32 && month == 3){
day = 1;
}

if(day == 32 && month == 5){
day = 1;
}

if(day == 32 && month == 7){
day = 1;
}

if(day == 32 && month == 8){
day = 1;
}

if(day == 32 && month == 10){
day = 1;
}

if(day == 32 && month == 12){
day = 1;
}



if(day == 0 && month == 4){
day = 30;
}

if(day == 0 && month == 6){
day = 30;
}

if(day == 0 && month == 9){
day = 30;
}

if(day == 0 && month == 11){
day = 30;
}


if(day == 31 && month == 4){
day = 1;
}

if(day == 31 && month == 6){
day = 1;
}

if(day == 31 && month == 9){
day = 1;
}

if(day == 31 && month == 11){
day = 1;
}

//------------------------------------------------------------------------------------------
// УСЛОВИЯ ПРОСМОТРА
//------------------------------------------------------------------------------------------
if(butt1.isPress() && day_flag == 0){
day_flag = 1;
}

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

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

if(butt1.isHolded() && day_flag >= 0 && day_flag <= 2){
day_flag = 3;
}

if(butt1.isPress() && day_flag == 3){
day_flag = 4;
}
if(butt1.isPress() && day_flag == 4){
day_flag = 5;
}
if(butt1.isPress() && day_flag == 5){
day_flag = 3;
}

if(butt1.isHolded () && day_flag >=3){
day_flag = 0;
}

//-------------------------------------------------------------------------------------------
// ПЕРЕКЛЮЧЕНИЕ НАСТРОЯК
//-------------------------------------------------------------------------------------------

if(day_flag >= 3 && butt2.isPress() && set_flag == 0){
set_flag = 1;
disp.point(1);
}

if(day_flag >= 3 && butt2.isPress() && set_flag == 1){
set_flag = 0;
disp.point(0);
}

//------------------------------------------------------------------------------------------
// ПРОСМОТР РЕЖИМОВ
//------------------------------------------------------------------------------------------

if(day_flag == 0 && mode == 0){
TIME[0] = hours / 10;
TIME[1] = hours % 10;
TIME[2] = mins / 10;
TIME[3] = mins % 10;
disp.display(TIME);
if(millis() - halfsec > 500){
dots = !dots;
halfsec = millis();
}
disp.point(dots);
}
else if(day_flag == 0 && mode == 1){
scrollClock();
if (millis() - halfsec > 500) { // если прошло полсекунды
halfsec = millis(); // сбросить таймер
dots = !dots; // переключить точки
if (dots) disp.point(0); // выключить точки
else disp.point(1);
}
}


}
 

Moofasta

✩✩✩✩✩✩✩
7 Фев 2019
5
0
butt1.setTickMode(AUTO); не забыл? да и на одном пине 4 кнопки это как?
 

Moofasta

✩✩✩✩✩✩✩
7 Фев 2019
5
0
у тебя опрос кнопок по какому-то значению сигнала на аналоговом пине... какая-то дичь которая ведет в дебри
 

Dairis

✩✩✩✩✩✩✩
9 Авг 2018
8
0
на одном пине потому что я пытался сделать резестивную клаву
 

Dairis

✩✩✩✩✩✩✩
9 Авг 2018
8
0
в этой библиотеке работает так что при обозночение кнопки и сопротевления они уже связаны, это подтверждает то что работает все кнопки но только один раз. Скажем я нажимаю на первую кнопку и я вижу дату но при повторным нажатии нечего не меняется однако если я удержу эту кнопку то меня перекидывает в настройки как и надо но обратно по удержанию я выйти не могу но поменять в настройках поменять можно только на одну цифру (за это отвечает другая кнопка). Получается так что кнопки при разных условиях, таких как isPress. ; isHolded.; isTick, работают по одному разу.
 

Ahriman

✩✩✩✩✩✩✩
21 Июл 2019
1
0
КОД
Получается вот что, если работает режим rele_VKL , то режим dvijok не работает. Ошибка в библиотеке или я криво что то написал ?
 

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

★★★✩✩✩✩
2 Авг 2018
487
124
Ошибки у тебя в коде точно есть. Вставляй отладочный вывод в монитор порта и изучай, что на самом деле делает твой код
 

Arhat109

★★★✩✩✩✩
9 Июн 2019
369
113
Посмотрел гитхаб button.h и как-то засмыщался .. сколько места в ОЗУ занимает такой объект класса?
Насколько понимаю, для почти всего достаточно 1 байта .. не?
 

Nick_SPb

✩✩✩✩✩✩✩
1 Ноя 2018
44
9
Привет автор, твой движок запускается в фунции setup() которая вызывается один раз при старте МК, а содержимое функции loop()
выполняется пока работает МК... но там у вас ничего о движке не описано.))) желаю удачи)
 
  • Лойс +1
Реакции: Ahriman

VectorCrush

✩✩✩✩✩✩✩
7 Фев 2020
2
0
Доброго времени суток всем. Помогите с кодом код простейший только начал осваивать программирование в целом. Не могу получить то что мне нужно.

Как сделать что бы пока я держу выполнялось после отжатия кнопки переходило в начало. Мне не нужно сразу весь а только тогда когда я держу кнопку и каждый раз сначала. Помогите пожалуйста уже третий день сижу кучу библиотек перепробовал.
C++:
#include "TrinketHidCombo.h"
#include "GyverButton.h"
GButton myButt(11, HIGH_PULL, NORM_OPEN);

void setup() {
pinMode(4,INPUT);
pinMode(2,INPUT);
pinMode (5,OUTPUT); 
TrinketHidCombo.begin();
myButt.setDebounce(10);
myButt.setTimeout(10);
myButt.setTickMode(AUTO);
}

void loop() {
TrinketHidCombo.poll();
if (myButt.isHolded()); {
TrinketHidCombo.mouseMove(-4,6,0);
delay(25); // пауза
TrinketHidCombo.mouseMove(-4,6,0);
delay(25);
TrinketHidCombo.mouseMove(-4,6,0);
    }
}
 

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

★★★★★✩✩
14 Авг 2019
1,492
367
Москва
Не знаю зачем тебе тут гайвербатон, вот тебе пример. Кнопка идет как пулап на 2-ой пин, т.е. она разделяет 2 пин и землю.
Когда нажимаешь ее, то счетчик увеличивается на 1, когда отпускаешь сбрасывается на 0.

Отдельно происходит проверка на изменение счетчика, и если оно было, то новое значение выводиться на экран. Сделано, что бы не "нулить" (заполнять нулями) монитор порта

C++:
void setup() {
  pinMode(2,INPUT_PULLUP);
  Serial.begin(9600);
}
int MyCounter=0;
int OldMyCounter=-1;
void loop() {
  if (digitalRead(2)==1) MyCounter=0;
  else MyCounter++;
  if (OldMyCounter!=MyCounter)
    {
      Serial.println(MyCounter);
      OldMyCounter=MyCounter;
    }
}
 
Последнее редактирование:

VectorCrush

✩✩✩✩✩✩✩
7 Фев 2020
2
0
Не знаю зачем тебе тут гайвербатон, вот тебе пример. Кнопка идет как пулап на 2-ой пин, т.е. она разделяет 2 пин и землю.
Когда нажимаешь ее, то счетчик увеличивается на 1, когда отпускаешь сбрасывается на 0.

Отдельно происходит проверка на изменение счетчика, и если оно было, то новое значение выводиться на экран. Сделано, что бы не "нулить" (заполнять нулями) монитор порта

C++:
void setup() {
  pinMode(2,INPUT_PULLUP);
  Serial.begin(9600);
}
int MyCounter=0;
int OldMyCounter=-1;
void loop() {
  if (digitalRead(2)==1) MyCounter=0;
  else MyCounter++;
  if (OldMyCounter!=MyCounter)
    {
      Serial.println(MyCounter);
      OldMyCounter=MyCounter;
    }
}
Если это ответ мне то попробовал выполнение идёт полностью, а не только когда я удерживаю.
 

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

★★★★★✩✩
14 Авг 2019
1,492
367
Москва
@VectorCrush, Да,тебе, если я выкладываю код, то он проверен. Иногда выкладываю и не проверенный, но об этом я пишу
Сейчас специально для тебя взял код из твоего сообщения и еще раз проверил. Работает.
Так что проверяй еще раз 1) что кнопка подключена ко 2-му пину, что второй контакт кнопки идет на землю. ЭТО БЫЛО В ОПИСАНИИ СРАЗУ!
 

AndrySmart

✩✩✩✩✩✩✩
12 Дек 2018
31
2
Киев
Подскажите не будет ли эта библиотека конфликтовать с библиотеками
FreqCount.h
Adafruit_SSD1306.h
PWM.h
?

а то они кажись используют таймер.
 

AndrySmart

✩✩✩✩✩✩✩
12 Дек 2018
31
2
Киев
сама библиотека использует таймер. просто мы при вызове ее функций таймер не используем.