Arduino:Примеры/TimeRTCLog
Перейти к навигации
Перейти к поиску
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин (Cubewriter) Контакты:</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 }
См.также
Внешние ссылки