Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/TimeRTCLog

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Учет изменений состояний на контактах с помощью RTC[1]

Это скетч для библиотеки Time и платы Arduino, который демонстрирует, как использовать эту библиотеку, чтобы рассчитывать время, прошедшее с определенного события. В данном случае событиями выступают изменения состояний на шести цифровых контактах платы Arduino.

Код

  1. /*
  2.  
  3. Учет изменений состояний на контактах с помощью RTC
  4.  
  5. Пример, демонстрирующий вычитание и прибавление времени.
  6.  
  7. Этот скетч регистрирует изменения состояний на контактах. 
  8. Время события и время, прошедшее с последнего события,
  9. рассчитываются и отправляются по последовательному порту.
  10.  
  11. */
  12.  
  13. #include <TimeLib.h>
  14. #include <Wire.h>
  15. #include <DS1307RTC.h>  // базовая библиотека DS1307, возвращающая время в типе данных time_t
  16.  
  17. const int nbrInputPins  = 6;             // количество цифровых контактов, за которыми будем наблюдать 
  18. const int inputPins[nbrInputPins] = {2,3,4,5,6,7};  // контакты, за которыми будем наблюдать
  19. boolean state[nbrInputPins] ;            // состояние отслеживаемых контактов
  20. time_t  prevEventTime[nbrInputPins] ;    // время, когда произошло предыдущее событие
  21.  
  22. void setup()  {
  23.   Serial.begin(9600);
  24.   setSyncProvider(RTC.get);   // функция, синхронизирующая время с RTC 
  25.   for(int i=0; i < nbrInputPins; i++){
  26.      pinMode( inputPins[i], INPUT);
  27.      // если вам нужен подтягивающий резистор,
  28.      // раскомментируйте две строчки ниже:
  29.      // pinMode( inputPins[i], INPUT_PULLUP);
  30.      // state[i] = HIGH;
  31.   }
  32. }
  33.  
  34. void loop()
  35. {
  36.    for(int i=0; i < nbrInputPins; i++)
  37.    {
  38.      boolean val = digitalRead(inputPins[i]); 
  39.      if(val != state[i])
  40.      {
  41.         time_t duration = 0; // время, прошедшее с предыдущего события 
  42.         state[i] = val;
  43.         time_t timeNow = now();
  44.         if(prevEventTime[i] > 0)  
  45.            // если это не первое изменение, рассчитываем время, 
  46.            // прошедшее с предыдущего изменения:
  47.            duration = duration = timeNow - prevEventTime[i];         
  48.         logEvent(inputPins[i], val, timeNow, duration );  // регистрируем событие
  49.         prevEventTime[i] = timeNow;                       // сохраняем время этого события
  50.      }
  51.    }
  52. }
  53.  
  54. void logEvent( int pin, boolean state, time_t timeNow, time_t duration)
  55. {
  56.    Serial.print("Pin ");  //  "Контакт " 
  57.    Serial.print(pin);
  58.    if( state == HIGH)
  59.       Serial.print(" went High at ");  //  " перешел в состояние HIGH в "
  60.    else   
  61.      Serial.print(" went  Low at ");  //  " перешел в состояние LOW в "
  62.    showTime(timeNow); 
  63.    if(duration > 0){
  64.      // показываем время только в том случае, если оно больше «0»: 
  65.      Serial.print(", Duration was ");  //  ", Продолжительность была "
  66.      showDuration(duration);
  67.    }
  68.    Serial.println();
  69. }
  70.  
  71.  
  72. void showTime(time_t t){
  73.   // показываем заданное время: 
  74.   Serial.print(hour(t));
  75.   printDigits(minute(t));
  76.   printDigits(second(t));
  77.   Serial.print(" ");
  78.   Serial.print(day(t));
  79.   Serial.print(" ");
  80.   Serial.print(month(t));
  81.   Serial.print(" ");
  82.   Serial.print(year(t)); 
  83. }
  84.  
  85. void printDigits(int digits){
  86.   // вспомогательная функция для печати данных о времени 
  87.   // на монитор порта; добавляет в начале двоеточие и ноль:
  88.   Serial.print(":");
  89.   if(digits < 10)
  90.     Serial.print('0');
  91.   Serial.print(digits);
  92. }
  93.  
  94. void showDuration(time_t duration){
  95. // печатаем продолжительность в днях, минутах и секундах:
  96.   if(duration >= SECS_PER_DAY){
  97.      Serial.print(duration / SECS_PER_DAY);
  98.      Serial.print(" day(s) "); 
  99.      duration = duration % SECS_PER_DAY;     
  100.   }
  101.   if(duration >= SECS_PER_HOUR){
  102.      Serial.print(duration / SECS_PER_HOUR);
  103.      Serial.print(" hour(s) "); 
  104.      duration = duration % SECS_PER_HOUR;     
  105.   }
  106.   if(duration >= SECS_PER_MIN){
  107.      Serial.print(duration / SECS_PER_MIN);
  108.      Serial.print(" minute(s) "); 
  109.      duration = duration % SECS_PER_MIN;     
  110.   }
  111.   Serial.print(duration);
  112.   Serial.print(" second(s) ");   
  113. }

См.также

Внешние ссылки

  1. github.com - TimeRTCLog.ino