Arduino:Примеры/TimeRTCLog

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

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


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

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

Код

/*

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

Пример, демонстрирующий вычитание и прибавление времени.

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

*/

#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>  // базовая библиотека DS1307, возвращающая время в типе данных time_t

const int nbrInputPins  = 6;             // количество цифровых контактов, за которыми будем наблюдать 
const int inputPins[nbrInputPins] = {2,3,4,5,6,7};  // контакты, за которыми будем наблюдать
boolean state[nbrInputPins] ;            // состояние отслеживаемых контактов
time_t  prevEventTime[nbrInputPins] ;    // время, когда произошло предыдущее событие

void setup()  {
  Serial.begin(9600);
  setSyncProvider(RTC.get);   // функция, синхронизирующая время с RTC 
  for(int i=0; i < nbrInputPins; i++){
     pinMode( inputPins[i], INPUT);
     // если вам нужен подтягивающий резистор,
     // раскомментируйте две строчки ниже:
     // pinMode( inputPins[i], INPUT_PULLUP);
     // state[i] = HIGH;
  }
}

void loop()
{
   for(int i=0; i < nbrInputPins; i++)
   {
     boolean val = digitalRead(inputPins[i]); 
     if(val != state[i])
     {
        time_t duration = 0; // время, прошедшее с предыдущего события 
        state[i] = val;
        time_t timeNow = now();
        if(prevEventTime[i] > 0)  
           // если это не первое изменение, рассчитываем время, 
           // прошедшее с предыдущего изменения:
           duration = duration = timeNow - prevEventTime[i];         
        logEvent(inputPins[i], val, timeNow, duration );  // регистрируем событие
        prevEventTime[i] = timeNow;                       // сохраняем время этого события
     }
   }
}

void logEvent( int pin, boolean state, time_t timeNow, time_t duration)
{
   Serial.print("Pin ");  //  "Контакт " 
   Serial.print(pin);
   if( state == HIGH)
      Serial.print(" went High at ");  //  " перешел в состояние HIGH в "
   else   
     Serial.print(" went  Low at ");  //  " перешел в состояние LOW в "
   showTime(timeNow); 
   if(duration > 0){
     // показываем время только в том случае, если оно больше «0»: 
     Serial.print(", Duration was ");  //  ", Продолжительность была "
     showDuration(duration);
   }
   Serial.println();
}


void showTime(time_t t){
  // показываем заданное время: 
  Serial.print(hour(t));
  printDigits(minute(t));
  printDigits(second(t));
  Serial.print(" ");
  Serial.print(day(t));
  Serial.print(" ");
  Serial.print(month(t));
  Serial.print(" ");
  Serial.print(year(t)); 
}

void printDigits(int digits){
  // вспомогательная функция для печати данных о времени 
  // на монитор порта; добавляет в начале двоеточие и ноль:
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

void showDuration(time_t duration){
// печатаем продолжительность в днях, минутах и секундах:
  if(duration >= SECS_PER_DAY){
     Serial.print(duration / SECS_PER_DAY);
     Serial.print(" day(s) "); 
     duration = duration % SECS_PER_DAY;     
  }
  if(duration >= SECS_PER_HOUR){
     Serial.print(duration / SECS_PER_HOUR);
     Serial.print(" hour(s) "); 
     duration = duration % SECS_PER_HOUR;     
  }
  if(duration >= SECS_PER_MIN){
     Serial.print(duration / SECS_PER_MIN);
     Serial.print(" minute(s) "); 
     duration = duration % SECS_PER_MIN;     
  }
  Serial.print(duration);
  Serial.print(" second(s) ");   
}

См.также

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