Все мира!
Что то случилось с DS3231 не могу понять. До вчерашнего дня все работало нормально. А вот вчера заметил, что в часы не записывается время компиляции.
В коде в этой части вообще ничего не менялось.
Для передачи времени использовал вот это:
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Если я без проверки работы DS3231 в коде записываю:
Мой стаж программирования МК уже 3 недели. До начала я почти месяц читал, вникал, пытался понять. Поэтому, некоторые вещи спрашиваю основываясь на том, что этот раздел для новичков, и полагаю, что люди которые хотят оказать помощь, уже далеко не новички.
Как часы участвуют в компиляции? Это не я придумал, это во всех статьях про DS3231 написано. Подразумевается, что строка rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); устанавливает RTC на дату и время компилирования скетча.
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Работали и в порт приходила строка RTC lost power, lets set the time!. Сейчас ни Couldn’t find RTC ни RTC lost power, lets set the time в порт не возвращаются. Такое ощущение, что if (!rtc.begin()) и if (rtc.lostPower()) просто игнорируются.
А сейчас Вы вставили в модуль батарейку или перестали отключать от питания между компиляциями, или ещё как устроили, чтобы часы не теряли питание. Ваша заморочка в том, что часы не теряют питания между компиляциями.
Кроме того, научитесь внятно формулировать проблему (выплюньте сопли с говорите чётко)!
Вот Вы пишете:
Ну, это же брехня! Вы же сами чуть ниже говорите, что
Так, значит, время-то в часы записывается! А неправильно, на Ваш взгляд, срабатывает проверка условияif (rtc.lostPower()). Ну, так, блин, и говорите! Зачем же Вы своей брехнёй всем мозг выносите?
Короче, часы не теряют питания между компиляциями, потому проверка и не даёт истину.
P.S.
Вообще - это приём (установка времени компиляции) – мастурбация. Это можно делать только при отладке, чтобы каждый раз время не ставить. В самоделке это оставлять нельзя – она у Вас при каждой потере питания будет молча вставлять время компиляции (которая была, может, год назад) и никак Вас об этом не предупреждать.
Нормально делать так: если обнаружилась потеря питания (по той самой проверке) – переводить часы в режим установки времени и информировать об это юзера (миганием или ещё как).
Уважаемый ЕвгенийП. Вы уж извините меня, но разница между брехней и ошибкой очень большая. Я еще раз попробую объяснить суть проблемы. В коде моей программы написано:
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
При этом после каждой компиляции в часы устанавливалось время компиляции. Да в часах есть батарейка. И время не сбивалось даже если я отключал питание Ардуины на всю ночь. Но сейчас не об этом. Сейчас просто перестали работать эти строки. Проверки if не идут, в порт ничего не возвращается, а должно: либо “Couldn’t find RTC” либо RTC lost power, lets set the time!. Но тишина… А вот если я убираю все проверки и просто в код пишу строку rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); то понятное дело все работает. Время компиляции записывается, но при этом и после переподключения питания ардуины время сбрасывается на время компиляции. Такого небыло при этих проверках. Я не пойму или раньше что то не так было либо сейчас. И еще Евгений… Читая то как вы всем отвечаете на посты, по мне бы лучше потратить больше времени и самому разобраться, чем спрашивать именно у Вас. В принципе я так и делаю. Что то товарищи программисты больно нервные. Представьте ситуацию, Вы бы спросили меня, какой пожар относится к классу Z. Написав, что вы только познаете этот материал, я бы просто культурно объяснил, а не писал читай для начала даташит, потом спрашивай. Раз люди сюда прищли, значит им нужна помощь человека. Потому, что где то спрашивающий застрял. Вы просто игнарируйте мои посты, чтоб не разрушать себе нервы.
Согласен. Но мне то как раз для этого и нужно. Код программы и так уже не маленький, пока мне не до этого. В первую очередь мне требуется получить те функции которые я пытаюсь вложить в это устройство. Потом я буду допиливать уже готовое устройства всякими плюшками.
Я полностью отключаю питание от модуля DS3231 RTC, и мой вызов rtc.lostPower() никогда не срабатывает, когда я все повторно подключаю. Я также извлекаю аккумулятор, я оставил его на ночь, и он запоминает время непосредственно перед тем, как я все отключил, но не регистрирует потерю питания.
Да, благодарю. Это работает. Просто вчера еще это все работало, а сегодня вдруг нет. При это ничего не поменялось. Уже 100 раз все перепроверил.
Получается первые if не выполняются по условию. Странно… выполнялись же. Ну ладно. Нужно взять паузу.
Дело Ваше. Если бы Вы концентрировались на том, “что” Вам пишут, а не “как”, то уже поняли бы, что условие срабатывает только если часы теряли питание и не срабатывает, если не теряли (посмотрели бы в текст библиотеки и в даташит - там всё прозрачно). Собственно эта фича именно для этого и нужна – переустановить время после потери питания. Но, коль скоро Вы предпочитаете обижаться, а не читать …
Не вижу на то причин, но если Вы так настаиваете, как Вам будет угодно.
Только, тогда уж, пожалуйста, не обращайтесь ко мне с прямыми вопросами, как Вы это сделали сейчас в посте №9
Женя, да я не обижаюсь. Я уже столько начитался вот на таких форумах, что был готов к таким ответам. Мне бы просто в проблеме разобраться с Вашей помощью конечно, без лишних эмоций.
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Исправил вот так:
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1)
;
} else {
Serial.println("111111111111");
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
//rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
} else {
Serial.println("111111111111");
}
теперь в порт приходит 2 строки “11111111111” значит под if условия не подходят.