Arduino:Примеры/TimeCheck

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</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.

#include <Process.h>

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

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

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

void setup() {
  Bridge.begin();     
  Serial.begin(9600); 

  while(!Serial);      
  Serial.println("Time Check");  // "Проверка времени"

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

if (!date.running())  {
    date.begin("date");	
    date.addParameter("+%T");
    date.run();
  }
}

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

void loop() {
  if(lastSecond != seconds) {  // если прошла секунда
    if (hours <= 9) Serial.print("0");    // настраиваем для диапазона 0-9
    Serial.print(hours);
    Serial.print(":");
    if (minutes <= 9) Serial.print("0");  // настраиваем для диапазона 0-9
    Serial.print(minutes);
    Serial.print(":");
    if (seconds <= 9) Serial.print("0");  // настраиваем для диапазона 0-9
    Serial.println(seconds);

    if (!date.running())  {
      date.begin("date");
      date.addParameter("+%T");
      date.run();
    }
  }

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

while (date.available()>0) {
    String timeString = date.readString();    

    int firstColon = timeString.indexOf(":");
    int secondColon= timeString.lastIndexOf(":");

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

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

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

hours = hourString.toInt();
    minutes = minString.toInt();
    lastSecond = seconds;  
    seconds = secString.toInt();
  } 
}

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

/*
Проверка времени 

При помощи библиотеки Bridge запрашиваем у процессора Linux информацию о времени,
а затем при помощи Arduino Yun разбиваем ее на часы, минуты и секунды.

Создан 27 мая 2013 года,
модифицирован 21 июня 2013 Томом Иго (Tom Igoe).

Этот код не защищен авторским правом. 

*/

#include <Process.h>

Process date;                 // создаем процесс, с помощью которого будем получать информацию о времени 
int hours, minutes, seconds;  // переменные для результатов
int lastSecond = -1;          // переменная для предыдущего секундного результата (для сравнения при следующем проходе через цикл)

void setup() {
  Bridge.begin();        // инициализируем Bridge
  Serial.begin(9600);    // инициализируем Serial 

  while(!Serial);               // ждем открытия Serial Monitor
  Serial.println("Time Check");  // "Проверка времени" – заголовок скетча

  // Запускаем предварительный процесс date.
  // Он должен вернуть результат в следующем формате – чч:мм:сс
  if (!date.running())  {
    date.begin("date");
    date.addParameter("+%T");
    date.run();
  }
}

void loop() {

  if(lastSecond != seconds) {  // если прошла секунда
    // Выводим на Serial Monitor результат:
    if (hours <= 9) Serial.print("0");    // настраиваем для диапазона 0-9
    Serial.print(hours);    
    Serial.print(":");
    if (minutes <= 9) Serial.print("0");  // настраиваем для диапазона 0-9
    Serial.print(minutes);
    Serial.print(":");
    if (seconds <= 9) Serial.print("0");  // настраиваем для диапазона 0-9
    Serial.println(seconds);

    // Перезапускаем процесс «date»:
    if (!date.running())  {
      date.begin("date");
      date.addParameter("+%T");
      date.run();
    }
  }

  // Если процесс «date» дал какой-нибудь результат, начинаем его анализировать:
  while (date.available()>0) {
    // Берем этот результат (он должен быть в формате «чч:мм:чч»):
    String timeString = date.readString();    

    // Ищем двоеточия:
    int firstColon = timeString.indexOf(":");
    int secondColon= timeString.lastIndexOf(":");

    // Делим результат на три подстроки – с часами, минутами и секундами:
    String hourString = timeString.substring(0, firstColon); 
    String minString = timeString.substring(firstColon+1, secondColon);
    String secString = timeString.substring(secondColon+1);

    // Конвертируем в целочисленные переменные, сохраняем предыдущий секундный результат:
    hours = hourString.toInt();
    minutes = minString.toInt();
    lastSecond = seconds;          // сохраняем его, чтобы было с чем сравнить в следующий раз
    seconds = secString.toInt();
  } 

}

См.также

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