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. Что можно сделать, чтобы создать ту же самую желаемую функцию?
@walkman118, 👍0
1 ответ
Не делайте этого. Преобразование времени в 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
), которое можно легко
по сравнению с использованием поплавков и гораздо эффективнее.
- Как использовать SPI на Arduino?
- Библиотека DHT.h не импортируется
- Светодиоды: разница между общим анодом и общим катодом
- Как повторить кусок кода
- Почему эта программа на C++ не может прочитать Serial.write() моего arduino?
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- Отображение двоичных данных на светодиодах
- Корпус кнопки и переключателя