Uptime
- Войдите на сайт для отправки комментариев
Ср, 06/04/2022 - 11:35
Не судите строго за детский вопрос. Как лучше посчитать аптайм в формате привычным человеческому глазу? А именно чч:мм:cc.
String uptime()
{
uint32_t seconds = millis() / 1000ul; // полное количество секунд
uint32_t Hour = (seconds / 3600ul); // часы
uint32_t Min = (seconds % 3600ul) / 60ul; // минуты
uint32_t Sec = (seconds % 3600ul) % 60ul; // секунды
uint32_t time = (Hour, Mins Sec"); // чч:мм:сс
Serial.println(time);
return String(time);
}
Знаю что 7 строка не верно записана. Нужно как-то в нее переменные уложить через разделитель двоеточие.
" время в одну переменную через двоеточие" - это лютый бред.
Вам всего лишь надо вывести часы, минуты и секунды на печать. Вот и выводите - сначала одно, потом другое, потом третье. И двоеточия печатайте, где надо.
Не судите строго за детский вопрос. Как лучше посчитать аптайм в формате привычным человеческому глазу? А именно чч:мм:cc.
String uptime() { uint32_t seconds = millis() / 1000ul; // полное количество секунд uint32_t Hour = (seconds / 3600ul); // часы uint32_t Min = (seconds % 3600ul) / 60ul; // минуты uint32_t Sec = (seconds % 3600ul) % 60ul; // секунды uint32_t time = (Hour, Mins Sec"); // чч:мм:сс Serial.println(time); return String(time); }Знаю что 7 строка не верно записана. Нужно как-то в нее переменные уложить через разделитель двоеточие.
А что будет после переполнения millis(), подумали ?
А что будет после переполнения millis(), подумали ?
Ну так это аж через 50 суток.
sprintf(buf, "%02d:%02d:%02d", H,M,S);
А что будет после переполнения millis(), подумали ?
ему даже дни не надо
ему даже дни не надо
Дольше суток все равно не протянет?
ему даже дни не надо
Дольше суток все равно не протянет?
почему нет, к примеру на ESP8266 имею чуток более 440 суток...

ему даже дни не надо
Дольше суток все равно не протянет?
почему нет, к примеру на ESP8266 имею чуток более 440 суток...

Почему нет, у самого ESP работают без проблем и совсем без перезапусков, ну очень давно.
Я про ТС:
Ну так это аж через 50 суток.
Стало интересно на сколько millis() хватает с точностью до секунды:
В строке 7 используйте тип String и просто сложите всё в кучу.
Дед Семён, спасибо за наводку!
Решил немного усложнить задачу. Вывести не аптайм, а остаток времени до включения таймера, так удобней. (Код самого таймера приводить не буду., что бы в глазах не рябило :)). Ну и пусть умеет работать с большими интервалами времени.
String time_on = "8" // Включить таймер через 8 часов. String uptime() { uint32_t sec = time_on.toFloat() * 3600ul - millis() / 1000ul; // секунды до срабатывания. uint16_t H = (sec / 3600ul); // часы uint16_t M = (sec % 3600ul) / 60ul; // минуты uint16_t S = (sec % 3600ul) % 60ul; // секунды char szStr[9]; sprintf(szStr, "%02d:%02d:%02d", H, M, S); Serial.println(szStr); // Пришло время включения? Вместо циферок, выведем статус "ON"! if (ledState) // если таймер включен { return "ON"; // то отправляем статус "ON" } return String(szStr); }Не уверен правильные ли типы данных выбрал в строках 6-8 ? Хотелось бы сократить количество вычислений, но явно не получится. Насколько sprintf прожорлив?
А на кой ляд у тебя time_on стрингом, если ты потом ее к числу приводишь? Да еще к вещественному... Брррр....
В 06...08 строках тип uint32_t
А на кой ляд у тебя time_on стрингом, если ты потом ее к числу приводишь? Да еще к вещественному... Брррр....
В 06...08 строках тип uint32_t
Клянусь, я не любитель стрингов! )))))
В 06...08 строках тип uint32_t
нафига? число минут и секунд заведомо не более 59-ти.
тут и байта хватит - то исть uint8
нафига? число минут и секунд заведомо не более 59-ти.
тут и байта хватит - то исть uint8
А и верно. Что-то я с утра не проснувшийся видимо писал... ))
Не уверен правильные ли типы данных выбрал в строках 6-8 ?
замечание по коду. В выражениях
спецификатор "ul" избыточен. Переменная sec сама имеет размерность ulong, а значит все вычисления и без указания "ul" будут идти в этом размере.
спецификатор "ul" избыточен. Переменная sec сама имеет размерность ulong, а значит все вычисления и без указания "ul" будут идти в этом размере.
А я всегда стараюсь использовать константы со спецификатором типа, если переменные в операции отличаются от int.
Может сейчас и не нужно, но осталась привычка с давних времен.
число минут и секунд заведомо не более 59-ти.
Минут - да, а секунд может быть и 60.
и даже 172800 секунд, если это DHCP к примеру )))
Открылась новая беда. Примерно через 12 минут происходит отваливание и реконнект. Убрал секунды, оставил только часы и минуты, время через которое происходит реконнект увеличилось. В монитор порта выдает это.
Отключи собаку)) Или обнуляй во время работы.
Не, не нужно ни отключать, ни обнулять. Нужно управление ядру отдавать, не зависая на долго в loop().
Зачем отключать защитный механизм.
Не, не нужно ни отключать, ни обнулять. Нужно управление ядру отдавать, не зависая на долго в loop().
Зачем отключать защитный механизм.
А про loop() я и не заикался. Про управление ядром можно ссылку для самообразования? А то Гугл меня ненавидит.
Ну тогда выкладывайте свой код целиком, чтобы общаться предметно.
Выкрутился, "Task watchdog got triggered" больше не беспокоит. Ушел от стринга и оформил отдельной функцией.
void Timeleft() { uint32_t msec = defTime5.toFloat() * 3600000ul - millis(); // остаток uint16_t H = (msec / 3600000); // часы uint16_t M = (msec % 3600000) / 60000; // минуты uint16_t S = (msec % 3600000) / 1000 % 60; // секунды char buffer[9]; sprintf(buffer, "%02d:%02d:%02d", H, M, S); Serial.println(buffer); } void loop { Timeleft(); }Для быстродействия есть разница?
1. Производить все расчеты в миллисекундах, а результат выводить в секундах.
2. Сразу всё конвертировать в секунды, далее производить в них расчеты.
Какой варианты более предпочтительный?
Ушел от стринга
А это что?
Или тебе принципиально нужно в string время задавать?
Ушел от стринга
А это что?
Или тебе принципиально нужно в string время задавать?
Правильно заметил. Касательно этого куска (если рассматривать только его), то складывается впечатление что можно было бы обойтись переменной. Но этот фрагмент должен быть включен в большой код, вот там то и будет задействован стринг в функции processor. Ему придется работать с вэб страницей, без этого никак.
Так преобразуй значение сразу после получения с веб-страницы и парсинга, зачем каждый раз то его преобразовывать?
Осталось результат этой функции отправить на вэб страницу.
void Timeleft() { uint32_t msec = defTime5.toFloat() * 3600000ul - millis(); // остаток uint16_t H = (msec / 3600000); // часы uint16_t M = (msec % 3600000) / 60000; // минуты uint16_t S = (msec % 3600000) / 1000 % 60; // секунды char buffer[9]; sprintf(buffer, "%02d:%02d:%02d", H, M, S); Serial.println(buffer); } void loop { Timeleft(); }Думал как то так, но не сращивается.
void Timeleft() { uint32_t msec = defTime5.toFloat() * 3600000ul - millis(); // остаток uint16_t H = (msec / 3600000); // часы uint16_t M = (msec % 3600000) / 60000; // минуты uint16_t S = (msec % 3600000) / 1000 % 60; // секунды char buffer[9]; sprintf(buffer, "%02d:%02d:%02d", H, M, S); Serial.println(buffer); } void setup() { server.on("/id_web", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(200, "text/plain", *****); }); void loop() { Timeleft(); }Наставьте на путь истинный плиз?
Мы ж с тобой вот тут вроде как все выяснили. Или в чем вопрос то?
Мы ж с тобой вот тут вроде как все выяснили. Или в чем вопрос то?
Там не проканало, если только массив через split как вы там рекомендовали, то норм. Но у меня там "мешают" в onMessage(event) разные включалки на swith case.
function onMessage(event) { switch (event.data) { case '0': document.getElementById("state1").innerHTML = "OFF"; break case '1': .... и.т.д...Чем мешают? Собери так же как и два значения все необходимые (хоть сотню) и через сплит на странице уже раздели в массив, дальше знаешь. Получишь все что нужно.
Можете посмотреть это:
https://github.com/YiannisBourkelis/Uptime-Library