const char* в double

Я пытаюсь использовать оператор if, чтобы проверить, когда время проходит определенную точку, и запустить определенную функцию. Для этого я хочу преобразовать время в double и запустить что-то вроде if(timeCurrent >= 8.30). Однако у меня, похоже, проблема с частью преобразования, обычно я знаю, что стандартная практика в C++ заключается в следующем:

DateTime now = rtc.now();
static char buffer[80];

sprintf(buffer, "%02d.%02d", now.hour(), now.minute());
String str(buffer);
double timeCurrent = strtod(str);

Однако это не работает для Arduino. Что можно сделать, чтобы создать ту же самую желаемую функцию?

, 👍0


1 ответ


3

Не делайте этого. Преобразование времени в double крайне неэффективно. Более того, ваш подход страдает от проблемы с переносом каждые 24 часа.

Если вы просто хотите сравнить время суток с 8:30, вы можете сделать это в очень простой способ:

if (now.hour() > 8 || (now.hour() == 8 && now.minute() >= 30))

Если длинный if вас раздражает, вы можете поместить логику сравнения внутрь статическая встроенная функция. Если вы действительно хотите объединить час и минуту в одно число, а затем преобразовать в целое число, а не в число двойной точности:

if (now.hour() * 100 + now.minute() >= 830)

Это можно сделать более эффективным, если мыслить двоично, а не десятичная система: можно создать 16-битное число, в одном байте которого будут храниться часы а другой байт содержит минуты:

if ((now.hour() << 8) | now.minute() >= (8 << 8) | 30)

Опять же, вы можете инкапсулировать ((a)<<8|(b)) в макросе или статическом встроенная функция, если она помогает с читабельностью. Если вы хотите сравнить с абсолютное время, лучшим вариантом будет создание объекта DateTime представляющий собой крайний срок, и сравните с now следующим образом:

// Предположим, что тайм-аут должен быть сегодня в 8:30.
DateTime timeout(now.year(), now.month(), now.day(), 8, 30, 0);
if (now.secondstime() >= timeout.secondstime())

Здесь метод secondstime() используется для преобразования DateTime в скалярное число (32-битное целое число типа time_t), которое можно легко по сравнению с использованием поплавков и гораздо эффективнее.

,