Форум сайта mypractic.ru
Измерение времени выполнения функций и команд Ардуино.
Вопросы программирования в системе Ардуино
6 сообщений • Страница 1 из 1
Эдуард Администратор Сообщения: 482 Зарегистрирован: 30 окт 2016, 20:53
Измерение времени выполнения функций и команд Ардуино.
Сообщение Эдуард » 03 дек 2016, 18:26
При программировании реальных задач на контроллерах Ардуино важно знать время выполнения как стандартных функций Ардуино, так и отдельных программных блоков.
-
— точность измерения времени составляет 0,0625 мкс;
— максимальная длительность выполнения программного блока 4095 мкс.
Для измерения необходимо загрузить в плату скетч программы.
// определение времени выполнения программного блока Ардуино
unsigned int timerValue; // значение таймера
void setup() Serial.begin(9600); // инициализируем последовательный порт, скорость 9600
// установки таймера 1
TCCR1A = 0;
TCCR1B = 0;
>
void loop() noInterrupts(); // запрет прерываний
TCNT1H = 0; // сброс таймера
TCNT1L = 0;
TCCR1B = 1; // разрешение работы таймера
// ———- исследуемый программный блок ———
TCCR1B = 0; // остановка таймера
timerValue = (unsigned int)TCNT1L | ((unsigned int)TCNT1H interrupts(); // разрешение прерываний
// вывод на компьютер
Serial.print( (float)(timerValue — 2) * 0.0625);
Serial.println(» mks»);
delay(500);
>
Исследуемая функция или программный блок размещаются в коде программы, в место выделенное таким образом.
Все. Остается запустить монитор последовательного порта. Программа в цикле выводит время выполнения блока или функции.
-
— Устанавливает таймер 1 на максимальную частоту тактирования 16 мГц.
— Запрещает прерывания.
— Разрешает работу таймера.
— Запускает исследуемый блок.
— После окончания его работы останавливает таймер.
— Считывает значение таймера, пересчитывает его в мкс и выводит в последовательный порт.
Время выполнения стандартных функций Ардуино.
Я провел небольшое исследование стандартных функций Ардуино и получил следующие результаты.
| Функция | Время выполнения |
| digitalWrite() | 3.19 мкс |
| digitalRead() | 2.75 мкс |
| pinMode() | 2.44 мкс |
| analogRead() | 105.31 – 113.12 мкс |
| analogWrite() | 3.69 мкс |
Программа измеряет время выполнения программных блоков, не использующих прерывания. Поэтому измерение времени выполнения функции delay(), Serial.print() и т.п. даст не правильный результат.
Настойчиво рекомендую в приложениях с ограниченным временем производить оптимизацию вычислений. Особенно в вычислениях с плавающей запятой. Я затронул эту тему в уроке 13.
Эта программа достаточно удобный и универсальный инструмент для оптимизации кода по времени выполнения.
Эдуард Администратор Сообщения: 482 Зарегистрирован: 30 окт 2016, 20:53
Re: Измерение времени выполнения функций и команд Ардуино.
Сообщение Эдуард » 04 янв 2017, 19:28
При разработке Ардуино контроллера элемента Пельтье для управления LCD индикатором я использовал библиотеку LiquidCrystal.h . В программе несколько параллельных процессов с фиксированным временем циклов. Никакой цикл нельзя приостанавливать, задерживать.
Функции библиотеки достаточно сложные. Сколько времени они требуют на выполнение не понятно. Информации об этом нет. Пришлось выяснять самому.
Я измерил время выполнения функций библиотеки LiquidCrystal.h и результаты свел в таблицу.
| Назначение | Функция | Время выполнения |
| Инициализация дисплея | displ.begin(8, 1); | 1406 мкс |
| Вывод текстовой строки (1 символ) | displ.print(«A»); | 287 мкс |
| Вывод текстовой строки (8 символов) | displ.print(«01234567»); | 2264 мкс |
| Очистка экрана | displ.clear(); | 2280 мкс |
| Курсор в начало экрана | displ.home(); | 2280 мкс |
| Вывод байта (char) на экран | displ.write(cc); | 281 мкс |
| Вывод числа int на экран | displ.print(dd); | 1610 мкс |
БлудныйКот Сообщения: 45 Зарегистрирован: 29 дек 2016, 16:19
Re: Измерение времени выполнения функций и команд Ардуино.
Сообщение БлудныйКот » 04 мар 2017, 12:49
Еще возник вопрос по теме,
сколько тактов процессора занимает сдвиг на 2,4,8,16 ?
И где это если не секрет можно посмотреть?
Эдуард Администратор Сообщения: 482 Зарегистрирован: 30 окт 2016, 20:53
Re: Измерение времени выполнения функций и команд Ардуино.
Сообщение Эдуард » 04 мар 2017, 16:11
unsigned int timerValue; // значение таймера
volatile int x=0xaaaa;
volatile int y;
void setup() Serial.begin(9600); // инициализируем последовательный порт, скорость 9600
// установки таймера 1
TCCR1A = 0;
TCCR1B = 0;
>
void loop() noInterrupts(); // запрет прерываний
TCNT1H = 0; // сброс таймера
TCNT1L = 0;
TCCR1B = 1; // разрешение работы таймера
// ———- исследуемый программный блок ———
y= x >> 2;
TCCR1B = 0; // остановка таймера
timerValue = (unsigned int)TCNT1L | ((unsigned int)TCNT1H interrupts(); // разрешение прерываний
// вывод на компьютер
Serial.print( (float)(timerValue — 2) * 0.0625);
Serial.println(» mks»);
delay(500);
>
-
0,75 мкс для y= x >> 2;
1,75 мкс для y= x >> 4;
0,69 мкс для y= x >> 8;
0,69 мкс для y= x >> 16.
Часы реального времени (RTC) и Arduino

Часы реального времени (Real Time Clock, RTC) — это электронная схема, специально предназначенная для учета текущего времени, даты, дня недели и прочих временных и календарных данных. Широко используются в системах регистрации данных, при создании электронных часов, будильников, таймеров, управляющих устройств, работающих по расписанию. Как правило, такая схема, помимо учитывающего устройства включает и автономный источник питания, чтобы продолжать работать даже при выключении основной системы. Часы реального времени ведут учет в единицах измерения времени, более привычных человеку (часы, минуты, годы и пр.), в отличие от тактовых генераторов и счетчиков, которые создают и считают просто «тики». Можно сказать, что часы реального времени — это тактовый генератор, специально предназначенный для отсчета времени.
Зачастую, микроконтроллеры, включая и Arduino, имеют функции для хранения времени, такие как millis () и имеют аппаратные таймеры, которые могут отслеживать более длительные временные интервалы, например, минуты и дни. Так зачем же нужны отдельные схемы часов реального времени?
Основная причина кроется в том, что millis () отслеживает время, прошедшее с момента последнего включения Arduino, при включении таймер миллисекунд устанавливается в ноль. Arduino не знает «вторник» сегодня или «23 февраля», все что ему известно, так это то, что с момента последнего включения прошло, например, 14763 миллисекунды.
Что если мы захотим установить время на Arduino? В программе нужно было бы задать некоторую точку отсчета, относительно которой бы считать время и даты. Но при отключении питания время бы сбросилось. Именно это и происходит в недорогих моделях будильников, когда при отключении питания начинает мигать «12:00». Для каких-то задач это вполне приемлемо, но в некоторых случаях важно продолжать отсчет времени, даже если питание пропадает. Вот в этом случае на помощь и приходят специализированные микросхемы RTC, имеющие автономный источник питания.
Большинство схем часов реального времени использует кварцевый резонатор, работающий на частоте 32768 Гц. 32768 = 2 15 тактов в секунду, что очень удобно для простых двоичных счётчиков.
Многие производители выпускают собственные микросхемы часов реального времени. Среди них Texas Instruments, Dallas Semocinductor, STMicroelectronics, Intersil, Maxim, Philips. Достаточно популярными являются микросхемы DS1307 от Dallas Semiconductor и ее полный, но более дешевый аналог M41T56 от STMicroelectronics. Также широко используется микросхема DS3231, которая имеет встроенный кварц и термостабилизацию, что позволяет получить повышенную точность в сравнении с DS1307. С точки зрения программиста, отличие между ними — это разные адреса и назначение битов в Control register. Так что, если изменения в программе если и придется вносить, то совсем незначительные.
Я некоторое время назад приобрел модуль MP1095 производства «Мастер Кит», основанный на микросхеме M41T56M6, поэтому я свои эксперименты буду проводить, используя именно этот модуль. Он полностью совместим с устройствами, в основе которых лежит DS1307, что позволяет использовать популярные библиотеки часов реального времени для последнего.
Принципиальная схема модуля MP1095:

В качестве автономного источника питания используется литиевая батарейка типа CR2032. Почта Китая запретила к пересылке литиевые элементы питания, поэтому при покупках каких-либо модулей часов реального времени в китайских интернет-магазинах вы не обнаружите их в комплекте. Но это совсем небольшая проблема. «Мастер Кит» — компания российская и батарейка в комплекте шла.
Микросхема M41T56
Микросхема M41T56 представляет собой часы реального времени, с последовательным интерфейсом I 2 C и низким энергопотреблением с 56 байтами энергонезависимой памяти. Встроенный генератор с частотой 32768 Гц (или же внешний стабилизированный кварцевый) и первые 8 байт ОЗУ используются для временных/календарных функций. Конфигурирование осуществляется в двоично-десятичном формате. Адреса и данные передаются последовательно по двухпроводной двунаправленной шине. Встроенный адресный регистр инкрементируется автоматически после каждой операции WRITE или READ для байта данных.
Часы реального времени M41T56 часы имеют встроенную схему контроля для обнаружения сбоев питания и автоматически переключается на питание от батарей во время сбоя внешнего питания. Энергия, необходимая для поддержания работоспособности оперативной памяти и часов может быть обеспечена при использовании небольшого литиевого элемента питания.
Типичное время хранения данных превышает 10 лет с 50 мА·ч, 3 В литиевым элементом. M41T56 поставляется в 8-выводном пластиковом SOIC-корпусе.
Расположение и назначение выводов

- OSCI — вход кварца
- OCSO — выход кварца
- FT/OUT — тест частоты/выходной драйвер (с открытым стоком)
- SDA — адресная линия вход/выход
- SCL — выход данных
- VBAT — питание от батареи
- VCC — внешний источник питания
- VSS — земля

Операции
Часы реального времени M41T56 работают как ведомое устройство на последовательной шине. Доступ получается реализацие условия запуска, за которым следует правильный адрес ведомого (D0h). К 64 байтам памяти, имеющимся в устройстве, можно получить последовательно доступ в следующем порядке:
- Регистр секунд
- Регистр минут
- Регистр век/часы
- Регистр дня недели
- Регистр даты
- Регистр месяца
- Регистр года
- Управляющий регистр
- ОЗУ
Микросхема постоянно отслеживает VCC на выход за допустимые пределы. Если VCC падает ниже VPFD, устройство прекращает дальнейший доступ и сбрасывает адрес счетчика. Входы устройства не будут признаны в это время, для предотвращения записи ошибочных данных на устройство с отказом от системы допуска. Когда VCC падает ниже VBAT, устройство автоматически переключается на аккумулятор в режим с пониженным энергопотреблением для экономии заряда аккумулятора. После подключения внешнего питания, устройство переключается с батарейного питания VBAT на VCC и считывает входы при превышении VCC в вольтах над VPFD.
В микросхеме имеется программируемый генератор прямоугольных импульсов, позволяющий вырабатывать одну из четырех частот (1 гц, 4096 Гц, 8192 Гц или 32768 Гц).
Полная версия datasheet на M41T56
Урок 18. Подключение RTC часы реального времени с кнопками
В этом уроке мы научимся не только выводить, но и устанавливать время RTC модуля при помощи трёх кнопок.
Нам понадобится:
- Arduino х 1шт.
- RTC модуль Trema на базе чипа DS1307 х 1шт.
- LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт.
- Trema Shield х 1шт.
- Trema-модуль i2C Hub х 1шт.
- Trema-модуль кнопка c проводами х 3шт.
- Шлейф «мама-мама»для шины I2С х 2шт.
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека iarduino_RTC (для подключения RTC часов реального времени DS1302, DS1307, DS3231)
- Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C)
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .
Видео
Схема подключения:
Подключение модулей RTC и LCD, данного урока, осуществляется к аппаратным выводам SDA, и SCL.
| RTC модуль Trema на базе чипа DS1307 / LCD дисплей на базе чипа LCD1602 | Arduino Uno |
|---|---|
| GND | GND |
| Vcc | +5V |
| SDA (Serial DAta) | A4 |
| SCL (Serial CLock) | A5 |
подключение кнопок: кнопка «SET» к выводу 2, кнопка «UP» к выводу 3 и копка «DOWN» к выводу 4.
Код программы:
При подключении библиотеки «iarduino_RTC» нужно указать, с каким модулем ей работать, в данном случае это модуль Trema на базе чипа DS1307:
#include // подключаем библиотеку для работы с RTC модулем iarduino_RTC time(RTC_DS1307); // объявляем переменную time для работы с библиотекой, указывая название модуля RTC_DS1307 void setup() < time.begin(); // инициируем RTC модуль >
Аналогичный алгоритм действий при подключении библиотеки «LiquidCrystal_I2C» для работы с LCD дисплеем LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) :
#include // подключаем библиотеку для работы с шиной I2C #include // подключаем библиотеку для работы с LCD дисплеем LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную lcd для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) void setup() < lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея >
Осталось подключить 3 кнопки: «SET», «UP» и «DOWN» . Для этого им нужно назначить номера выводов и указать, что эти выводы работают как вход:
const uint8_t PIN_button_SET = 2; // указываем номер вывода arduino, к которому подключена кнопка SET const uint8_t PIN_button_UP = 3; // указываем номер вывода arduino, к которому подключена кнопка UP const uint8_t PIN_button_DOWN = 4; // указываем номер вывода arduino, к которому подключена кнопка DOWN void setup() < pinMode(PIN_button_SET, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" pinMode(PIN_button_UP, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" pinMode(PIN_button_DOWN, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" >
В библиотеке «iarduino_RTC», для работы с датой и временем реализованы две функции: settime() — установка и gettime() — получение времени.
time.settime(0,1,2,3,4,5,6); // установить время: 00 сек, 01 мин, 02 часа, 03 день, 04 месяц, 05 год, 06 день недели - суббота // Если указать отрицательное значение, то соответствующий параметр останется без изменений. // Например: time.settime(10,20,-1,-1,-1,-1,-1); приведёт к изменению секунд и минут, а часы и дата останутся без изменений
time.gettime("d-m-Y, H:i:s, D"); // получить время в виде строки. Получим: "03-04-2005, 02:01:00, Sat" // Функция получает строку с символами, заменяет символы на дату и время, и возвращает строку // Какие символы на что заменяются можно посмотреть в файле iarduino_RTC.h
В библиотеке «iarduino_RTC» доступны 9 числовых переменных: seconds, minutes, hours, Hours, midday, day, weekday, month и year, значения которых обновляются после каждого вызова функции gettime(). Эти переменные мы будим использовать для изменения даты и времени.
int i = time.month; // если в часах установлен месяц май, то i будет равно 5 (пятый месяц)
Еще одна функция библиотеки «iarduino_RTC», которая нам понадобится, это blinktime(), она заставляет функцию gettime(), мигать одним из параметров времени (0 — не мигать, 1 — мигать секундами, 2 — мигать минутами, 3 — мигать часами, 4 — мигать днями и т.д.).
time.blinktime(4); // функция gettime() будет выводить строки с "мигающими" днями
И последнее, о чем надо позаботиться перед созданием кода программы — это алгоритм работы кнопок и определение переменных
Алгоритм работы кнопок следующий:
- В режиме вывода даты или времени (обычный режим):
- Кратковременное нажатие на кнопку SET переключает вывод даты и вывод времени
- Удержание кнопки SET переводит часы в режим установки даты или времени (зависит от того, что было на дисплее, дата или время)
- Кнопки UP и DOWN неактивны.
- Кратковременное нажатие на кнопку SET — переход между устанавливаемыми параметрами (сек, мин, час, дни, мес, год, д.н.)
- Удержание кнопки SET выводит часы из режима установки
- Каждое нажатие на кнопку UP увеличивает значение устанавливаемого параметра даты или времени
- Каждое нажатие на кнопку DOWN уменьшает значение устанавливаемого параметра даты или времени
Исходя из алгоритма, нам понадобятся две переменные, назовем их: VAR_mode_SHOW и VAR_mode_SET . Первая будет указывать режим вывода (1-выводим_время, 2-выводим_дату). Вторая, будет указывать режим установки времени (0-нет, 1-сек, 2-мин, 3-час, 4-день, 5-мес, 6-год, 7-д.н.).
Теперь всё готово для создания полного кода:
// Подключаем библиотеки: #include // подключаем библиотеку для работы с шиной I2C #include // подключаем библиотеку для работы с LCD дисплеем #include // подключаем библиотеку для работы с RTC модулем LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) iarduino_RTC time(RTC_DS1307); // объявляем переменную для работы с RTC модулем, указывая название модуля // Объявляем переменные и константы: const uint8_t PIN_button_SET = 2; // указываем номер вывода arduino, к которому подключена кнопка SET const uint8_t PIN_button_UP = 3; // указываем номер вывода arduino, к которому подключена кнопка UP const uint8_t PIN_button_DOWN = 4; // указываем номер вывода arduino, к которому подключена кнопка DOWN uint8_t VAR_mode_SHOW = 1; // режим вывода: 1-время 2-дата uint8_t VAR_mode_SET = 0; // режим установки времени: 0-нет 1-сек 2-мин 3-час 4-день 5-мес 6-год 7-день_недели void setup() < pinMode(PIN_button_SET, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" pinMode(PIN_button_UP, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" pinMode(PIN_button_DOWN, INPUT); // устанавливаем режим работы вывода кнопки, как "вход" delay(300); // ждем 300мс time.begin(); // инициируем RTC модуль lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея >void loop() < if(millis()%1000==0)< // если прошла 1 секунда lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print("iArduino.ru"); // выводим текст "iArduino.ru" lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 if(VAR_mode_SHOW==1)< // если установлен режим вывода времени lcd.print(time.gettime("H:i:s")); // выводим время >if(VAR_mode_SHOW==2) < // если установлен режим вывода даты lcd.print(time.gettime("d-m-Y D")); // выводим дату >delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс > Func_buttons_control(); // передаём управление кнопкам > // Функция управления кнопками: void Func_buttons_control() < uint8_t i=0; time.blinktime(VAR_mode_SET); // мигаем устанавливаемым параметром (если VAR_mode_SET больше 0) //Если часы находятся в режиме установки даты/времени if(VAR_mode_SET)< // Если нажата кнопка UP if(digitalRead(PIN_button_UP ))< while(digitalRead(PIN_button_UP))// ждём пока мы не отпустим кнопку UP switch (VAR_mode_SET) < // инкремент (увеличение) устанавливаемого значения /* сек */ case 1: time.settime(0, -1, -1, -1, -1, -1, -1); break; /* мин */ case 2: time.settime(-1, (time.minutes==59?0:time.minutes+1), -1, -1, -1, -1, -1); break; /* час */ case 3: time.settime(-1, -1, (time.Hours==23?0:time.Hours+1), -1, -1, -1, -1); break; /* дни */ case 4: time.settime(-1, -1, -1, (time.day==31?1:time.day+1), -1, -1, -1); break; /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==12?1:time.month+1), -1, -1); break; /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==99?0:time.year+1), -1); break; /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==6?0:time.weekday+1) ); break; >> // Если нажата кнопка DOWN if(digitalRead(PIN_button_DOWN)) < while(digitalRead(PIN_button_DOWN))// ждём пока мы её не отпустим switch (VAR_mode_SET) < // декремент (уменьшение) устанавливаемого значения /* сек */ case 1: time.settime(0, -1, -1, -1, -1, -1, -1); break; /* мин */ case 2: time.settime(-1, (time.minutes==0?59:time.minutes-1), -1, -1, -1, -1, -1); break; /* час */ case 3: time.settime(-1, -1, (time.Hours==0?23:time.Hours-1), -1, -1, -1, -1); break; /* дни */ case 4: time.settime(-1, -1, -1, (time.day==1?31:time.day-1), -1, -1, -1); break; /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==1?12:time.month-1), -1, -1); break; /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==0?99:time.year-1), -1); break; /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==0?6:time.weekday-1) ); break; >> // Если нажата кнопка SET if(digitalRead(PIN_button_SET))< while(digitalRead(PIN_button_SET))< // ждём пока мы её не отпустим delay(10); if(i<200)else // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран > if(i<200)< // если кнопка SET удерживалась меньше 2 секунд VAR_mode_SET++; // переходим к следующему устанавливаемому параметру if(VAR_mode_SHOW==1 && VAR_mode_SET>3) // возвращаемся к первому устанавливаемому параметру if(VAR_mode_SHOW==2 && VAR_mode_SET>7) // возвращаемся к первому устанавливаемому параметру >else < // если кнопка SET удерживалась дольше 2 секунд, то требуется выйти из режима установки даты/времени VAR_mode_SET=0; // выходим из режима установки даты/времени >> //Если часы находятся в режиме вывода даты/времени >else< // Если нажата кнопка SET if(digitalRead(PIN_button_SET))< while(digitalRead(PIN_button_SET))else // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран > if(i<200)< // если кнопка SET удерживалась меньше 2 секунд lcd.clear(); // стираем экран VAR_mode_SHOW=VAR_mode_SHOW==1?2:1; // меняем режим вывода: дата/время >else < // если if(VAR_mode_SHOW==1)// если установлен режим вывода времени, то устанавливаемый параметр - секунды if(VAR_mode_SHOW==2) // если установлен режим вывода даты, то устанавливаемый параметр - день > > > >Разберемся в данном коде:
- сначала мы подключили библиотеки Wire.h, LiquidCrystal_I2C.h и iarduino_RTC.h
- далее объявили константы: PIN_button_SET=2, PIN_button_UP=3, PIN_button_DOWN=4, указав им номера выводов с кнопками
- объявили две переменные: VAR_mode_SHOW=1 (режим вывода времени) и VAR_mode_SET=0 (без установки времени)
- в функции setup(): указали выводам с кнопками работать как вход, инициировали модули LCD и RTC, включили подсветку дисплея
- в функции loop(): циклически выполняем следующую последовательность:
- каждую секунду выводим текст «iArduino»
- каждую секунду, если переменная VAR_mode_SHOW равна 1, то выводим время: lcd.print(time.gettime(«H:i:s»));
- каждую секунду, если переменная VAR_mode_SHOW равна 2, то выводим дату: lcd.print(time.gettime(«d-m-Y D»));
- каждую секунду, приостанавливаем выполнение на 1мс
- при каждом цикле вызываем функцию Func_buttons_control(); которая следит за нажатием кнопок
- если VAR_mode_SET больше 0, то мигаем устанавливаемым параметром time.blinktime(VAR_mode_SET);
- проверяем не находимся ли мы в режиме установки даты/времени
- в любом случае проверяем не нажаты ли кнопки: if(digitalRead(PIN_button_. ))
- если кнопки нажаты, то ждем пока они не будут отпущены: while(digitalRead(PIN_button_. ))
- после того как кнопка была отпущена, выполняем действия связанные с её предназначением в текущем режиме
Ссылки:
- Код программы.
- Библиотека iarduino_RTC.
- Библиотека LiquidCrystal_I2C_V112.
- Wiki — Установка библиотек в Arduino IDE .
- WiKi — Работа с символьными ЖК дисплеями.
- Wiki — Часы реального времени, RTC (Trema-модуль) .
- Wiki — Trema Shield.
Arduino.ru
Подскажите плз, есть ли стандартная библиотека для работы в Arduino с временем и датой?
Нужно сравнивать 2 набора значений дата+время: текущие, полученные из модуля часов ds1307 и значения, сохраненное ранее в eeprom. Ожидаемый результат операции — разница между ними в днях, часах.
- Войдите на сайт для отправки комментариев
Втр, 19/02/2013 — 17:42
Зарегистрирован: 12.02.2012Нет нету. Есть библиотека для работы с ds1307.
- Войдите на сайт для отправки комментариев
Втр, 19/02/2013 — 23:41
Зарегистрирован: 25.01.2013В готовом виде наверно нет. То же задумался как сохранять и куда лог событий. Т.е. дату, время начала, продолжительность. Подскажите алгоритм, пожалуйста.
- Войдите на сайт для отправки комментариев
Втр, 19/02/2013 — 23:51
Зарегистрирован: 30.08.2012Работа с часами реального времени там описана.
- Войдите на сайт для отправки комментариев
Ср, 20/02/2013 — 11:21
Зарегистрирован: 05.02.2013Библиотеку Time посмотрел, спасибо.
Но не нашел там нужных мне методов для работы с временем и датой — например DateAdd, DateDiff
- Войдите на сайт для отправки комментариев
Пт, 22/02/2013 — 22:00
Зарегистрирован: 21.06.2011ребята и мне нужны алгоритмы нахождения разницы дат. А я планирую сохранять значение текущено времени в регистрах таймера, чтобы про просыпании контроллера посмотреть сколько времени прошло пока он спал, и сделать соответствующие коррекции на погрешность хода таймера.
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 16:39
Зарегистрирован: 10.08.2015Получаю время с часов DS1302. Мне надо знать когда будет 8 часов. Минуты и секунды не интересуют. Если я напишу
void CHEKTIME() < if (int(rtc.getTimeStr())==800) < digitalWrite(lightPIN, HIGH); >>
Будет работать? У меня компилируеться — но проверить не скоро смогу контроллера нет пока. Сомневаюсь получиться ли 800 если переменная getTimeStr() выводилась в сериал таким форматом 8:0:0. В общем я не знаю как преобразование в int поступает со знаками и числами.
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 16:47
Клапауций 911
Зарегистрирован: 18.10.2015
serega374 пишет:Мне надо знать когда будет 8 часов.
hour(); // the hour now (0-23) minute(); // the minute now (0-59) second(); // the second now (0-59) day(); // the day now (1-31) weekday(); // day of the week, Sunday is day 0 month(); // the month now (1-12) year(); // the full four digit year: (2009, 2010 etc) there are also functions to return the hour in 12 hour format hourFormat12(); // the hour now in 12 hour format isAM(); // returns true if time now is AM isPM(); // returns true if time now is PM now(); // returns the current time as seconds since Jan 1 1970
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 16:56
Зарегистрирован: 10.08.2015получилось только так int h = hour(); Или должно без int работать? Соррри за глупый вопрос
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 17:02
Зарегистрирован: 12.02.2012- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 17:08
Клапауций 911
Зарегистрирован: 18.10.2015
serega374 пишет:Или должно без int работать? Соррри за глупый вопрос
вопрос не глупый, а свидетельствующий о том, что ты плаваешь в программировании совсем.
void setup() <>
заработало, а без int — не работает.- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 17:15
Зарегистрирован: 10.08.2015Я только начинаю спасибо за помощь. Я весь код не писал.
void setup() <> void loop() <> есть конечно. int был условно не показан Вами как я понял
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 17:20
Клапауций 911
Зарегистрирован: 18.10.2015
serega374 пишет:int был условно не показан Вами как я понял
и не должен был быть показан — подразумевается, что переменная была объявлена где-то выше.
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 17:29
Зарегистрирован: 10.08.2015
Тогда в чем разница кодов?int h = hour(); void CHEKTIME() < if (h == 8) < digitalWrite(lightPIN, HIGH); >>
int h; void CHEKTIME() >
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 17:35
Клапауций 911
Зарегистрирован: 18.10.2015- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 18:48

