Задержка в ARDUINO без delay(), с проверкой millis() на переполнение.

В этом посте вы можете скачать маленькую библиотеку для ARDUINO в которой реализован таймер для создания задержки в ARDUINO без delay() с проверкой millis() на переполнение.


В необходимости реализации задержки без delay сомнений нет, т.к. останавливать работу всего устройства для ожидания чего-либо это не корректно. Можно конечно копипастить в каждый скетч одну и ту же функцию, но реализация задержки с помощью объекта гораздо проще.


Нужен ли видеокомментарий по пользованию библиотекой Timer?

Просмотреть результаты

Загрузка ... Загрузка ...

Библиотека для создания таймера задержки без delay()

Описание библиотеки можно посмотреть здесь: Задержка в ARDUINO без delay()

Текущая версия: 0.0.1 / 2018.10.31
Предыдущие версии:

Size: 3 kB
Version: 0.0.1


Файлы библиотеки:


Timer.h


  1. #ifndef Timer_h
  2. #define Timer_h
  3.  
  4. #include "Arduino.h"
  5. class Timer {
  6. public:
  7.     Timer();                            //конструктор по-умолчанию
  8.     Timer(uint32_t delayTime);          //конструктор №1, принимает время задержки в мс
  9.     void delay();                       //выполняет задержку, результат сохраняет в _status
  10.     void start();                       //запускает таймер
  11.     void stop ();                       //останавливает таймер, с сохранением оставшегося времени задержки
  12.     void reset ();                      //подготавливает таймер к запуску, восстанавливая время задержки
  13.     void setTime(uint32_t delayTime);   //изменяет время задержки
  14.     uint32_t getTime ();                //возвращает установленное время задержки
  15.     uint8_t getStatus ();               //возвращает статус таймера (см ниже _status)
  16.  
  17. protected:
  18.     uint8_t _status;                    //хранит статус таймера в текущий момент
  19.         /* [_status]
  20.         0 // таймер готов к запуску
  21.         1 // таймер запущен
  22.         2 // задержка закончена
  23.         3 // таймер остановлен
  24.         */
  25.     uint32_t _delayTime;                //хранит время задержки
  26.  
  27. private:
  28.     uint32_t _timeStore;                //хранит millis()
  29.     uint32_t _delayTimeBuffer;          //буфер для работы с временем задержки
  30. };
  31. #endif

Timer.cpp


  1. #include "Arduino.h"
  2. #include "Timer.h"
  3. #define LOG
  4. Timer::Timer(){
  5. _delayTime = 0;
  6. _status = 0;
  7. };
  8. Timer::Timer(uint32_t delayTime){
  9. _delayTime = delayTime;
  10. _status = 0;
  11. };
  12. void Timer::delay(){
  13.     if(this->_status == 1){
  14. #ifndef LOG
  15. Serial.print(F("."));
  16. #endif
  17.          if (millis() < _timeStore){
  18.             if(millis() + 4294967295 - _timeStore >  _delayTimeBuffer) {
  19.                     _status = 2;
  20. #ifndef LOG
  21. Serial.println();
  22. Serial.println(F("Delay is over"));
  23. #endif
  24.                     }
  25.          }
  26.          else{
  27.              if(millis () > _timeStore + _delayTimeBuffer) {
  28.                     _status = 2;
  29. #ifndef LOG
  30. Serial.println();
  31. Serial.println(F("Delay is over"));
  32. #endif
  33.                     }
  34.          }
  35.     }
  36. };
  37. void Timer::start(){
  38.     if ((_status == 0) || (_status == 3)){
  39. #ifndef LOG
  40. Serial.print(F("Timer::start "));
  41. if (_status == 0) Serial.println(F("NEW"));
  42. else if (_status == 3) Serial.println(F("OLD"));
  43. #endif
  44.         _status = 1;
  45.         _timeStore = millis();
  46.     }
  47. };
  48. void Timer::stop(){
  49.     _status = 3;
  50.     if (millis() < _timeStore){ _delayTimeBuffer = _delayTimeBuffer - (millis() + 4294967295 - _timeStore); }
  51.     else{_delayTimeBuffer = _delayTimeBuffer - (millis() - _timeStore);}
  52. #ifndef LOG
  53. Serial.println(F("Timer::stop"));
  54. #endif
  55. };
  56. void Timer::reset(){
  57. #ifndef LOG
  58. Serial.println(F("Timer::reset"));
  59. #endif
  60.     _status = 0;
  61.     _delayTimeBuffer = _delayTime;
  62. }
  63. void Timer::setTime(uint32_t delayTime){_delayTime = delayTime;};
  64. uint32_t Timer::getTime (){return _delayTime;};
  65. uint8_t Timer::getStatus(){return _status;};

Комментарий по работе:
После создания объекта с помощью конструктора по-умолчанию необходимо указать время задержки с помощью метода setTime(). Если объект создавался с помощью 1 конструктора, то таймер сразу готов к работе (_status = 0). Далее необходимо выполнить метод start(), который по сути является триггером для метода delay(), он устанавливает _status в 1. Теперь крутим delay() и контролируем состояние свойства _status с помощью метода getStatus(). Как только он станет равным 2 delay() выполняться перестает, что свидетельствует об окончании задержки.
Предусмотрена возножность остановки таймера с помощью метода stop(), с сохранением оставшегося времени задержки и возможности дальнейшего запуска методом start(). После окончания задержки таймер необходимо “взвести” методом reset(), после этого его можно использовать снова.
Предусмотрен небольшой лог, для его отображения в Serial в файле Timer.cpp закомментируйте строку #define LOG.


Скетч для проверки:


  1. #include <Timer.h>
  2. Timer t(5000); // создаем объект таймер с задержкой 5 сек
  3. void setup() {
  4.   Serial.begin(9600);
  5. }
  6.  
  7. void loop() {
  8.   t.delay();  //крутим в цикле функцию задержки
  9.   if (t.getStatus() == 2) Serial.println(F("BINGO!")); //проверяем значение свойства _status 
  10.   test();
  11. }
  12. void test() {
  13.   if (Serial.available()) {
  14.     byte symbol = Serial.read();
  15.     if (symbol == '0') {
  16.       Serial.println(F("0 pressed"));
  17.       t.reset(); // взвод таймера
  18.     }
  19.     else  if (symbol == '1') {
  20.       Serial.println(F("1 pressed"));
  21.       t.stop(); // остановка таймера
  22.     }
  23.     else  if (symbol == '2') {
  24.       Serial.println(F("2 pressed"));
  25.       t.start(); // старт таймера
  26.     }
  27.     else  if (symbol == '3') {
  28.       Serial.println(F("3 pressed"));
  29.       t.setTime(3000); // установка времени задержки
  30.     }
  31.   }
  32. }

Оцените пожалуйста статью:

ПечальноТак себеНе плохоХорошоОтличная статья! (Пока оценок нет)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *