ESP8266 mktime(timeinfo) возвращает другую дату
- Войдите на сайт для отправки комментариев
Пнд, 11/12/2017 - 14:29
Здравствуйте, помогите пока я с ума не сошел. Почему даты отличаются?! Понятно, что сам дурак, но где?
#include <time.h> void loop{ struct tm * ti; time(&now); //текущая дата Mon Dec 11 17:26:21 2017 ti = localtime(&now); time_t t = mktime(ti); Serial.println(ctime(&t)); // возвращает Wed Apr 10 05:35:05 1957 }
Можно скетч целиком? Хочется видеть как Вы текущую дату установили.
получаю не ту дату, которая на входе
Вы не поняли вопроса. Меня интересует как Вы устанавливали текущую дату. Давайте скетч целиком.
Результат вывода:
Вот теперь понятно.
Текущее время Вы взяли с NTP а потом используете его без преобразования. Дело в том, что NTP время - это количество секунд с 01.01.1900. А mktime ожидает, что ему дадут время, в зависимости от реализации библиотеки time, или в UNIX времени (секунды с 01.01.1970 года) или даже в Y2K времени (секунды с 01.01.2000 года).
Прежде, чем подсовывать время функции mktime, Вам необходимо его преобразовать, т.е. вычесть из него количество секунд между 01.01.1970 и 01.01.1900 (если у Вас время в UNIX) или между 01.01.2000 и 01.01.1900 (если у Вас время в Y2K).
Откройте Ваш файл time.h и поищите там константу NTP_OFFSET (или как-то похоже). Это именно то число, которое нужно вычесть.
Т.е. схема такая:
Вот здесь ещё почитайте, подобная тема уже обсуждалась.
ЕвгенийП, здравствуйте.
Вы уже разобрались с этой темой, а у меня есть вопрос. Пытаюсь задать два времени и высчитать разницу между ними, но результат получаю неправильный.
Результат отличается от ожидаемой 1 секунды.
И что получается - 10 секунд?
У меня не отличается
IDE 1.8.6
А у меня результаты такие:
А у меня результаты такие:
Сравните код из поста #6 с Вашими "результатами". Они не могут быть такими, хотя бы потому. что в коде не печатаются s_tm1 и s_tm2.
Значит, Вы показываете нам один код, а результаты от другого. Зачем?
Код и поста #6 я только что запускал и результат Вам привёл.
Я задал разницу в 1 сутки (ровно 24 часа):
В результате разница в моей системе составляет 4294880896 секунд. А ожидаемое значение должно быть 86400 секунд.
Я задал разницу в 1 сутки (ровно 24 часа):
Вы из меньшего вычитаете большее и получаете именно то, что должны получить, т.е. -86400, но в беззнаковом варианте. Это легко проверить: 2 в 32 степени равно 4294967296. Вычтете из этого полученный Вами результат
4294967296 - 4294880896 = 86400
Всё путём!
Да, все верно. Я даже не обратил внимание на то, что из меньшего пытаюсь вычесть большее )).
Спасибо огромное за отзывчивость и помощь!
Хорошего дня
И все же есть еще что спросить у вас ))
Как только я добавляю вывод в последовательный порт любых других данных, то результат сразу оказывается неверным. Например:
В чем тут может быть дело? Если закомментировать строки 24 И 25, тогда результат выводится верным.
Serial
.println((uint32_t) lesserTime) ?
Это дает такой результат:
В чем тут может быть дело? Если закомментировать строки 24 И 25, тогда результат выводится верным.
Ваш скетч из этого поста у меня выдал результат
Давайте подробно и всё по проядку, что за ардуина,как загружаете скетч, что за IDE - все подробности.
Это клон УНО. Загружаю через USB напрямую от компа, IDE 1.8.7
Все, кажется я все понял. Проблема, похоже, именно в клоне UNO. Залил этот же скетч на ESP32 и там все работает как надо. Так что тему можно закрывать. Всем спасибо ))
Так не бывает. Дело в каких-то программа и библиотеках. Сама по себе плата (микросхема) так шутить не может. Дайте-ка я скачаю 1.8.7 ... минутку
Какую плату Вы ей указываете в меню "Tools"? Uno?
Указываю это:
Плата: Arduino/Genuino UNO
Программатор: AVRISP mkll
Но программатором Вы не пользуетесь, через USB заливаете, так?
Ну, скачал, запустил - нормально всё.
Только вот всё равно не понимаю, чем клон виноват.У меня есть "самогонный" клон (просто голый микроконтроллер с парой конденсаторов) и на нём всё нормально. И на Тини86 - тоже.
В общем, Вам, наверное, вот в эту тему надо.
Согласен, странно и вроде быть не должно, но мне важнее работа скетча на ESP32 ))
На УНО я решил проверить отдельный блок.
В любом случае спасибо ))