Arduino:Примеры/TimeCheck: различия между версиями
Myagkij (обсуждение | вклад) м (Замена текста — «<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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/* | /* | ||
Проверка времени | Проверка времени |
Версия от 18:20, 14 мая 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Проверка времени[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();
}
}