Arduino:Примеры/TimeCheck: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
м (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
 
Нет описания правки
Строка 20: Строка 20:
Подключаем класс '''Process'''.
Подключаем класс '''Process'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
#include <Process.h>
#include <Process.h>
</syntaxhighlight>
</syntaxhighlight>
Строка 26: Строка 26:
Создаем экземпляр класса '''Process''', при помощи которого будем получать информацию о времени, а также переменные, в которых будет храниться информация о часах, минутах и секундах. Также создаем переменную, в которой будем хранить предыдущий секундный результат. Инициализируем ее значением, которое никак не сможет быть временем (например, каким-нибудь отрицательным числом).
Создаем экземпляр класса '''Process''', при помощи которого будем получать информацию о времени, а также переменные, в которых будет храниться информация о часах, минутах и секундах. Также создаем переменную, в которой будем хранить предыдущий секундный результат. Инициализируем ее значением, которое никак не сможет быть временем (например, каким-нибудь отрицательным числом).


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
Process date;         
Process date;         
int hours, minutes, seconds;   
int hours, minutes, seconds;   
Строка 34: Строка 34:
В секции setup() инициализируем '''Bridge''' и '''Serial''' (последовательную передачу данных). Перед тем, как продолжать скетч, ждем активации последовательного соединения, а затем выводим сообщение на '''Serial Monitor'''.
В секции setup() инициализируем '''Bridge''' и '''Serial''' (последовательную передачу данных). Перед тем, как продолжать скетч, ждем активации последовательного соединения, а затем выводим сообщение на '''Serial Monitor'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
void setup() {
void setup() {
   Bridge.begin();     
   Bridge.begin();     
Строка 45: Строка 45:
Запускаем предварительный процесс для получения информации о текущем времени, добавляя к команде '''date''' параметр '''«Т»'''.
Запускаем предварительный процесс для получения информации о текущем времени, добавляя к команде '''date''' параметр '''«Т»'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
if (!date.running())  {
if (!date.running())  {
     date.begin("date");
     date.begin("date");
Строка 56: Строка 56:
В секции loop() проверяем, прошла ли секунда с тех пор, когда мы проверяли время в последний раз. Если прошла, выводим на '''Serial Monitor''' текущее время и перезапускаем процесс '''date''', если он остановился.
В секции loop() проверяем, прошла ли секунда с тех пор, когда мы проверяли время в последний раз. Если прошла, выводим на '''Serial Monitor''' текущее время и перезапускаем процесс '''date''', если он остановился.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
void loop() {
void loop() {
   if(lastSecond != seconds) {  // если прошла секунда
   if(lastSecond != seconds) {  // если прошла секунда
Строка 78: Строка 78:
Если процесс '''date''' дал какой-нибудь результат, начинаем анализировать эти данные. Во-первых, сохраняем результат ('''чч:мм:сс''') в строку, а затем находим месторасположение символов «:» при помощи функций indexOf() и lastIndexOf().
Если процесс '''date''' дал какой-нибудь результат, начинаем анализировать эти данные. Во-первых, сохраняем результат ('''чч:мм:сс''') в строку, а затем находим месторасположение символов «:» при помощи функций indexOf() и lastIndexOf().


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
while (date.available()>0) {
while (date.available()>0) {
     String timeString = date.readString();     
     String timeString = date.readString();     
Строка 88: Строка 88:
Зная позиции, на которых находятся двоеточия, можно разделить строку на отдельные подстроки с часами, минутами и секундами.
Зная позиции, на которых находятся двоеточия, можно разделить строку на отдельные подстроки с часами, минутами и секундами.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
String hourString = timeString.substring(0, firstColon);  
String hourString = timeString.substring(0, firstColon);  
     String minString = timeString.substring(firstColon+1, secondColon);
     String minString = timeString.substring(firstColon+1, secondColon);
Строка 96: Строка 96:
Наконец, конвертируем строки в целочисленные переменные и сохраняем прежний секундный результат – для сравнения при следующем проходе через цикл.
Наконец, конвертируем строки в целочисленные переменные и сохраняем прежний секундный результат – для сравнения при следующем проходе через цикл.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
hours = hourString.toInt();
hours = hourString.toInt();
     minutes = minString.toInt();
     minutes = minString.toInt();
Строка 107: Строка 107:
Весь код полностью – ниже:
Весь код полностью – ниже:


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
/*
/*
Проверка времени  
Проверка времени  

Версия от 18:20, 14 мая 2023

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


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

}

См.также

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