Arduino:Примеры/TimeRTCLog

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

Перевод: Максим Кузьмин (Cubewriter) Перевел 364226 статей для сайта.</br>Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Учет изменений состояний на контактах с помощью 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 }

См.также

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