Вычислить текущий ДЕНЬ, относительно заданного
- Войдите на сайт для отправки комментариев
Пнд, 02/04/2018 - 17:13
Вобщем задачка простая. Есть часы на ds3231 - они показывают время и дату (текущую) без библы:
//=====Rtc_Clock* #define DS3231_I2C_ADDRESS 104 byte seconds, minutes, hours, day, date, month, year; byte decToBcd (byte val){return((val/10*16)+(val%10));} //=========== Обработка показаний часов void timeRtc(){ Wire.beginTransmission(DS3231_I2C_ADDRESS); //104 is DS3231 device address Wire.write(0x00); //Start at register 0 Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); //Request seven bytes if(Wire.available()){ seconds = Wire.read(); //Get second minutes = Wire.read(); //Get minute hours = Wire.read(); //Get hour day = Wire.read(); date = Wire.read(); month = Wire.read(); //Get month year = Wire.read(); seconds = (((seconds & B11110000)>>4)*10 + (seconds & B00001111)); //Convert BCD to decimal minutes = (((minutes & B11110000)>>4)*10 + (minutes & B00001111)); hours = (((hours & B00110000)>>4)*10 + (hours & B00001111)); //Convert BCD to decimal (assume 24 hour mode) day = (day & B00000111); // 1-7 date = (((date & B00110000)>>4)*10 + (date & B00001111)); //Convert BCD to decimal 1-31 month = (((month & B00010000)>>4)*10 + (month & B00001111)); //msb7 is century overflow year = (((year & B11110000)>>4)*10 + (year & B00001111)); } } //=========== Обработка установки часов void setRtc(byte seconds, byte minutes, byte hours, byte day, byte date, byte month, byte year){ Wire.beginTransmission(DS3231_I2C_ADDRESS); //104 is DS3231 device address Wire.write(0x00); //Start at register 0 Wire.write(decToBcd(seconds)); Wire.write(decToBcd(minutes)); Wire.write(decToBcd(hours)); Wire.write(decToBcd(day)); Wire.write(decToBcd(date)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission(); }
и есть три ячейки eeprom в которых сохраняется начальный день (два знака) месяц и год (также два знака).
Подскажите как посчитать какой к примеру сегодня день если начальный 16.03.18. Пробовал тупо вычитанеим но сами понимаете правильно лиш в пределах одного МЕСЯЦА, если в разные то ерунда. Если в разные годы - то разнца :) в домолнительный -1 день :)
Выручайте. Время по часам есть dec так и BCD :) а вот стартовое только в dec
Как вариант: сконвертировать нужную дату в unixtime, из unixtime - вычислить все компоненты. Например (выкусил из одного проекта, ни на что не претендую):
Как-то так.
А что нужно? Количество дней между двумя датами? Да?
угу - завтра с утра и попробую ваш кусочек к своему примерить, спасибо :)
А что нужно? Количество дней между двумя датами? Да?
Да , именно количество дней (время установки неимеет значения), установка и отсчёт имеено дней.
минутный поиск в гугле... "честный Си" без библиотек
Более короткое и менее ресурсоёмкое решение.
Заодно и дни недели считает. Если интересна теория, то вот здесь.
Вау! ЕвгенийП, спасибо большущее, заберу себе вкапилку.
Более короткое и менее ресурсоёмкое решение.
Заодно и дни недели считает. Если интересна теория, то вот здесь.
Начал читать и в самом начале нужная формула плюс ваш код и вуаля... Три строки а насколько просто.
Я конечно попробовал под свои нужды своим разумением НО работает !!!! Респект Вам.
Всем огромное спасибо за отклик, сам нескоробы нашёл нужное (искал нетам вовсе, ближе к таймерам)
Всем огромное спасибо за отклик, сам нескоробы нашёл нужное (искал нетам вовсе, ближе к таймерам)
в качестве благодарности за решение может поясните нам логику... почему "искал в таймерах"?
Тот код, что выше кода Евгения - я нашел в Гугле за 1 минуту по самому тупому запросу "разность между двумя датами". Почему вы не пошли этим путем?
UPDATE... вчитался в тему, вопрос снимается. Вы даже для форума сумели сформулировать задачу только к пятому сообщению...
Учитесь выражать свои мысли и ставить задачи правильно - тогда и форумы не нужны будут. Если правильно спрашивать - все ищется в гугле за пару минут.
Я искал по пути... получить дату от текущей прибавлением....., и всё в этом духе. С помощью библиотек часиков такое можно было, но хотел именно математически посчитать. В основном примеры попадались именно отсчёта, тоесть задано время\дата - выполнить функцию по истечении millis. Тут море, суточные и недельные.... А вот посчитать именно кол-во дней между двумя датами - ниодного примера (за исключением перевода в unix час.
А понадобилось знать имеено количество прошедших дней - для изменения параметров инкубации. С 1 по 14 - высокая температура, низкая влажность, частое перемешивание, редкое проветривание.... и в конце, низкая температура, однократное перемешивание, высокая влажность, частое проветривание.
Само собой это и руками настраиваю в вэбинтерфейсе но вдруг подзабыл - тут сравниваются условия, если записанные в диапазоне ДОСТАТОЧНОГО то не менять, а если ниже то изменить к минимально НЕОБХОДИМЫМ.
Осталось паруд ней до вылупления - и тут я обещался выложить проект инкубатора с фото и видеоматериаллом, малоли кому пригодится.
ну вот опять... к чему этот поток слов?
Ок, я understood
А можно объяснить "const" в параметрах функции?
[А можно объяснить "const" в параметрах функции?
Не Евгений, но попробую - а потом он поправит, если что.
"const" в параметрах ообщает компилятору, что вы не собираетесь менять этот параметр внутри функции. Таким образом, компилятору не нужно предпринимать специальных действий, чтобы защитить внешние переменные от изменения внутри, например, сохранять копии - что может быть весьма накладно, особенно если переменные - составных типов типа String
В общем, правила хорошего стиля рекоменуют ВСЕГДА ставить "const". если переменная внутри функции не меняется
И не только функции. Это же касается любых констант. Чаще всего это не влияет ни на что, но иногда позволяет луче соптимизировать. А потому: не собираешься изменять - скажи об этом компилятору. нет-нет, да и пригодится.
Кстати, нам не актуально (в силу реализации gcc) но в некоторых компиляторах можно и результат функции обхывать const. Это, например, запретит использовать вызов функции в левой части оператора присваивания.
[А можно объяснить "const" в параметрах функции?
Не Евгений, но попробую - а потом он поправит, если что.
"const" в параметрах ообщает компилятору, что вы не собираетесь менять этот параметр внутри функции. Таким образом, компилятору не нужно предпринимать специальных действий, чтобы защитить внешние переменные от изменения внутри,
Меня терзают смутные сомненья...
Тогда почему этим правилом массово пренебрегают? Уж в стандартных отлаженных библиотеках и примерах эта конструкция должна мельтешить сплошь и рядом, не? И в готовых больших проектах?
Меня терзают смутные сомненья...
Чисто мое мнение.
Это сделано для того, что бы при компиляции, если вы изменяете такую перемнную, компилятор вам про это рассказал. То есть это такой самоконтроль.
В реальности же в процедуру передается копия переменной, которую вы можете править сколько угодно, по окончании процедуры она просто уничтожается.
Не, ну понятное дело, что параметры передуются по значению. Я же писал в #15 для чего нужны const, причём не только в параметрах, а и при описаниях всего чего угодно (параметр - разновидность описания). Не собираешься изменять - пиши const, просто хорошая привычка. И случайно не изменишь, и, может быть, оптимизации поможешь.