├── .gitattributes ├── .github └── workflows │ └── tg-send.yml ├── LICENSE ├── README.md ├── README_EN.md ├── examples ├── GTimer │ └── GTimer.ino ├── GTimer_button │ └── GTimer_button.ino ├── GTimer_demo │ └── GTimer_demo.ino ├── GTimer_manual │ └── GTimer_manual.ino ├── GTimer_multiple │ └── GTimer_multiple.ino ├── GTimer_timeout │ └── GTimer_timeout.ino ├── GTimer_timeoutContinue │ └── GTimer_timeoutContinue.ino ├── GTimer_us │ └── GTimer_us.ino ├── Old_examples │ ├── GTimer │ │ └── GTimer.ino │ ├── GTimer_manual │ │ └── GTimer_manual.ino │ ├── GTimer_multiple │ │ └── GTimer_multiple.ino │ ├── GTimer_us │ │ └── GTimer_us.ino │ └── Screenshot_2.jpg ├── Screenshot_2.jpg └── stop_resume │ └── stop_resume.ino ├── keywords.txt ├── library.properties └── src ├── GyverTimer.cpp └── GyverTimer.h /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/workflows/tg-send.yml: -------------------------------------------------------------------------------- 1 | 2 | name: Telegram Message 3 | on: 4 | release: 5 | types: [published] 6 | jobs: 7 | build: 8 | name: Send Message 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: send telegram message on push 12 | uses: appleboy/telegram-action@master 13 | with: 14 | to: ${{ secrets.TELEGRAM_TO }} 15 | token: ${{ secrets.TELEGRAM_TOKEN }} 16 | disable_web_page_preview: true 17 | message: | 18 | ${{ github.event.repository.name }} v${{ github.event.release.tag_name }} 19 | ${{ github.event.release.body }} 20 | https://github.com/${{ github.repository }} 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 AlexGyver 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![latest](https://img.shields.io/github/v/release/GyverLibs/GyverTimer.svg?color=brightgreen)](https://github.com/GyverLibs/GyverTimer/releases/latest/download/GyverTimer.zip) 2 | [![PIO](https://badges.registry.platformio.org/packages/gyverlibs/library/GyverTimer.svg)](https://registry.platformio.org/libraries/gyverlibs/GyverTimer) 3 | [![Foo](https://img.shields.io/badge/Website-AlexGyver.ru-blue.svg?style=flat-square)](https://alexgyver.ru/) 4 | [![Foo](https://img.shields.io/badge/%E2%82%BD%24%E2%82%AC%20%D0%9F%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D1%82%D1%8C-%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B0-orange.svg?style=flat-square)](https://alexgyver.ru/support_alex/) 5 | [![Foo](https://img.shields.io/badge/README-ENGLISH-blueviolet.svg?style=flat-square)](https://github-com.translate.goog/GyverLibs/GyverTimer?_x_tr_sl=ru&_x_tr_tl=en) 6 | 7 | [![Foo](https://img.shields.io/badge/ПОДПИСАТЬСЯ-НА%20ОБНОВЛЕНИЯ-brightgreen.svg?style=social&logo=telegram&color=blue)](https://t.me/GyverLibs) 8 | 9 | |⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️

