ARDUINO Как работает GyverTimer ?

  • Кнопка "Начать переписку" переименована в "Личное сообщение", "СООБЩЕНИЯ ПРОФИЛЯ" переименованы в "СТЕНА"

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
57
5
Столкнулся с проблемой (хотя может я чего то недопонял).
Суть в том, что как будто Таймаутный таймер, нифига не таймаутный, а циклический, и не останавливается после отсчёта нужного времени.
C++:
#include <GyverTimer.h>
#include <GyverTM1637.h>
#define CLK 6
#define DIO 7

GyverTM1637 Disp(CLK, DIO);
GyverTimer PageTimer(MS);

void setup{ 
  PageTimer.setTimeout(2000);   //устанавливаем
}

void loop{
    if(PageTimer.isEnabled()){               //пока таймер работает(возвращает "true"), показываем надпись StEP
        Disp.displayByte(_S, _t, _E, _P);
    }else{                                       //теперь когда отсчитали время, статус таймера должен вернуть "false"
        Disp.displayInt((int)stepper2.currentPosition());         // теперь показываем на каком шаге стоит шаговик ( 28BYJ-48)
    }
}

Ну и получается что горит только надпись "СТЕП" , и не переключается на вывод текущей позиции.
 
Последнее редактирование:

Эдуард Анисимов

★★★✩✩✩✩
23 Сен 2019
577
136
54
Марий-Эл
boolean isEnabled(); // вернуть состояние таймера (остановлен/запущен)

Здесь более уместно
boolean isReady(); // возвращает true, когда пришло время
 

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
57
5
boolean isEnabled(); // вернуть состояние таймера (остановлен/запущен)

Здесь более уместно
boolean isReady(); // возвращает true, когда пришло время
Так я об этом и говорю. Что isReady() мне не подходит. Это другая логика вообще. Тоесть Ready моргнёт 1 раз True-шкой и снова false включит.
А мне надо - чтоб пока таймер работает, он выдавал true. И когда выйдет время включил false. Что и должна поидее делать функция isEnabled().
А получается , что Таймаутный таймер делает тоже самое что и интервальный (цикличный) таймер, только делает это 1 раз.
И ... она не делает вообще то что надо..
Я это проверил не мудрёным методом:
(код рабочий, экран только затереть если нету.)

C++:
#include <Arduino.h>
#define CLK 6
#define DIO 7
#include <GyverTM1637.h>
#include <GyverTimer.h>
GyverTM1637 disp(CLK, DIO);
GTimer Timer1(MS);

void setup() {
  Serial.begin(9600);
  disp.clear();
  disp.brightness(7);  // яркость, 0 - 7 (минимум - максимум)
  Timer1.setTimeout(2000);
}
void loop() {
  if(Timer1.isEnabled()){     // работает как будто всегда isEnabled() возвращает true
    Serial.println("isWork(true)");
    disp.displayInt(5555);
    delay(200);
  }else{
    Serial.println("isElse(false)");
    disp.displayInt(0000);
    delay(1000);
  }
}
Просто в данном случае придется хуевертить через дополнительный флаг, который будет перекидываться по isReady() и делать то что надо.
А это в прямом смысле лишние танцы с бубном.

Моё мнение - что функция не доработана и делает совсем не то.

Я и предлагаю допилить функцию isEnabled() чтоб она работала как я говорю.
Тогда эта функция будет очень даже рабочая. А щас показывает погоду в Гондурасе. :cautious:
 

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
57
5
Короче. Всё решилось. Сообразил кое че.

Решение работы isEnabled():
include <Arduino.h>
#define CLK 6
#define DIO 7
#include <GyverTM1637.h>
#include <GyverTimer.h>
GyverTM1637 disp(CLK, DIO);
uint32_t Now, clocktimer;
boolean flag;
GTimer Timer1(MS);
//boolean flag=false;
void setup() {
  Serial.begin(9600);
  disp.clear();
  disp.brightness(7);  // яркость, 0 - 7 (минимум - максимум)
  Timer1.setTimeout(2000);
}
void loop() {
Timer1.isReady();    //ВОТ ТУТ СОБАКА ПОРЫЛАСЬ!! Если её нет, то и параметр _state никто не меняет .
  if(Timer1.isEnabled()){
    Serial.println("isWork(true)");
    disp.displayInt(5555);
    delay(200);
  }else{
    Serial.println("isElse(false)");
    disp.displayInt(0000);
    delay(1000);
  }
 
}
 

b707

★✩✩✩✩✩✩
4 Июн 2020
51
17
очередная кривая библиотека...

ТС. неужели ради одного таймаута вам нужна целая библиотека? с миллис работать умееете?
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
735
150
@b707,
а почему кривая?

C++:
// Пример работы в режиме таймаута
#include "GyverTimer.h"   // подключаем библиотеку
GTimer myTimer(MS);    // создать миллисекундный таймер
//GTimer myTimer(US);    // US - микросекундный
void setup() {
  Serial.begin(9600);
  myTimer.setTimeout(3000);   // настроить таймаут 3 сек
  Serial.println("Start");
}
void loop() {
  // выведет Timeout 3 sec! через 3 секунды после вызова setTimeout(3000)
  if (myTimer.isReady()) Serial.println("Timeout 3 sec!");
 
  // после срабатывания остановит счёт
  // можно перезапустить при помощи setTimeout(время) или start()
}
вот пример же из сайта
он разве не работает и таймер не останавливается?
 

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
57
5
очередная кривая библиотека...

ТС. неужели ради одного таймаута вам нужна целая библиотека? с миллис работать умееете?
Библиотека хорошая, знать надо как обращаться.

Не ради одного...С миллис() работать умею, но писать в 10 местах кусок кода из 20 строчек как то не адэкватно. При том что грамотно организованный таймер в этой библиотеке решает кучу задач. Ты же не знаешь какая задача решается.

вот пример же из сайта
он разве не работает и таймер не останавливается?
Останавливается, но ты не понял сути заморочки. И какой вопрос я решал.
Пример рабочий, к нему нет вопросов.