Зарегистрирован: 20.06.2015
Есть еще одна существенная разница:
в первом случае переменной h присваивается значение перед началом выполнения программы, а во втором — при каждом вызове CHEKTIME (Кстати, если это по-английски, то правильнее было бы CheckTime).
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 19:09
Клапауций 911
Зарегистрирован: 18.10.2015
andriano пишет:Есть еще одна существенная разница:
в первом случае переменной h присваивается значение перед началом выполнения программы, а во втором — при каждом вызове CHEKTIME (Кстати, если это по-английски, то правильнее было бы CheckTime).
ну, да — нам же точно известно, где в коде находится int h;
нам дают два куска кода и просят объяснить, что за нах в них происходит.
а, хрен его знает, что.
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 20:08

Зарегистрирован: 20.06.2015
Нам точно известно, что h находится в области видимости функции. А для этого существует не так много мест.
И вообще, нужно ориентироваться на тот код, который есть, а не фантазировать, что там есть что-то кроме него.
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 20:12
Клапауций 911
Зарегистрирован: 18.10.2015
andriano пишет:Нам точно известно, что h находится в области видимости функции. А для этого существует не так много мест.
откуда нам известно, что h находится не в другой функции?
нам видим весь код или ега куски?
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 22:19

Зарегистрирован: 20.06.2015
В приведенном фрагменте кода другая функция отсутствует.
Обсуждать имеет смысл то, что есть, а не то, что мы можем себе нафантазировать.
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 22:30
Клапауций 911
Зарегистрирован: 18.10.2015
andriano пишет:В приведенном фрагменте кода другая функция отсутствует.
достаточно для чего?
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 — 23:20

