Функция для вывода времени работы Arduino

Данная функция выводит в последовательный порт время работы платы Arduino после включения или перезагрузки в формате ЧАСЫ:МИНУТЫ:СЕКУНДЫ 00:00:00


ВСТУПЛЕНИЕ

Что такое функция millis() ?

Время работы Arduino ничем не ограничено. Этот микроконтроллер может быть включен постоянно.
Для подсчета времени с момента включения или c момента перезагрузки платы существует функция millis() .
Arduino считает количество миллисекунд, которое прошло с момента  запуска платы.
Их количество можно узнать с помощью функции millis().

Например, пусть у нас есть переменная time. В случае использования строки кода time=millis();   ,  переменная time будет содержать некоторое количество миллисекунд.
В одной секунде содержится 1000 миллисекунд, поэтому время измеряемое в миллисекундах неудобно для восприятия человеком, но вполне понятно машинам, роботам и микросхемам.
После 50 суток работы Arduino встроенный счетчик миллисекунд обнуляется и начинает отсчет снова.


Ниже приводится код функции TimePrint, которая переводит миллисекунды в понятный человеку формат.

// RobotDay.ru TimePrint Function
void TimePrint()
{
int time=millis()/1000;
if (time/60/60<10) { Serial.print ("0"); }
Serial.print (time/60/60);
Serial.print (":");
if (time/60%60<10) { Serial.print ("0"); }
Serial.print ((time/60)%60);
Serial.print (":");
if (time%60<10) { Serial.print ("0"); }
Serial.println (time%60);
}

Данная функция выводит в последовательный порт время работы платы Arduino после включения или перезагрузки в формате часы:минуты:секунды ( 00:00:00 ).
Вызывается в вашем коде, как TimePrint();
Использует встроенную функцию millis(). Обратите внимание, что счетчик функции millis() сбрасывается после 50 дней работы.
Полезна для отладки и тестирования различных датчиков и сенсоров.

Логика расчета секунд, минут и часов при пересчете из миллисекунд.
Как пересчитывать секунды, минуты, часы и дни в Arduino.

Чтобы узнать общее количество секунд, значение функции millis() необходимо разделить на 1000.
Чтобы количество секунд перевести в минуты, делим их значение на 60. Остаток от целочисленного деления – точные секунды ( от 0 до 59 ).
Чтобы количество минут перевести в часы, делим их значение на 60. Остаток от целочисленного деления – точные минуты ( от 0 до 59 ).
Таким образом получаем значение времени работы платы Arduino в обычном понятном формате.

В данной программе расчет идет несколько в другом порядке.

Переводим в секунды, теперь их значение содержит переменная time.

time=millis()/1000

Далее сразу считаем целые часы и выводим их значение в последовательны порт.

if (time/60/60<10) { Serial.print ("0"); }
Serial.print (time/60/60);
Serial.print (":");

Затем высчитываем целые минуты, их остаток уже за вычетом целых часов.

if (time/60%60<10) { Serial.print ("0"); }
Serial.print ((time/60)%60);
Serial.print (":");

И высчитываем секунды.

if (time%60<10) { Serial.print ("0"); }
Serial.println (time%60);

Время с момента включения Ардуино будет выглядеть следующим образом, например : 05:42:14
Чтобы перевести время в число необходимо выполнить обратную операцию.
Таким образом, вывод времени на Ардуино будет осуществляться в удобном формате.

Это пример классического программирования функции millis(), при использовании классов и объектов (классы и объекты в Arduino)  код можно оптимизировать.

Функция millis() позволяет собрать на Ардуино простейший секундомер, счетчик времени, с использованием тактовых кнопок и семисегментных индикаторов, светодиодов.

Использовать функцию millis() и семисегментный индикатор, чтобы сделать цифровые часы, не рекомендуется, так как для этого нужно использовать более точные часы реального времени.

RTC ( Real Time Clock ) – эти микросхемы имеют собственный элемент питания, не зависят от выключения и перезагрузок платы Ардуино, позволяют отслеживать и время и дату.

Например, можно использовать плату DS1302 Real Time Clock.

Модули часов реального времени производятся на нескольких популярных микросхемах.

Обсуждение на форуме.


Comments

15 responses to “Функция для вывода времени работы Arduino”

  1. […] Со временем в этой плате обычно работает функция millis(). Если функционала millis() недостаточно, необходимо […]

  2. Режим работы 13 пина в качестве цифрового выхода мы устанавливаем всего один раз и сколько уходит на это времени нас мало интересует.

    1. Пушкин Блэйд avatar
      Пушкин Блэйд

      Пацаны, на ник Арины не жмите, там спам – ссылка. Поэтому она чушь и пишет.

  3. Вполне логично было использовать int для этой схемы, ведь редко кто считает больше, чем до 9 часов!

  4. Новичок avatar
    Новичок

    Помогите пожалуйста новичку. Что нужно добавить к коду чтоб он считал и дни. Спасибо

    1. Я сделал так, только тут не в сериал выводится, а возвращается в переменную:

      // TimeCovert Function
      String TimeCovert(uint32_t lasttime)
      {
      lastStartTime=””;
      uint8_t lasthour = lasttime/86400000;
      if (lasttime > 86400000) {
      lastStartTime = lastStartTime + lasthour + ” дней “;
      lasttime = lasttime – (86400000*lasthour);
      }
      int time=lasttime/1000;
      if (time/60/60<10) { lastStartTime = lastStartTime + "0"; }
      lastStartTime = lastStartTime + (time/60/60);
      lastStartTime = lastStartTime + ":";
      if (time/60%60<10) { lastStartTime = lastStartTime + "0"; }
      lastStartTime = lastStartTime + ((time/60)%60);
      lastStartTime = lastStartTime + ":";
      if (time%60<10) { lastStartTime = lastStartTime + "0"; }
      lastStartTime = lastStartTime + (time%60);
      return lastStartTime;
      }

      1. Rebus Scolokovo avatar
        Rebus Scolokovo

        Сложновато, Сергей. IMHO

    2. Rebus Scolokovo avatar
      Rebus Scolokovo

      1. Все часы делим на 24 = количество дней.
      2. Остаток от целочисленного деления (все часы) % 24 = количество часов.

  5. Учащийся Паша avatar
    Учащийся Паша

    Скажите (точнее напишите, если не в тягость) как реализовать этот секундомер с выводом на ЖКИ 1602, ,без вывода в порт, мне пока неясно, я только учусь. Заранее благодарю. Павлик.

    1. Ростислав avatar
      Ростислав

      Заменяешь в коде все Serial на название которое ты давал классу
      LiquidCrystal это_название(-, -, -, -, -, -);

  6. kkirrrillll avatar
    kkirrrillll

    Как сделать чтобы вывод шёл в одну строку?

  7. Василий avatar
    Василий

    Код считает до 9 часов, а после уходит в минус с обратным отсчетом до нуля , подскажите пожалуйста, как можно исправить это, что бы могло считать хотя бы 3-5 дней, заранее благодарен

    1.  avatar

      Неверно определен тип данных переменной time. Правильно так:
      unsigned long time = millis() / 1000;

  8.  avatar

    sd

  9. николай avatar
    николай

    Подскажите, Как ставить на паузу секундомер, и запускать дальше скажем по высокому уровню на пине 13

Leave a Reply

Your email address will not be published. Required fields are marked *