+2 голосов

Всем привет. В ходе создания проекта нужен был простой и многофункциональный таймер для решения задач. Выбор пал на библиотеку GyverTimer.h (автор Alex Gyver). 

Скетч работает очень хорошо. Меня устраивает, но создано несколько таймеров. Время задержки я меняю в глобальных переменных для каждого таймера, но мне нужно это делать через меню. 

Таймер при этом работает только со значением например long timer=1000; и не работает (не выполняется действие) когда long timer =0;. Значение задержки которое я меняю в меню таймер игнорирует и использует только значение глобальной переменной. 

Возможно описал не понятно, сорри, с ардуино работаю несколько месяцев, с глобальными и локальными переменными вроде разобрался, но не знаю как поступить в этом случае. Прилагаю часть скетч ниже.
 

#include <GyverTimer.h>

#define upPin 49                          // увеличение значения  +
#define downPin 51                        // уменьшение значения -

boolean buttonupWasUp = true;
boolean buttondownWasUp = true;

long timer1;                            // время задержки

GTimer myTimer(MS,timer1);          //создаем милисекундный  таймер

void setup() {

  pinMode(upPin, INPUT_PULLUP);
  pinMode(downPin, INPUT_PULLUP);

}

void loop() {

  boolean buttonupIsUp = digitalRead(upPin);
  boolean buttondownIsUp = digitalRead(downPin);

//------------------------------------------------------------------ отработка нажатия +

 if (buttonupWasUp && !buttonupIsUp)
  {
    buttonupIsUp = digitalRead(upPin);

if (!buttonupIsUp && millis() - last_press > 50)
    {
      if (timer1 < 25000)
      {
        timer1 = timer1 + 100;
        last_press = millis ();
      }
    }

  }

//------------------------------------------------------------------ отработка нажатия -

if (buttondownWasUp && !buttondownIsUp)
  {
    buttondownIsUp = digitalRead(downPin);

  if (!buttondownIsUp &&  millis() - last_press > 50)
    {
      if (timer1 > 0)
      {
        timer1 = timer1 - 100;
        last_press = millis ();
      }
    }    
  }

(13 баллов) 1 5
исправил

1 Ответ

+3 голосов
 
Лучший ответ

В документации используемой вами библиотеки GyverTimer указано, что интервал срабатывания таймера можно изменить после инициализации с помощью функции setInterval(новое время между срабатываниями ); В вашем коде эту функцию следует использовать в случае изменения переменной timer1. Например , 

​

 if (timer1 < 25000)
      {
        timer1 = timer1 + 100;
       
    myTimer.setInterval(timer1);  //  устанавливаем таймеру новый интервал
        last_press = millis ();
      }





​

(2.5 тыс. баллов) 5 15 38
выбран
Спасибо, это решило проблему! Но интересно почему таймер не работает когда значение timer1= 0?Или это особенность таймера? Я рассчитывал, что просто не будет задержки.
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
  1. parovoZZ

    102 балл(ов)

  2. Un_ka

    66 балл(ов)

  3. sser

    38 балл(ов)

  4. Тигрыч

    10 балл(ов)

  5. Kiprais

    9 балл(ов)

  6. N08I40K

    8 балл(ов)

Награды месяца
1-е место: Raspberry Pi 3 Model A+
2-е место: Raspberry Pi Zero W
3-е место: Raspberry Pi Zero

...