Зарегистрирован: 20.06.2015
Клапауций 911 пишет:достаточно для чего?
Это зависит от Ваших фантазий.
- Войдите на сайт для отправки комментариев
Чт, 11/08/2016 — 21:31
Зарегистрирован: 25.04.2014заказал себе экран nextion enhanced. На борту у этого экрана есть RTC. Но получить от этого экрна можно только год, месяц, день, час, минута, секунда. Можно както это все преобразовать в секунды (аналог now(); из Time.h) ? Перемножение на количество секунд в году, месяце . не подходит т.к. они бывают разные
- Войдите на сайт для отправки комментариев
Чт, 11/08/2016 — 21:47

Зарегистрирован: 23.11.2015
mishgan пишет:заказал себе экран nextion enhanced. На борту у этого экрана есть RTC. Но получить от этого экрна можно только год, месяц, день, час, минута, секунда. Можно както это все преобразовать в секунды (аналог now(); из Time.h) ? Перемножение на количество секунд в году, месяце . не подходит т.к. они бывают разные
- Войдите на сайт для отправки комментариев
Чт, 11/08/2016 — 22:28
Зарегистрирован: 25.04.2014Посидел покумекал. И оказалось, что совсем это не сложно.
unsigned long now () < int Y=nex.getComand("rtc0"); int M=nex.getComand("rtc1"); int D=nex.getComand("rtc2"); int h=nex.getComand("rtc3"); int m=nex.getComand("rtc4"); int s=nex.getComand("rtc5"); int mes[13]=; unsigned long now=0; int ddtm=0; for (int i = 1; i
- Войдите на сайт для отправки комментариев
Чт, 15/03/2018 — 18:21
Зарегистрирован: 26.05.2017Всем доброго дня! Форумчане подскажите пожалуйста как можно организовать задержку исполнения кода используя RTС. Мне для полива растений. Допустим с RTC я получаю ткущую секунду и нужно исполнять код 10 сескунд. В голове крутиться но никак не соберу. Модуль использую DS3231
- Войдите на сайт для отправки комментариев
Чт, 15/03/2018 — 18:28

Зарегистрирован: 14.08.2015
изложите более детально чего вы хотите, а то голова крутится, от того что прочитал.
- Войдите на сайт для отправки комментариев
Чт, 15/03/2018 — 18:30
Клапауций 555
Зарегистрирован: 10.03.2018
kost2003 пишет:Всем доброго дня! Форумчане подскажите пожалуйста как можно организовать задержку исполнения кода используя RTС. Мне для полива растений. Допустим с RTC я получаю ткущую секунду и нужно исполнять код 10 сескунд. В голове крутиться но никак не соберу. Модуль использую DS3231
берёшь сырое время, а не секунду, которое тебе отдаёт модуль и сравниваешь разницу в 10 секунд.
- Войдите на сайт для отправки комментариев
Чт, 15/03/2018 — 20:31
Зарегистрирован: 26.05.2017Да, но как? Допустим сырое время 55 секунд в переменной инт, если я к переменной прибавлю 10 секунд будет 65 в значении, а корректное время то будет 05 секунд.
- Войдите на сайт для отправки комментариев
Чт, 15/03/2018 — 20:41
Зарегистрирован: 26.05.2017
xDriver пишет:изложите более детально чего вы хотите, а то голова крутится, от того что прочитал.
Есть подключенные часы RTC.
дальше по опредлеленному событию, подавать на 2й пин напряжение на 10 секунд после снять напряжение. И чтобы сравнение прошедших 10 секунд получать из модуля часов без делай или millis
- Войдите на сайт для отправки комментариев
Чт, 15/03/2018 — 20:43

Зарегистрирован: 25.01.2017
Просто переведи время в секунды и сравнивай/отнимай
- Войдите на сайт для отправки комментариев
Чт, 15/03/2018 — 20:47
Клапауций 555
Зарегистрирован: 10.03.2018
kost2003 пишет:Да, но как? Допустим сырое время 55 секунд в переменной инт, если я к переменной прибавлю 10 секунд будет 65 в значении, а корректное время то будет 05 секунд.
нет. ты берёшь Юникс-время из своего модуля и ежесекундно сравниваешь его. по достижении разницы между стоп_Юникс_тиме и старт_Юниск_тиме равное 5-ти, что то делаешь.
в секундах у тебя время в модуле генерится и хранится — минуты и прочее, это уже календарные производные, которые не должны тебя волновать вообще.
- Войдите на сайт для отправки комментариев
Чт, 15/03/2018 — 20:49
Зарегистрирован: 26.05.2017
Клапауций 555 пишет:
kost2003 пишет:Да, но как? Допустим сырое время 55 секунд в переменной инт, если я к переменной прибавлю 10 секунд будет 65 в значении, а корректное время то будет 05 секунд.
нет. ты берёшь Юникс-время из своего модуля и ежесекундно сравниваешь его. по достижении разницы между стоп_Юникс_тиме и старт_Юниск_тиме равное 5-ти, что то делаешь.
в секундах у тебя время в модуле генерится и хранится — минуты и прочее, это уже календарные производные, которые не должны тебя волновать вообще.
Кажется понял в какую сторону смотреть. Спасибо!
- Войдите на сайт для отправки комментариев
Чт, 15/03/2018 — 20:51
Зарегистрирован: 19.10.2016- Войдите на сайт для отправки комментариев
Чт, 15/03/2018 — 20:54
Зарегистрирован: 26.05.2017
kost2003 пишет:Да, но как? Допустим сырое время 55 секунд в переменной инт, если я к переменной прибавлю 10 секунд будет 65 в значении, а корректное время то будет 05 секунд.
Вы не в курсе, что такое «сырое время»? Это время только в секундах, без минут, часов, дней. Когда вы прибавлете к 55 секундам «сырого времени» еще 10, то получается не «минута и 5 секунд». а просто 65 секунд.
В большинстве компьютерных систем используется именно «сырое время», а не привычный людям календарь. Например в Unix системное время измеряется в секундах с 1 января 1970 г. В настоящее время там натикало чуть более 1.5 миллиардов секунд. В Ардуине «сырое время» отсчитывается от перезапуска системы. Переводите все свои интервалы в чистые секунды и спокойно отсчитывайте нужный интервал.
- Войдите на сайт для отправки комментариев
Чт, 15/03/2018 — 20:56
Зарегистрирован: 26.05.2017
b707 пишет:
kost2003 пишет:Да, но как? Допустим сырое время 55 секунд в переменной инт, если я к переменной прибавлю 10 секунд будет 65 в значении, а корректное время то будет 05 секунд.
Вы не в курсе, что такое «сырое время»? Это время только в секундах, без минут, часов, дней. Когда вы прибавлете к 55 секундам «сырого времени» еще 10, то получается не «минута и 5 секунд». а просто 65 секунд.
В большинстве компьютерных систем используется именно «сырое время», а не привычный людям календарь. Например в Unix системное время измеряется в секундах с 1 января 1970 г. В настоящее время там натикало чуть более 1.5 миллиардов секунд. В Ардуине «сырое время» отсчитывается от перезапуска системы. Переводите все свои интервалы в чистые секунды и спокойно отсчитывайте нужный интервал.
Да, это я уже понял, сейчас читаю про unixtime. Спасибо за подсказку!
- Войдите на сайт для отправки комментариев