Можно ли изменить библиотеку RTC, чтобы RTC-сутки проходили за 3(6) реальных часа?
- Войдите на сайт для отправки комментариев
Пытаюсь сделать пчеловодные весы, логика работы описана в http://arduino.ru/forum/programmirovanie/kak-mozhno-krasivee-ofrmit-eti-ify#comment-447055. Использую модуль SIM800l и RTC DS3231 с библиотекой https://github.com/JChristensen/DS3232RTC.
Код для работы с модулем SIM800, как и у всех Незнаек, блокирующий. Но мне необхолимо с периодичностью 10 мин.( +-1мин) определять показания весового датчика. Для этого решил использовать будильник RTC. Т.е. "завожу" будильник напр. на 10:20. Если в это время код заблокирован (поднаята труба SIM800) в RTC DS3231 поднимается флаг сработки будильника. После освобождения кода проверяем флаг, если поднят - взвешиваем и "заводим" на 10:30
Там еще несколько заморочек - перевод SIM и Ардуино в энергосберегающие режимы, вачдог, экран с кнопкой по прерыванию, использование второго будильника RTC DS3231 для задания периодичности "поиска сети" в случае ее потери (это шоб батарейку быстро не сожрало)...
Все это хозяйтво требует длительного тестирования. И тут главная засада!!! Надо, что-бы монитор порта не отключался суток 10 или даже больше. Было три попытки - и три неудачи! Электричество, жена и я сам!
Главный вопрос - можно ли править RTC - библиотеку так, чтобы ее функционал остался, а время тикало в Н-раз быстрее и как??? Куда копать?
а просто умножить число часов на 3 не предлагать?
Нет, там в РТЦ регистры будильников работают с собственным временем (том, что в РТЦ хранится). А мне именно будильники нужны.
Правьте время в RTC - подводите к будильнику.
Ставить алерты каждые N минут в часах на время отладки - не предлагать?
Нет, там в РТЦ регистры будильников работают с собственным временем (том, что в РТЦ хранится). А мне именно будильники нужны.
если вам не нужно РЕАЛЬНОЕ время - а нужно какое-то свое, то нафига вам вообще RTC ? - пишите на ардуино программный таймер.
Изменить скорость хода часов в RTC без кардинальной переделки железа нельзя.
Нет, там в РТЦ регистры будильников работают с собственным временем (том, что в РТЦ хранится). А мне именно будильники нужны.
а умножить будильники на 3 тоже?
что за детские вопросы....
Ставить алерты каждые N минут в часах на время отладки - не предлагать?
Что это и где почитать?
а умножить будильники на 3 тоже?
что за детские вопросы....
А умножте 23:30 на 3 и , сколько получится и какая это будет дата? А в программе к дате и времени привязана ячейка памяти... Переписать программу? Дайте взрослый ответ.
Кароч, сам задал вопрос - сам отвечу. НЕОЗМОЖНО изменить делитель в РТЦ. Он там где-то глабоко унутрях и доступа к нему снаружи нет. Можно поменять кварц, но не факт, что заработают на повыш. частоте и опять-же как с Ай2Си? А в 3231 внешнего кварца нет вообще. Тут Вы, b707, совершенно правы.
Вопрос снят.
А умножте 23:30 на 3 и , сколько получится и какая это будет дата? А в программе к дате и времени привязана ячейка памяти... Переписать программу? Дайте взрослый ответ.
конечно переписать программу. А вы чего ждали?
умножить 23:30 на 3 совершенно несложно - это будет 22:30 + 2 дня
если вам не нужно РЕАЛЬНОЕ время - а нужно какое-то свое, то нафига вам вообще RTC ? - пишите на ардуино программный таймер.
Изменить скорость хода часов в RTC без кардинальной переделки железа нельзя.
Это идея! Написать на другой Ардуине программку, имитирующую 2321! Спасибо!
Это идея! Написать на другой Ардуине программку, имитирующую 2321! Спасибо!
меня каждый раз удивляет ваша реакция :) Единственный смысл RTC, по-моему - это сохранять привязку к реальному времени между включениями микроконтроллера. Если вам не нужно хранить время в выключенном состоянии - то вам вообще не нужен RTC и эмулировать его (тем более на отдельной ардуине) - нафига?
Все легко делается на той же ардуине.
Все легко делается на той же ардуине.
ТС сам же написал, что не может написать неблокирующий код для работы с SIM800, вот и придумывает себе гемморой.
конечно переписать программу. А вы чего ждали?
умножить 23:30 на 3 совершенно несложно - это будет 22:30 + 2 дня
B707, фальшивые ртц мне нужны для тестирования реальной программы, и изменить ее? И что я тестировать буду? Измененную программу???
B707, фальшивые ртц мне нужны для тестирования реальной программы, и изменить ее? И что я тестировать буду? Измененную программу???
ну так я вообще не понимаю, нафига вам писать "фальшивый РТЦ". Не проще переписать чужую программу весов под свои нужды?
меня каждый раз удивляет ваша реакция :) Единственный смысл RTC, по-моему - это сохранять привязку к реальному времени между включениями микроконтроллера. Если вам не нужно хранить время в выключенном состоянии - то вам вообще не нужен RTC и эмулировать его (тем более на отдельной ардуине) - нафига?
Все легко делается на той же ардуине.
Устрйство в идеале должно работать 24/7. Вести лог. В EEPROM 24С32, что на модуле часов. Чтобы не логировать дату запись ведется в хитром порядке, когда опред, ячейка соответствует определенному дню с начала года (это чтобы потом прочесть можно было и увидеть не простой набор цифр)
При этом работать от аккумуляторов. Ну забыл я акки зарядить, ну не запишется пару дней лог - войны не будет. Зарядил, перезагрузил дата/время - все работает.
И да, не хватает знаний/способностей/ума сделать код неблокирующим. И в сон Ардуину загоняю - та же блокировка. И будильники в РТЦ - костыли. Понимаю. Но оно работает. Кривовато, но работает.
Хочу я это "творение" протестировать. Как? 10 сутк подряд не отключать от компа? Для этого фальшивые РТЦ нужны, чтобы сутки РТЦ( с будильниками и прочей лабудой) протекали не за 24, а , например, за 4 реальных часа. Работает как надо 10 фальшивых суток -радуюсь, нет ищу ошибки. Протестил, подключил настоящие, все.
kolyn , так может вам в принципе поменять логику работы ?
Например каждые 10 минут просыпаться, запросить у RTC текущее время, замерить вес, записать его вместе с отметкой времени в EEPROM. Каждый час будить модем (транзисторный ключ на него поставить), прочитать СМС (вдруг пришла команда запрос веса), ответить на команду - подсчитать вес за период если уж так надо, и опять спать.
kolyn , так может вам в принципе поменять логику работы ?
Например каждые 10 минут просыпаться, запросить у RTC текущее время, замерить вес, записать его вместе с отметкой времени в EEPROM. Каждый час будить модем (транзисторный ключ на него поставить), прочитать СМС (вдруг пришла команда запрос веса), ответить на команду - подсчитать вес за период если уж так надо, и опять спать.
Примерно так и работает. Только без временных отметок для экономиии места в ЕЕПРОМ . И вес проверять раз/10 мин - резкая потеря веса - вышел рой (размножение пчел) - ТРЕВОГА. Модем в режиме "AT+CSCLK=1", потребление минимум, будит Ардуину прерыванаем с ноги RST при входящем/СМС.
Только обшаюсь не СМС, а так: Я звоню весам. Они снимают трубу, и говорят мне (человечьим голосом на чистом русском языке): "Хотите узнать привес за сутки - нажмите 1, привес за неделю - нажмите два, хотите послушать свежий анекдот - нажмите 666". Я на своем телефоне нажимаю кнопку 1, весам передается ДТМФ-сигнал и они говорят человечьим языком: "Привес за сутки составил 16 кг. 850 гр." Я переключаюсь с телефона на калькулятор, умножаю на количество семей, на цену меда в долларах и довольный потираю руки.
Позже выясняется, что это был глюк и в реале вместо привеса была убыль..
Я не знаю какой вы собираетесь аккумулятор ставить на устройство, но sim800 в спящем режиме потребляет не мало, а если ещё и хочется быть постоянно в online для приёма звонков то о спящем режиме можно забыть.
0.88 мА в режиме AT+CFUN=1: Full functionality (default) - не так уж и много.
а сами пробовали мерять потребление в рабочем режиме?
я может плохо понял даташит, откройте страницу 26 даташита - 0.88 мА потребление это в спящем режиме.
в этом режиме ваш модем не примет звонки.
из практики в спящем режиме он потребляет 1...2 мА, в полном функциональном режиме без звонков СМС и передачи данных ~25 мА.
SIM800H/L_Hardware_Design_V2.01, стр. 26. Гуглеперевод:
4.3.1. Режим минимальной функциональности Существует три режима работы, которые можно установить с помощью команды AT «AT + CFUN = <fun>«. Команда обеспечивает выбор уровней функциональности <fun> = 0,1,4. AT + CFUN = 0: минимальная функциональность. AT + CFUN = 1: полная функциональность (по умолчанию). AT + CFUN = 4 : Режим полета (отключить функцию RF) Ниже табличка:0 -0.66мА; 1-0.88мА; 4 -0.76 ма.
Сам не мерял. Даташиты врут
в табличке написано "sleep mode"
удачи в проектировании с такими мыслями про даташиты
Ужость! Как жить-та?
Есть китайские ватты, метры, литры, даже штуки... Пдочему бы не быть китайским ДШ? ;))
Есть китайские ватты, метры, литры, даже штуки... Пдочему бы не быть китайским ДШ? ;))
думаю что дело не в том, что даташит врет, а в том что вы его неправильно перевели или не поняли. Попробуйте посмотреть не кривой гуглоперевод, а оригинал.
А еще правильнее - померяйте реальное потребление своего модуля, которое может и не совпасть с даташитом.
Есть китайские ватты, метры, литры, даже штуки...
да много чего есть: американские лошадиные силы, американские мили - до фига всего есть.
А вопрос как жить-та остаётся.
Ставить алерты каждые N минут в часах на время отладки - не предлагать?
Что это и где почитать?
https://datasheets.maximintegrated.com/en/ds/DS3231.pdf - раздел Alarms. Ваш будильник - это тоже alarm, настроек у алармов кучу, можно взводить каждые N минут, например. Выдержка из даташита:
The alarms can also be programmed to repeat every second, minute, hour, day, or date
в табличке написано "sleep mode"
удачи в проектировании с такими мыслями про даташиты
И я о том же. Из руководства по АТ- командам AT+CSCLK= р, р=0 - Disable slow clock, не знаю как перевести, медленные часы?, модуль не в "sleep mode".
р=1 "Медленные часы включеы??" и управляются DTR. DTR высокий (или не подключен, проверено) - "sleep mode", на АТ не реагирует , энергопотребление падает ( не скажу на сколько в абсолютных цифрах, т.к измерял на входе DC\DC, питающего SIM800). При установленном по умолчанию AT+CFUN=1 принимает звонок, в сериал ничего не шлет, опеделить наличие звонка можно только по изменению сигнала на выводе RING c "1" на "0". Вывести из "sleep mode" - подать на DTR низкий уровень, через 50мсек модуль очухается и начнет принимать АТ- команды.
Р =3 - засыпает автоматически после некоторого бездействия, просыпается при приходе чего- либо в Rx, причем первая команда должна быть фиктивной ( просто разбудить), последующие модуль восринимает.
А про ДШ была просто шутка.;)
UPD. Если AT+CSCLK= 1 и на DTR подана "1", т.е. установлен режим "sleep mode" и пришел звонок, потребление резко возрастает (видимо радиомодуль врубается на полную). При отбое входящего потребление снова падает до "предзвоночных" значений.
Беда спящего режима в том, что на любой внешний чих модем почти сразу просыпается, причём странно, на команды не реагирует, но потребление поднимается. Во всяком случае у меня было так, а учитывая что операторы любят слать всякую рекламную хрень, рассчитывать что модем будет 99 процентов времени мало потреблять - не стоит.
Не подтвердить ни опровергнуть не могу - не проверял. Проверю обязательно. Цифровым - нереально, нужен хотя бы стрелочный (оценить порядок цифр). В идеале - такой, как у Гаммона, дык где ж его взять.
Хочу я это "творение" протестировать. Как? 10 сутк подряд не отключать от компа? Для этого фальшивые РТЦ нужны, чтобы сутки РТЦ( с будильниками и прочей лабудой) протекали не за 24, а , например, за 4 реальных часа. Работает как надо 10 фальшивых суток -радуюсь, нет ищу ошибки. Протестил, подключил настоящие, все.
Даю подсказку, время в часах можно устанавливать.
Даю подсказку, время в часах можно устанавливать.
И? Внести изменения в тестируемую программу, что-бы переустанавливать время? Но тогда тестировать я буду измененную, а не исходную!!!
При отбое входящего потребление снова падает до "предзвоночных" значений.
Это сколько в миллиамперах?
Это скорее в попугаях. Мерял китайским показометром на входе ДС/ДС, со стороны 18 вольт. Попытки измерить ток по низкой (4 В) - как и положено - приводят к перезагрузкам. Поэтому пока только оценки "больше - меньше" :( Норм. прибора нет.
И? Внести изменения в тестируемую программу, что-бы переустанавливать время? Но тогда тестировать я буду измененную, а не исходную!!!
Если добавить маленькую функцию, которая потом возьмет и исчезнет, то программа будет, как настоящая.
Та маленькая функция, в момент побудки будильника через десять минут, берет и переводит часики на девять минут вперед, и все.
Вы сказали, что Вам нужен быстрый лонгтест. Реальные события за десять суток, типа ураганов, отключения искричества и прочих прелестей бытия, конечно она не сэмулирует.
Если добавить маленькую функцию, которая потом возьмет и исчезнет, то программа будет, как настоящая.
Та маленькая функция, в момент побудки будильника через десять минут, берет и переводит часики на девять минут вперед, и все.
[/quote]
К сожалению там задействован второй будильник, который в случае "пропадания сети" будет устанавливать время следующего "поиска сети" - если искать постоянно, то батарей не хватит и на сутки. А сеть может пропасть и на 5 минут, и на 1.5 суток. Там логика другая: 5минут, 5минут, 10, 10, 30, 30, 1 час ...
Можно, конечно, тестить их по отдельности - так, как Вы предложили, но...
Пока писал проскочила мысля (как раньше не додумал) повесить обе функции на один будильник, кратный 5 минутам.
Буду подумать. Спасибо.
UPD. Если сделаю так - там минус строк сорок моего быдлокода. Еще раз спасибо!!!
Нет. Спасибо мало! Хорошо бы... мёда!)
kolyn, вы усложняете себе задачу, причём не имея опыта в таких делах. Сделайте как выше уже писалось - каждые 10 минут мерять вес, раз в сутки отправлять итоги по смс, остальное время спать. А то получается вы хотите и рыбку съесть и аккумулятора чтоб на долго хватило.