Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/TimeCheck

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Проверка времени[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. }

См.также

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

  1. Arduino - Time Check