Arduino:Примеры/TimeCheck

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

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


Проверка времени[1]

Этот пример для Arduino Yun при помощи библиотеки Bridge извлекает их процессора Linux информацию о времени, а затем разбивает ее на часы, минуты и секунды (для 32U4, другого процессора Arduino). Чтобы время было правильным, Yun должна быть подключена к сети. Если вы для сетевых настроек Yun используете онлайновый WiFi-интерфейс, убедитесь, что выбрали правильную временную зону.

Необходимое оборудование

  • Плата Arduino Yun;
  • Компьютерная сеть, подключенная к интернету;

Цепь

Для этого примера цепи строить не нужно.

Код

Подключаем класс Process.

1 #include <Process.h>

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

1 Process date;        
2 int hours, minutes, seconds;  
3 int lastSecond = -1;

В секции setup() инициализируем Bridge и Serial (последовательную передачу данных). Перед тем, как продолжать скетч, ждем активации последовательного соединения, а затем выводим сообщение на Serial Monitor.

1 void setup() {
2   Bridge.begin();     
3   Serial.begin(9600); 
4 
5   while(!Serial);      
6   Serial.println("Time Check");  // "Проверка времени"

Запускаем предварительный процесс для получения информации о текущем времени, добавляя к команде date параметр «Т».

1 if (!date.running())  {
2     date.begin("date");	
3     date.addParameter("+%T");
4     date.run();
5   }
6 }

В секции loop() проверяем, прошла ли секунда с тех пор, когда мы проверяли время в последний раз. Если прошла, выводим на Serial Monitor текущее время и перезапускаем процесс date, если он остановился.

 1 void loop() {
 2   if(lastSecond != seconds) {  // если прошла секунда
 3     if (hours <= 9) Serial.print("0");    // настраиваем для диапазона 0-9
 4     Serial.print(hours);
 5     Serial.print(":");
 6     if (minutes <= 9) Serial.print("0");  // настраиваем для диапазона 0-9
 7     Serial.print(minutes);
 8     Serial.print(":");
 9     if (seconds <= 9) Serial.print("0");  // настраиваем для диапазона 0-9
10     Serial.println(seconds);
11 
12     if (!date.running())  {
13       date.begin("date");
14       date.addParameter("+%T");
15       date.run();
16     }
17   }

Если процесс date дал какой-нибудь результат, начинаем анализировать эти данные. Во-первых, сохраняем результат (чч:мм:сс) в строку, а затем находим месторасположение символов «:» при помощи функций indexOf() и lastIndexOf().

1 while (date.available()>0) {
2     String timeString = date.readString();    
3 
4     int firstColon = timeString.indexOf(":");
5     int secondColon= timeString.lastIndexOf(":");

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

1 String hourString = timeString.substring(0, firstColon); 
2     String minString = timeString.substring(firstColon+1, secondColon);
3     String secString = timeString.substring(secondColon+1);

Наконец, конвертируем строки в целочисленные переменные и сохраняем прежний секундный результат – для сравнения при следующем проходе через цикл.

1 hours = hourString.toInt();
2     minutes = minString.toInt();
3     lastSecond = seconds;  
4     seconds = secString.toInt();
5   } 
6 }

Весь код полностью – ниже:

 1 /*
 2 Проверка времени 
 3 
 4 При помощи библиотеки Bridge запрашиваем у процессора Linux информацию о времени,
 5 а затем при помощи Arduino Yun разбиваем ее на часы, минуты и секунды.
 6 
 7 Создан 27 мая 2013 года,
 8 модифицирован 21 июня 2013 Томом Иго (Tom Igoe).
 9 
10 Этот код не защищен авторским правом. 
11 
12 */
13 
14 #include <Process.h>
15 
16 Process date;                 // создаем процесс, с помощью которого будем получать информацию о времени 
17 int hours, minutes, seconds;  // переменные для результатов
18 int lastSecond = -1;          // переменная для предыдущего секундного результата (для сравнения при следующем проходе через цикл)
19 
20 void setup() {
21   Bridge.begin();        // инициализируем Bridge
22   Serial.begin(9600);    // инициализируем Serial 
23 
24   while(!Serial);               // ждем открытия Serial Monitor
25   Serial.println("Time Check");  // "Проверка времени" – заголовок скетча
26 
27   // Запускаем предварительный процесс date.
28   // Он должен вернуть результат в следующем формате – чч:мм:сс
29   if (!date.running())  {
30     date.begin("date");
31     date.addParameter("+%T");
32     date.run();
33   }
34 }
35 
36 void loop() {
37 
38   if(lastSecond != seconds) {  // если прошла секунда
39     // Выводим на Serial Monitor результат:
40     if (hours <= 9) Serial.print("0");    // настраиваем для диапазона 0-9
41     Serial.print(hours);    
42     Serial.print(":");
43     if (minutes <= 9) Serial.print("0");  // настраиваем для диапазона 0-9
44     Serial.print(minutes);
45     Serial.print(":");
46     if (seconds <= 9) Serial.print("0");  // настраиваем для диапазона 0-9
47     Serial.println(seconds);
48 
49     // Перезапускаем процесс «date»:
50     if (!date.running())  {
51       date.begin("date");
52       date.addParameter("+%T");
53       date.run();
54     }
55   }
56 
57   // Если процесс «date» дал какой-нибудь результат, начинаем его анализировать:
58   while (date.available()>0) {
59     // Берем этот результат (он должен быть в формате «чч:мм:чч»):
60     String timeString = date.readString();    
61 
62     // Ищем двоеточия:
63     int firstColon = timeString.indexOf(":");
64     int secondColon= timeString.lastIndexOf(":");
65 
66     // Делим результат на три подстроки – с часами, минутами и секундами:
67     String hourString = timeString.substring(0, firstColon); 
68     String minString = timeString.substring(firstColon+1, secondColon);
69     String secString = timeString.substring(secondColon+1);
70 
71     // Конвертируем в целочисленные переменные, сохраняем предыдущий секундный результат:
72     hours = hourString.toInt();
73     minutes = minString.toInt();
74     lastSecond = seconds;          // сохраняем его, чтобы было с чем сравнить в следующий раз
75     seconds = secString.toInt();
76   } 
77 
78 }

См.также

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