**ВНИМАНИЕ, БИБЛИОТЕКА УСТАРЕЛА! ИСПОЛЬЗУЙ БИБЛИОТЕКУ [GTimer](https://github.com/GyverLibs/GTimer), ОНА ЛЕГЧЕ И ИМЕЕТ БОЛЬШЕ ВОЗМОЖНОСТЕЙ**

⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️| 10 | | --- | 11 | 12 | # GyverTimer 13 | Пполноценный таймер на базе системных millis() / micros() 14 | **ВНИМАНИЕ, БИБЛИОТЕКА УСТАРЕЛА! ИСПОЛЬЗУЙ [TimerMs](https://github.com/GyverLibs/TimerMs)** 15 | - Миллисекундный и микросекундный таймер 16 | - Два режима работы: 17 | - Режим интервала: таймер "срабатывает" каждый заданный интервал времени 18 | - Режим таймаута: таймер "срабатывает" один раз по истечении времени (до следующего перезапуска) 19 | - Служебные функции: 20 | - Старт 21 | - Стоп 22 | - Сброс 23 | - Продолжить 24 | 25 | ### Совместимость 26 | Совместима со всеми Arduino платформами (используются Arduino-функции) 27 | 28 | ### Документация 29 | К библиотеке есть [расширенная документация](https://alexgyver.ru/gyvertimer/) 30 | 31 | ## Содержание 32 | - [Установка](#install) 33 | - [Инициализация](#init) 34 | - [Использование](#usage) 35 | - [Пример](#example) 36 | - [Версии](#versions) 37 | - [Баги и обратная связь](#feedback) 38 | 39 | 40 | ## Установка 41 | - Библиотеку можно найти по названию **GyverTimer** и установить через менеджер библиотек в: 42 | - Arduino IDE 43 | - Arduino IDE v2 44 | - PlatformIO 45 | - [Скачать библиотеку](https://github.com/GyverLibs/GyverTimer/archive/refs/heads/main.zip) .zip архивом для ручной установки: 46 | - Распаковать и положить в *C:\Program Files (x86)\Arduino\libraries* (Windows x64) 47 | - Распаковать и положить в *C:\Program Files\Arduino\libraries* (Windows x32) 48 | - Распаковать и положить в *Документы/Arduino/libraries/* 49 | - (Arduino IDE) автоматическая установка из .zip: *Скетч/Подключить библиотеку/Добавить .ZIP библиотеку…* и указать скачанный архив 50 | - Читай более подробную инструкцию по установке библиотек [здесь](https://alexgyver.ru/arduino-first/#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA) 51 | ### Обновление 52 | - Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи 53 | - Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить" 54 | - Вручную: **удалить папку со старой версией**, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам! 55 | 56 | 57 | 58 | ## Инициализация 59 | ```cpp 60 | // mode: MS/US 61 | GTimer myTimer(mode); 62 | GTimer myTimer(mode, interval); 63 | ``` 64 | 65 | 66 | ## Использование 67 | ```cpp 68 | void setInterval(uint32_t interval); // установка интервала работы таймера (также запустит и сбросит таймер) - режим интервала 69 | void setTimeout(uint32_t timeout); // установка таймаута работы таймера (также запустит и сбросит таймер) - режим таймаута 70 | boolean isReady(); // возвращает true, когда пришло время 71 | boolean isEnabled(); // вернуть состояние таймера (остановлен/запущен) 72 | void reset(); // сброс таймера на установленный период работы 73 | void start(); // запустить/перезапустить (со сбросом счёта) 74 | void stop(); // остановить таймер (без сброса счёта) 75 | void resume(); // продолжить (без сброса счёта) 76 | 77 | // служебное 78 | void setMode(boolean mode); // установка режима работы вручную: AUTO или MANUAL (TIMER_INTERVAL / TIMER_TIMEOUT) 79 | ``` 80 | 81 | 82 | ## Пример 83 | Остальные примеры смотри в **examples**! 84 | ```cpp 85 | #include "GyverTimer.h" 86 | GTimer myTimer(MS); // создать миллисекундный таймер 87 | 88 | void setup() { 89 | Serial.begin(9600); 90 | myTimer.setInterval(500); // настроить интервал 91 | } 92 | 93 | void loop() { 94 | if (myTimer.isReady()) Serial.println("Timer!"); 95 | } 96 | ``` 97 | 98 | 99 | ## Версии 100 | - v2.0 - улучшенный алгоритм работы таймера 101 | - Кратные интервалы 102 | - Защита от пропусков 103 | - Защита от переполнения millis() 104 | - Убраны дефайны 105 | - v2.1 - возвращены дефайны 106 | - v2.2 - улучшена стабильность 107 | - v3.0 108 | - Логика работы разделена на интервал и таймаут 109 | - Добавлен общий класс GTimer (для миллисекундного и микросекундного таймера) 110 | - Добавлена возможность остановить и продолжить счёт таймера 111 | - v3.2 112 | - Добавлен isEnabled 113 | - Возможность не запускать таймер при создании 114 | 115 | 116 | ## Баги и обратная связь 117 | При нахождении багов создавайте **Issue**, а лучше сразу пишите на почту [alex@alexgyver.ru](mailto:alex@alexgyver.ru) 118 | Библиотека открыта для доработки и ваших **Pull Request**'ов! 119 | 120 | 121 | При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать: 122 | - Версия библиотеки 123 | - Какой используется МК 124 | - Версия SDK (для ESP) 125 | - Версия Arduino IDE 126 | - Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде 127 | - Какой код загружался, какая работа от него ожидалась и как он работает в реальности 128 | - В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код 129 | -------------------------------------------------------------------------------- /README_EN.md: -------------------------------------------------------------------------------- 1 | This is an automatic translation, may be incorrect in some places. See sources and examples! 2 | 3 | # Gyvertimer 4 | Millis () / Micros () 5 | ** Attention, the library is outdated!Use [Timerms] (https://github.com/gyverlibs/timerms) ** 6 | - millisecond and microsecond timer 7 | - Two operating modes: 8 | - interval mode: Timer "triggers" every given time interval 9 | - Tymauta mode: The timer "triggers" once after the time (until the next restart) 10 | - Office functions: 11 | - Start 12 | - Stop 13 | - Reset 14 | - Continue 15 | 16 | ## compatibility 17 | Compatible with all arduino platforms (used arduino functions) 18 | 19 | ### Documentation 20 | There is [expanded documentation] to the library (https://alexgyver.ru/gyvertimer/) 21 | 22 | ## Content 23 | - [installation] (# Install) 24 | - [initialization] (#init) 25 | - [use] (#usage) 26 | - [Example] (# Example) 27 | - [versions] (#varsions) 28 | - [bugs and feedback] (#fedback) 29 | 30 | 31 | ## Installation 32 | - The library can be found by the name ** gyvertimer ** and installed through the library manager in: 33 | - Arduino ide 34 | - Arduino ide v2 35 | - Platformio 36 | - [download the library] (https://github.com/gyverlibs/gyvertimer/archive/refs/heads/main.zip). Zip archive for manual installation: 37 | - unpack and put in * C: \ Program Files (X86) \ Arduino \ Libraries * (Windows X64) 38 | - unpack and put in * C: \ Program Files \ Arduino \ Libraries * (Windows X32) 39 | - unpack and put in *documents/arduino/libraries/ * 40 | - (Arduino id) Automatic installation from. Zip: * sketch/connect the library/add .Zip library ... * and specify downloaded archive 41 | - Read more detailed instructions for installing libraries [here] (https://alexgyver.ru/arduino-first/#%D0%A3%D1%81%D1%82%D0%B0%BD%D0%BE%BE%BE%BED0%B2%D0%BA%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA) 42 | ### Update 43 | - I recommend always updating the library: errors and bugs are corrected in the new versions, as well as optimization and new features are added 44 | - through the IDE library manager: find the library how to install and click "update" 45 | - Manually: ** remove the folder with the old version **, and then put a new one in its place.“Replacement” cannot be done: sometimes in new versions, files that remain when replacing are deleted and can lead to errors! 46 | 47 | 48 | 49 | ## initialization 50 | `` `CPP 51 | // Mode: MS/US 52 | Gtimer mytimer (mode); 53 | Gtimer mytimer (Mode, Interval); 54 | `` ` 55 | 56 | 57 | ## Usage 58 | `` `CPP 59 | VOID SetinTerval (Uint32_T Interval);// Installation of the interval of the timer (also launch and drop the timer) - interval mode 60 | VOID settimeout (uint32_t timeout);// Installation of the timer timer (will also launch and drop the timer) - Timout mode 61 | Boolean Isready ();// Returns True when the time has come 62 | Boolean Isenabled ();// Return the condition of the timer (stopped/launched) 63 | VOID Reset ();// Tiemer resetting to the established period of work 64 | VOID Start ();// Launch/restart (with account reset) 65 | VOID Stop ();// Stop the timer (without resetting) 66 | VOID Resume ();// Continue (without resetting) 67 | 68 | // Office 69 | VOID setmode (Boolean Mode);// Installation of the operating mode manually: Auto or Manual (Timer_Interval / Timer_timeout) 70 | `` ` 71 | 72 | 73 | ## Example 74 | The rest of the examples look at ** Examples **! 75 | ```CPP 76 | #include "gyvertimer.h" 77 | Gtimer mytimer (MS);// Create a millisecond timer 78 | 79 | VOID setup () { 80 | Serial.Begin (9600); 81 | Mytimer.SetinTERVAL (500);// configure the interval 82 | } 83 | 84 | VOID loop () { 85 | if (mytimer.isread ()) serial.println ("Timer!"); 86 | } 87 | `` ` 88 | 89 | 90 | ## versions 91 | - V2.0 - an improved timer operation algorithm 92 | - multiple intervals 93 | - Protection against passes 94 | - Protection from overflow Millis () 95 | - Defaine removed 96 | - V2.1 - Defaines returned 97 | - V2.2 - Improved stability 98 | - V3.0 99 | - The logic of work is divided into interval and timaut 100 | - added the general class GTimer (for millisecond and microsecond timer) 101 | - Added the ability to stop and continue the timer account 102 | - V3.2 103 | - Added isenabled 104 | - the opportunity not to launch a timer when creating 105 | 106 | 107 | ## bugs and feedback 108 | Create ** Issue ** when you find the bugs, and better immediately write to the mail [alex@alexgyver.ru] (mailto: alex@alexgyver.ru) 109 | The library is open for refinement and your ** pull Request ** 'ow! 110 | 111 | 112 | When reporting about bugs or incorrect work of the library, it is necessary to indicate: 113 | - The version of the library 114 | - What is MK used 115 | - SDK version (for ESP) 116 | - version of Arduino ide 117 | - whether the built -in examples work correctly, in which the functions and designs are used, leading to a bug in your code 118 | - what code has been loaded, what work was expected from it and how it works in reality 119 | - Ideally, attach the minimum code in which the bug is observed.Not a canvas of a thousand lines, but a minimum code -------------------------------------------------------------------------------- /examples/GTimer/GTimer.ino: -------------------------------------------------------------------------------- 1 | #include "GyverTimer.h" 2 | GTimer myTimer(MS); // создать миллисекундный таймер 3 | 4 | void setup() { 5 | Serial.begin(9600); 6 | myTimer.setInterval(500); // настроить интервал 7 | } 8 | 9 | void loop() { 10 | if (myTimer.isReady()) Serial.println("Timer!"); 11 | } 12 | -------------------------------------------------------------------------------- /examples/GTimer_button/GTimer_button.ino: -------------------------------------------------------------------------------- 1 | // пример с кнопкой, кнопка сбрасывает таймер 2 | 3 | #include // библиотека кнопки 4 | GButton btn(3); // кнопка на D3 5 | 6 | #include "GyverTimer.h" // библиотека таймера 7 | GTimer myTimer(MS); // создать таймер (по умолч. в режиме интервала) 8 | 9 | void setup() { 10 | Serial.begin(9600); 11 | myTimer.setTimeout(1000); // запуск в режиме таймаута 1 секунда 12 | } 13 | 14 | void loop() { 15 | btn.tick(); // опрос кнопки 16 | // при нажатии кнопки задаём таймаут 1 секунду 17 | if (btn.isClick()) myTimer.setTimeout(1000); 18 | 19 | // через секунду после последнего нажатия выведет Timeout! 20 | if (myTimer.isReady()) Serial.println("Timeout!"); 21 | } 22 | -------------------------------------------------------------------------------- /examples/GTimer_demo/GTimer_demo.ino: -------------------------------------------------------------------------------- 1 | // пример работы в режиме интервалов 2 | 3 | #include "GyverTimer.h" // подключаем библиотеку 4 | 5 | GTimer myTimer(MS); // создать миллисекундный таймер (ms) (по умолч. в режиме интервала) 6 | //GTimer myTimer(MS, 1000); // можно сразу указать период (по умолч. в режиме интервала) 7 | //GTimer myTimer(US, 5000); // или микросекундный (us), на 5000 мкс (по умолч. в режиме интервала) 8 | 9 | // без указания периода таймер автоматически не запустится! 10 | 11 | void setup() { 12 | Serial.begin(9600); 13 | myTimer.setInterval(500); // запуск в режиме интервала 500 мс 14 | 15 | // myTimer.stop(); // "остановить" таймер 16 | // myTimer.start(); // запустить (перезапустить) таймер 17 | // myTimer.reset(); // сбросить период 18 | // myTimer.resume(); // продолжить работу после stop 19 | } 20 | 21 | void loop() { 22 | if (myTimer.isReady()) Serial.println("Timer!"); // 2 раза в секунду 23 | } 24 | -------------------------------------------------------------------------------- /examples/GTimer_manual/GTimer_manual.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Пример работы в ручном режиме (отложенный пуск) 3 | */ 4 | 5 | #include "GyverTimer.h" 6 | GTimer myTimer(MS); // создать таймер 7 | 8 | void setup() { 9 | Serial.begin(9600); 10 | myTimer.setInterval(5000); // настроить интервал 5 сек 11 | myTimer.setMode(MANUAL); // ручной режим 12 | Serial.println("Start"); 13 | Serial.println("Wait 5 sec"); 14 | } 15 | 16 | void loop() { 17 | if (myTimer.isReady()) Serial.println("Timer!"); 18 | } 19 | -------------------------------------------------------------------------------- /examples/GTimer_multiple/GTimer_multiple.ino: -------------------------------------------------------------------------------- 1 | // пример параллельной работы нескольких таймеров 2 | 3 | #include "GyverTimer.h" // подключаем библиотеку 4 | 5 | // создаём таймеры в миллисекундах 6 | GTimer myTimer1(MS, 500); 7 | GTimer myTimer2(MS, 600); 8 | GTimer myTimer3(MS, 1000); 9 | 10 | void setup() { 11 | Serial.begin(9600); 12 | } 13 | 14 | void loop() { 15 | if (myTimer1.isReady()) 16 | Serial.println("Timer 1!"); 17 | 18 | if (myTimer2.isReady()) 19 | Serial.println("Timer 2!"); 20 | 21 | if (myTimer3.isReady()) 22 | Serial.println("Timer 3!"); 23 | } 24 | -------------------------------------------------------------------------------- /examples/GTimer_timeout/GTimer_timeout.ino: -------------------------------------------------------------------------------- 1 | // Пример работы в режиме таймаута 2 | 3 | #include "GyverTimer.h" // подключаем библиотеку 4 | 5 | GTimer myTimer(MS); // создать миллисекундный таймер 6 | //GTimer myTimer(US); // US - микросекундный 7 | 8 | void setup() { 9 | Serial.begin(9600); 10 | myTimer.setTimeout(3000); // настроить таймаут 3 сек 11 | Serial.println("Start"); 12 | } 13 | 14 | void loop() { 15 | // выведет Timeout 3 sec! через 3 секунды после вызова setTimeout(3000) 16 | if (myTimer.isReady()) Serial.println("Timeout 3 sec!"); 17 | 18 | // после срабатывания остановит счёт 19 | // можно перезапустить при помощи setTimeout(время) или start() 20 | } 21 | -------------------------------------------------------------------------------- /examples/GTimer_timeoutContinue/GTimer_timeoutContinue.ino: -------------------------------------------------------------------------------- 1 | // Пример работы в режиме таймаута 2 | 3 | #include "GyverTimer.h" // подключаем библиотеку 4 | 5 | GTimer myTimer(MS); // создать миллисекундный таймер 6 | //GTimer myTimer(US); // US - микросекундный 7 | 8 | void setup() { 9 | Serial.begin(9600); 10 | myTimer.setTimeout(3000); // настроить таймаут 3 сек 11 | Serial.println("Start"); 12 | } 13 | 14 | void loop() { 15 | // выведет Timeout 3 sec! через 3 секунды после вызова setTimeout(3000) 16 | // и будет выводить постоянно вплоть ДО ПЕРЕЗАПУСКА ТАЙМЕРА 17 | if (myTimer.isReady() || !myTimer.isEnabled()) Serial.println("Timeout 3 sec!"); 18 | 19 | // после срабатывания остановит счёт 20 | // можно перезапустить при помощи setTimeout(время) или start() 21 | } 22 | -------------------------------------------------------------------------------- /examples/GTimer_us/GTimer_us.ino: -------------------------------------------------------------------------------- 1 | // пример с таймером на micros 2 | 3 | #include "GyverTimer.h" 4 | GTimer myTimer(US, 1500); // создать таймер 1500 мкс = 1,5 миллисекунды 5 | 6 | void setup() { 7 | Serial.begin(9600); 8 | } 9 | 10 | void loop() { 11 | if (myTimer.isReady()) Serial.println("Timer!"); 12 | } -------------------------------------------------------------------------------- /examples/Old_examples/GTimer/GTimer.ino: -------------------------------------------------------------------------------- 1 | #include "GyverTimer.h" 2 | GTimer_ms myTimer; // создать таймер 3 | 4 | void setup() { 5 | Serial.begin(9600); 6 | myTimer.setInterval(500); // настроить интервал 7 | } 8 | 9 | void loop() { 10 | if (myTimer.isReady()) Serial.println("Timer!"); 11 | } 12 | -------------------------------------------------------------------------------- /examples/Old_examples/GTimer_manual/GTimer_manual.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Пример работы в ручном режиме (отложенный пуск) 3 | */ 4 | 5 | #include "GyverTimer.h" 6 | GTimer_ms myTimer; // создать таймер 7 | 8 | void setup() { 9 | Serial.begin(9600); 10 | myTimer.setInterval(5000); // настроить интервал 5 сек 11 | myTimer.setMode(MANUAL); // ручной режим 12 | Serial.println("Start"); 13 | Serial.println("Wait 5 sec"); 14 | } 15 | 16 | void loop() { 17 | if (myTimer.isReady()) Serial.println("Timer!"); 18 | } 19 | -------------------------------------------------------------------------------- /examples/Old_examples/GTimer_multiple/GTimer_multiple.ino: -------------------------------------------------------------------------------- 1 | #include "GyverTimer.h" 2 | 3 | // создать таймер, в скобках период в миллисекундах 4 | GTimer_ms myTimer1(500); 5 | GTimer_ms myTimer2(600); 6 | GTimer_ms myTimer3(1000); 7 | 8 | void setup() { 9 | Serial.begin(9600); 10 | } 11 | 12 | void loop() { 13 | if (myTimer1.isReady()) 14 | Serial.println("Timer 1!"); 15 | 16 | if (myTimer2.isReady()) 17 | Serial.println("Timer 2!"); 18 | 19 | if (myTimer3.isReady()) 20 | Serial.println("Timer 3!"); 21 | } 22 | -------------------------------------------------------------------------------- /examples/Old_examples/GTimer_us/GTimer_us.ino: -------------------------------------------------------------------------------- 1 | // пример с таймером на micros 2 | 3 | #include "GyverTimer.h" 4 | GTimer_us myTimer(1500); // создать таймер 1500 мкс = 1,5 миллисекунды 5 | 6 | void setup() { 7 | Serial.begin(9600); 8 | } 9 | 10 | void loop() { 11 | if (myTimer.isReady()) Serial.println("Timer!"); 12 | } -------------------------------------------------------------------------------- /examples/Old_examples/Screenshot_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GyverLibs/GyverTimer/4f8c6c4df0aeff9991c19f4c0798c56530a79886/examples/Old_examples/Screenshot_2.jpg -------------------------------------------------------------------------------- /examples/Screenshot_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GyverLibs/GyverTimer/4f8c6c4df0aeff9991c19f4c0798c56530a79886/examples/Screenshot_2.jpg -------------------------------------------------------------------------------- /examples/stop_resume/stop_resume.ino: -------------------------------------------------------------------------------- 1 | // пример с кнопкой, которая приостанавливает таймер 2 | 3 | #include // библиотека кнопки 4 | GButton btn(3); // кнопка на D3 5 | 6 | #include "GyverTimer.h" // библиотека таймера 7 | GTimer myTimer(MS); // создать таймер (по умолч. в режиме интервала) 8 | 9 | void setup() { 10 | Serial.begin(9600); 11 | myTimer.setInterval(5000); // запуск в режиме таймаута 5 секунд 12 | } 13 | 14 | void loop() { 15 | btn.tick(); // опрос кнопки 16 | 17 | // при нажатии кнопки останавливаем и продолжаем таймер 18 | if (btn.isClick()) { 19 | static bool flag = false; 20 | flag = !flag; 21 | if (flag) myTimer.stop(); 22 | else myTimer.resume(); 23 | } 24 | 25 | // оповещение о таймауте 26 | if (myTimer.isReady()) Serial.println("Timeout!"); 27 | } 28 | -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map For GyverTimer 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | 9 | GTimer KEYWORD1 10 | GTimer_ms KEYWORD1 11 | GTimer_us KEYWORD1 12 | GyverTimer KEYWORD1 13 | 14 | ####################################### 15 | # Methods and Functions (KEYWORD2) 16 | ####################################### 17 | 18 | setInterval KEYWORD2 19 | setTimeout KEYWORD2 20 | isReady KEYWORD2 21 | isEnabled KEYWORD2 22 | reset KEYWORD2 23 | setMode KEYWORD2 24 | start KEYWORD2 25 | stop KEYWORD2 26 | resume KEYWORD2 27 | 28 | ####################################### 29 | # Constants (LITERAL1) 30 | ####################################### 31 | 32 | AUTO LITERAL1 33 | MANUAL LITERAL1 34 | TIMER_TIMEOUT LITERAL1 35 | TIMER_INTERVAL LITERAL1 36 | MS LITERAL1 37 | US LITERAL1 -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=GyverTimer 2 | version=3.2 3 | author=AlexGyver 4 | maintainer=AlexGyver 5 | sentence=Simple timer with period/timeout modes on millis 6 | paragraph=Simple timer with period/timeout modes on millis 7 | category=Timing 8 | url=https://github.com/GyverLibs/GyverTimer 9 | architectures=* -------------------------------------------------------------------------------- /src/GyverTimer.cpp: -------------------------------------------------------------------------------- 1 | #include "GyverTimer.h" 2 | 3 | // конструктор 4 | GTimer::GTimer(timerType type, uint32_t interval) { 5 | setInterval(interval); // запуск в режиме ИНТЕРВАЛА 6 | _type = type; // установка типа 7 | } 8 | 9 | // запуск в режиме интервала 10 | void GTimer::setInterval(uint32_t interval) { 11 | if (interval != 0) { // защита от ввода 0 12 | _interval = interval; // установка 13 | _mode = TIMER_INTERVAL; // режим "интервал" 14 | start(); // сброс и запуск 15 | } else stop(); // остановка, если время == 0 16 | } 17 | 18 | // запуск в режиме таймаута 19 | void GTimer::setTimeout(uint32_t timeout) { 20 | setInterval(timeout); // задать интервал и запустить 21 | _mode = TIMER_TIMEOUT; // режим "таймаут" 22 | } 23 | 24 | // остановить счёт 25 | void GTimer::stop() { 26 | _state = false; 27 | _resumeBuffer = ( (_type) ? millis() : micros() ) - _timer; // запомнили "время остановки" 28 | } 29 | 30 | // продолжить счёт 31 | void GTimer::resume() { 32 | start(); 33 | _timer -= _resumeBuffer; // восстановили время остановки 34 | } 35 | 36 | // перезапустить счёт 37 | void GTimer::start() { 38 | _state = true; 39 | reset(); 40 | } 41 | 42 | // сброс периода 43 | void GTimer::reset() { 44 | _timer = (_type) ? millis() : micros(); 45 | } 46 | 47 | // состояние 48 | boolean GTimer::isEnabled() { 49 | return _state; 50 | } 51 | 52 | // проверка таймера v2.0 (соблюдение интервалов, защита от пропуска и переполнения) 53 | boolean GTimer::isReady() { 54 | if (!_state) return false; // если таймер остановлен 55 | uint32_t thisTime = (_type) ? millis() : micros(); // текущее время 56 | if (thisTime - _timer >= _interval) { // проверка времени 57 | if (_mode) { // если режим интервалов 58 | do { 59 | _timer += _interval; 60 | if (_timer < _interval) break; // защита от переполнения uint32_t 61 | } while (_timer < thisTime - _interval); // защита от пропуска шага 62 | } else { // если режим таймаута 63 | _state = false; // остановить таймер 64 | } 65 | return true; 66 | } else { 67 | return false; 68 | } 69 | } 70 | 71 | // сменить режим вручную 72 | void GTimer::setMode(boolean mode) { 73 | _mode = mode; 74 | } 75 | 76 | // ================== УСТАРЕЛО (но работает, для совместимости) =================== 77 | 78 | // ====== millis ====== 79 | GTimer_ms::GTimer_ms() {} 80 | 81 | GTimer_ms::GTimer_ms(uint32_t interval) { 82 | _interval = (interval == 0) ? 1 : interval; // защита от ввода 0 83 | reset(); 84 | } 85 | 86 | void GTimer_ms::setInterval(uint32_t interval) { 87 | _interval = (interval == 0) ? 1 : interval; // защита от ввода 0 88 | GTimer_ms::reset(); 89 | _state = true; 90 | _mode = true; 91 | } 92 | void GTimer_ms::setTimeout(uint32_t interval) { 93 | setInterval(interval); 94 | _mode = false; 95 | } 96 | void GTimer_ms::setMode(uint8_t mode) { 97 | _mode = mode; 98 | } 99 | void GTimer_ms::start() { 100 | _state = true; 101 | } 102 | void GTimer_ms::stop() { 103 | _state = false; 104 | } 105 | boolean GTimer_ms::isReady() { 106 | if (!_state) return false; 107 | uint32_t thisMls = millis(); 108 | if (thisMls - _timer >= _interval) { 109 | if (_mode) { 110 | do { 111 | _timer += _interval; 112 | if (_timer < _interval) break; // переполнение uint32_t 113 | } while (_timer < thisMls - _interval); // защита от пропуска шага 114 | } else { 115 | _state = false; 116 | } 117 | return true; 118 | } else { 119 | return false; 120 | } 121 | } 122 | 123 | void GTimer_ms::reset() { 124 | _timer = millis(); 125 | } 126 | 127 | // ====== micros ====== 128 | GTimer_us::GTimer_us() {} 129 | 130 | GTimer_us::GTimer_us(uint32_t interval) { 131 | _interval = (interval == 0) ? 1 : interval; // защита от ввода 0 132 | reset(); 133 | } 134 | 135 | void GTimer_us::setInterval(uint32_t interval) { 136 | _interval = (interval == 0) ? 1 : interval; // защита от ввода 0 137 | GTimer_us::reset(); 138 | _state = true; 139 | _mode = true; 140 | } 141 | void GTimer_us::setTimeout(uint32_t interval) { 142 | setInterval(interval); 143 | _mode = false; 144 | } 145 | void GTimer_us::setMode(uint8_t mode) { 146 | _mode = mode; 147 | } 148 | void GTimer_us::start() { 149 | _state = true; 150 | } 151 | void GTimer_us::stop() { 152 | _state = false; 153 | } 154 | boolean GTimer_us::isReady() { 155 | if (!_state) return false; 156 | uint32_t thisUs = micros(); 157 | if (thisUs - _timer >= _interval) { 158 | if (_mode) { 159 | do { 160 | _timer += _interval; 161 | if (_timer < _interval) break; // переполнение uint32_t 162 | } while (_timer < thisUs - _interval); // защита от пропуска шага 163 | } else { 164 | _state = false; 165 | } 166 | return true; 167 | } else { 168 | return false; 169 | } 170 | } 171 | 172 | void GTimer_us::reset() { 173 | _timer = micros(); 174 | } -------------------------------------------------------------------------------- /src/GyverTimer.h: -------------------------------------------------------------------------------- 1 | /* 2 | GTimer - полноценный таймер на базе системных millis() / micros() 3 | ВНИМАНИЕ, БИБЛИОТЕКА УСТАРЕЛА! ИСПОЛЬЗУЙ TimerMs https://github.com/GyverLibs/TimerMs 4 | Документация: https://alexgyver.ru/gyvertimer/ 5 | GitHub: https://github.com/GyverLibs/GyverTimer 6 | Возможности: 7 | - Миллисекундный и микросекундный таймер 8 | - Два режима работы: 9 | - Режим интервала: таймер "срабатывает" каждый заданный интервал времени 10 | - Режим таймаута: таймер "срабатывает" один раз по истечении времени (до следующего перезапуска) 11 | - Служебные функции: 12 | - Старт 13 | - Стоп 14 | - Сброс 15 | - Продолжить 16 | 17 | AlexGyver, alex@alexgyver.ru 18 | https://alexgyver.ru/ 19 | MIT License 20 | 21 | Версии: 22 | v2.0 - улучшенный алгоритм работы таймера 23 | - Кратные интервалы 24 | - Защита от пропусков 25 | - Защита от переполнения millis() 26 | - Убраны дефайны 27 | v2.1 - возвращены дефайны 28 | v2.2 - улучшена стабильность 29 | v3.0 30 | - Логика работы разделена на интервал и таймаут 31 | - Добавлен общий класс GTimer (для миллисекундного и микросекундного таймера) 32 | - Добавлена возможность остановить и продолжить счёт таймера 33 | v3.2 34 | - Добавлен isEnabled 35 | - Возможность не запускать таймер при создании 36 | */ 37 | 38 | #ifndef GyverTimer_h 39 | #define GyverTimer_h 40 | #include 41 | enum timerType { 42 | US, 43 | MS, 44 | }; 45 | 46 | // ============== GTimer (микросекундный и миллисекундный таймер) ================ 47 | class GTimer { 48 | public: 49 | GTimer(timerType type = MS, uint32_t interval = 0); // объявление таймера с указанием типа и интервала (таймер не запущен, если не указывать) 50 | void setInterval(uint32_t interval); // установка интервала работы таймера (также запустит и сбросит таймер) - режим интервала 51 | void setTimeout(uint32_t timeout); // установка таймаута работы таймера (также запустит и сбросит таймер) - режим таймаута 52 | boolean isReady(); // возвращает true, когда пришло время 53 | boolean isEnabled(); // вернуть состояние таймера (остановлен/запущен) 54 | void reset(); // сброс таймера на установленный период работы 55 | void start(); // запустить/перезапустить (со сбросом счёта) 56 | void stop(); // остановить таймер (без сброса счёта) 57 | void resume(); // продолжить (без сброса счёта) 58 | 59 | // служебное 60 | void setMode(boolean mode); // установка режима работы вручную: AUTO или MANUAL (TIMER_INTERVAL / TIMER_TIMEOUT) 61 | 62 | private: 63 | uint32_t _timer = 0; 64 | uint32_t _interval = 0; 65 | uint32_t _resumeBuffer = 0; 66 | boolean _mode = true; 67 | boolean _state = false; 68 | boolean _type = true; 69 | }; 70 | 71 | #define MANUAL 0 72 | #define AUTO 1 73 | #define TIMER_TIMEOUT 0 74 | #define TIMER_INTERVAL 1 75 | 76 | 77 | // ================================================================================ 78 | // ================== УСТАРЕЛО (но работает, для совместимости) =================== 79 | // ================================================================================ 80 | class GTimer_ms { 81 | public: 82 | GTimer_ms(); // объявление таймера (МИЛЛИСЕКУНДНЫЙ) 83 | GTimer_ms(uint32_t interval); // объявление таймера с указанием интервала 84 | void setInterval(uint32_t interval); // установка интервала работы таймера (также запустит таймер и сбросит период) - режим авто 85 | void setTimeout(uint32_t interval); // установка таймаута работы таймера (также запустит таймер и сбросит период) - режим ручной 86 | void setMode(uint8_t mode); // установка типа работы: AUTO или MANUAL (MANUAL нужно вручную сбрасывать reset или setInterval/setTimeout) 87 | boolean isReady(); // возвращает true, когда пришло время 88 | void reset(); // ручной сброс таймера на установленный период работы 89 | void stop(); // остановить таймер (без сброса счёта) 90 | void start(); // продолжить (без сброса счёта) 91 | 92 | private: 93 | uint32_t _timer = 0; 94 | uint32_t _interval = 1000; 95 | boolean _mode = true; 96 | boolean _state = true; 97 | }; 98 | 99 | class GTimer_us { 100 | public: 101 | GTimer_us(); // объявление таймера (МИКРОСЕКУНДНЫЙ) 102 | GTimer_us(uint32_t interval); // объявление таймера с указанием интервала 103 | void setInterval(uint32_t interval); // установка интервала работы таймера (также запустит таймер и сбросит период) - режим авто 104 | void setTimeout(uint32_t interval); // установка таймаута работы таймера (также запустит таймер и сбросит период) - режим ручной 105 | void setMode(uint8_t mode); // установка типа работы: AUTO или MANUAL (MANUAL нужно вручную сбрасывать reset или setInterval/setTimeout) 106 | boolean isReady(); // возвращает true, когда пришло время 107 | void reset(); // ручной сброс таймера на установленный интервал 108 | void stop(); // остановить таймер (без сброса счёта) 109 | void start(); // продолжить (без сброса счёта) 110 | 111 | private: 112 | uint32_t _timer = 0; 113 | uint32_t _interval = 1000; 114 | boolean _mode = true; 115 | boolean _state = true; 116 | }; 117 | #endif --------------------------------------------------------------------------------