Реально задолбали часы!!!
- Войдите на сайт для отправки комментариев
Добрый день уважаемые. Все как всегда банально но с изьяном. Имею конструкцию arduino nano к ней модуль ds1307 и модуль реле (на 4штуки) Все стандартно! Никакого самопая. Вот скетч :
#include <iarduino_RTC.h> iarduino_RTC time(RTC_DS1307); uint8_t old_min ; // показание старых минут int8_t flag = 1 ; // флаг для переключения каналов void setup() { delay(300); Serial.begin(9600); time.begin(); old_min = 1; pinMode(10, OUTPUT); pinMode(11, OUTPUT); digitalWrite(10, HIGH); digitalWrite(11, HIGH); } void loop(){ if(millis()%100==0) // Serial.println(time.gettime("m")); // выводим время uint8_t new_min ; // локальная переменная для новых минут new_min = time.minutes; // new_min равна текущим минутам if (new_min != old_min && flag == 1) { digitalWrite(10, LOW); delay(1000); // задержка сигнала на 2 сек digitalWrite(10, HIGH); old_min = new_min; flag = 2 ; } if (new_min != old_min && flag == 2) { digitalWrite(11, LOW); delay(1000); // задержка сигнала на 2 сек digitalWrite(11, HIGH); old_min = new_min; flag = 1 ; } }
Ну что может быть не так?!!! Ну что может НЕработать? выдернуть сигнал один раз в минуту, дать единицу на выход на 2 секунды и все. А через минуту тоже самое но на второй пин.
Неделю уже не могу добить! Естественно плюнул на 1307 и заказал ds3231.
Естественно уже все манипуляции провел:
1) Развел отдельно камень от релюшек и катушку потребления убрал на 3 метра от арды (ардуина перестала хаотично вырубаться)
2) на 1307 провел все манипуляции по "прокачиванию" (убрал плечо подзарядки, убирал батарейку вообще, ставил другую, не перегревая менял кварц с материнки, просто еще раз менял кварц на новый, ставил на кварц типа экрана в виде медной пластинки,
3) менял саму ардуино.
нихрена не дало. Все равно спешат! Только разница менялась - насколько минут идти быстрее.
Кстати 1307 работала много времени вообще без батарейки, никаких сбоев! Это к тому что некоторвые пишут что невозможно работать без батарейки, но все же может работала только с этим скетчем. Так как ничего особого от часов не требовалось, всего лишь поминутная единица.
Может что в скетче?
Странно....У меня на стене висят часики на базе DS3231, прошло немного больше года, как установил время. Убежали вперед, заразы.......на 12 секунд.
Спросите, как проверяю? По этим http://radioclock.narod.ru/
Реально задолбали часы!!!
Забейте.
зачем вам эта хрень iarduino_RTC.h ? мало нормальных библиотек?
подсажите пожалуйста нормальную библиотеку!
Две проблемы мне кажется- наводки от катушки 24dc( но это устраню, взял домой чтоб осликом посмотреть что там вообще творится.
А вот "бежит" скорее всего программно из-за библиотеки, сейчас попробую со стандартной пример закинуть и сверит через час с компом. Сразу покажет кто -кому должен)))
п.с. уведомление о коментариях не приходили....странно
Может что в скетче?
Попробуй "old_min = new_min" переставить на 3 строки вверх.
сейчас вот сутки поганял модуль чисто часиками, идет точно. А легендарные мои часы "стрела" набегали скорее всего от мусора, так как в логе после дописания скетча, смотрю мусор проскакивает и не хило так. типа 06 в начале строки. Причем мусор этот появляется не в такт тикания- тоисть не тогда когда происходит выброс ЭМИ от 24 вольтовой катушки а хаотично. вчера вечером попробовал дописать вместо 10-ой строки
написал:
случайных чисел в логе не увилел
, да еще попробую вот сейчас перенести "old_min = new_min"
Поковырял дальше код:
Сейчас лог чистый, ХЗ, надо в железе проверять, сместятся тики или нет. Но забегало скорее всего действительно из-за музора. Проверю, отпишусь.
p/s На заметку : Относите катушки с индукивностью нафиг подальше от МК, убивает камень напрочь!(тосить может убить а тактирование вот точно убивает)
А вот "бежит" скорее всего программно из-за библиотеки
Как могут аппаратные часы бежать программно?
Как могут аппаратные часы бежать программно?
Непросто, конечно, но специалисты имеются.
Так-так-так Евгений! Прошу не стебать!))
Может я в по и новичек но не в электронике.
Наберите в гугле часы "стрела"- посмотрите как они приводятся в действие. Там 24dc подаётся раз в минуту с одной полярностью а ровно через минуту с обратной полярностью. Задержка сигнала 1сек. В скетче видно, также видно что подключено к 10 и к 11 пину. Тик а через минуту так. Вот так. А вот то что механизм без обратной связи это конечно хреновенько. По моему скетчу тикает но из-за того в нем присутствовал мусор(видно на картинке) тикало лишний раз иногда.
Подскажите лучше библиотеку понадежней;)
Я пользую эту - "Sodaq_DS3231.h"
Я не понимаю какое отношение часы "Стрела" имеют к ds1307. ds1307 - самостоятельня микросхема, которая тикает сама по себе и чтобы заставить из сбоить программно - это надо постараться.
библиотеку понадёжнее подсказать не могу, т.к. в общем-то никогда ими не пользуюсь. Если я купил новый девайс для пробы "жив или спор открывать", я, конечно, запускаю его с какой-нибудь библиотекой, но в проекте - никогда. Только своим кодом. С часами имеено так - я читаю даташит и гоню им нужные команды "ручками" безо всяких библиотек.
А в скетче я вообще не понимаю, зачем Вы так всё усложнили.
1307 умеют выдавать Вам прерывания раз в секунду (а ds3231 так и раз в минуту - самому вообще ничего делать не надо). Это надо использовать, зачем огород-то городить?
Вот вот!
прерывания раз в минуту, я допустим не нашел когда изначально начинал кумекать над часами. а сейчас времени нет на переосмысливание. Библиотеками конечно пользоваться грех, это добавляет корявость в машинный код. По этому я немного начал осваивать Си с STM32, стало немного яснее. Но з ардуиной уже просто нет желания сильно заморачиваться. По этому прелести "фаст-фута" и вылазят. Что по поводу DS1307- модуль очень даже таки рабочий. Внезапные остановки и "забег" часов- все это отловил. Забег происходил из-за мусора а остановки по причине.... даже не знаю как это правильно назвать. Но лучше покажу, так наглядней будет:
можно было вообще без модуля сделать, но он валялся под рукой и хотелось немного практики с ним. Что собственно и вышло. Иногда чейто "огород" может оказаться собственной самозадачей, которую решив и понимаешь что это "огород" ))))
Спасибо за дискусию. Но покажите пожалуйста пару строчек как прерыванием вытащить поминутный сигнал. Думаю очень пригодится мне для STM32
Вы внимательно читали? Поминутный в ds3231, а в 1307 только посекундный.
Не подскажите, какую тему вы используете в своей IDE,
Вопрос ко мне? Ну, не знаю, какая там ставится по умолчанию, такая и есть. Я не так чтобы часто IDE пользуюсь.
Вот вот!
прерывания раз в минуту, я допустим не нашел когда изначально начинал кумекать над часами.
разве что сильно хочется, тогда http://arduino.ru/Reference/AttachInterrupt
а дальше - Ардуина неплохо умеет считать до 60.
Евгений, все верно, по минутный. Мне скоро придёт ds3231:) с этим по-ходу ясно. Библиотека косячила, сейчас использую другую, пока работают правильно.
Имасофт: это обычная ide модифицированная в ручную. Мне легче так понимать кто-есть кто.
Тему сами разресовывали или готовую где-то взяли?
Сам . там файл править надо. Посмотрел в гугле пример и сам себе сделал.
Понятно, а я думал что за основу взяли DarkArduinoTheme, больно уж похожа на нее, не поделитесь своим творением?
На дрюбокс ссылка пойдёт? Честно сказать -не знаю может и дарк, я не заморачивался с белой делал. Теперь папка theme кочует с обновления к обновлению. Возмете папку и заменитель на свою. Свою естественно сохранив отдельно. Через минут 30 выложу. (Сейчас с телефона)
вот https://www.dropbox.com/sh/vfnhbyw50kqd4ti/AAA_Z321gKGaLz5mPvUgJvpba?dl=0
Спасибо, симпатичная!
разве что сильно хочется, тогда http://arduino.ru/Reference/AttachInterrupt
а дальше - Ардуина неплохо умеет считать до 60.
[/quote]
сейчас вот работает нормально но , но пока сидел в комнате - один раз все таки проскочило (за 3 часа) два раза, тоисть сразу был и тик и так. Все таки где то берется мусор в переменную old_min.
Вот я и подумал о прерываниях, для надежности.
Или же остаться при нынешнем положении использовать математику для исключения случайных вбросов мусора. типа:
в этой задаче вообще прерывания не нужны, достаточно digitalRead().
Ну, это Вы погорячились :)
в этой задаче вообще прерывания не нужны, достаточно digitalRead().
Ну, это Вы погорячились :)
считать импульсы на SQW/OUT с частотой 1 герц - что там горячего?
Даже не Герц, герц это от безусходности. Как только получит 3231, ТС сделает частоту 1/60 Герц. Но всё равно это лучше делать по прерыванию. Это же часы. Минуты нужно переключать точно в момент перехода часов на новую минуту, а не в тот момент, когда спросили digitalRead и обнаружили, что минута уже сменилась (как давно - хз). Вот для отлавливания точно момента перехода и существуют эти импульсы.
Даже не Герц, герц это от безусходности. Как только получит 3231, ТС сделает частоту 1/60 Герц. Но всё равно это лучше делать по прерыванию. Это же часы. Минуты нужно переключать точно в момент перехода часов на новую минуту, а не в тот момент, когда спросили digitalRead и обнаружили, что минута уже сменилась (как давно - хз). Вот для отлавливания точно момента перехода и существуют эти импульсы.
С точки зрения программизма - да, пожалуй, лучше на прерываниях. Но не обязательно.
Давайте вспомним о задаче: раз в минуту передвинуть стрелку на вторичных часах "Стрела". Какая нужна точность для чудовищно неповоротливого (с точки зрения ардуины) механизма?
Предположим, "неправильная" программа2 подаст сигнал digitalWrite аж на 40000(!) микросекунд позже, чем "правильная" программа1. А в следующую минуту - на 700 микросекунд. Вы стоите на площади и смотрите на часы - Вы эту разницу увидите?
=================
У оригинальной системы "точность момента перехода к новой минуте" обеспечивалась узлом "храповое колесо". Я эту "точность" даже приблизительно оценить не возьмусь.
Ну, так с прерываниями меньше кода (а значит меньше ошибок), не нужно бояться делэев и прочих длинных операций в loop и вообще - это архитектурно более правильно, а потому способствует привитию правильных навыков и подходов. Как-то так.
Как вытащить по-минутные прерывания с 3231 :)
С прерываниями ещё дело не имел :(
Ну, так с прерываниями меньше кода (а значит меньше ошибок),
Для остальных - не факт. Всё-таки использование прерываний требует более глубокого понимания логики всего скетча. И ещё - Вы не используете чужие библиотеки, а так пишут далеко не все.
Так-то оно так.
Но где-то на просторах этого форума есть фраза (в пересказе) "Если можно обойтись без прерываний, лучше обойтись без прерываний". ИМХО, такой подход тоже имеет право на жизнь, особенно для начинающих.
Что касается правильных навыков и подходов - далеко не всем и не всегда они нужны. В каких-то случаях (например, заведомо одноразовая разработка для себя) простой и надежный китайский код для новичка предпочтительней, чем красивый с многоуровневыми вложениями, прерываниями и регистровыми сдвигами кошмарного вида.
/2 - по-людски в исходном вопросе желательно переделывать железо на выходе (реле с индуктивной нагрузкой на контактах при постоянке 24 в - не самое лучшее решение) и добавлять кнопки и, соответственно, функциональность программы.
Ну, знаете, тут проблема. Я же не пользуюсь библиотеками. Я могу Вам дать свой код, но там почти всё своё ....
Давайте так, я сейчас дам Вам код какой-то библиотеки, в которую я вставил возможность включения ежеминутного прерывания. Откуда скачана библиотека - не знаю, мне её дал такой же начинающий коллега, как Вы специально, чтобы я эту функцию для него добавил. Вот библиотека. Там есть функция EnableMinuteInterrupt - она Вам и нужна.
Впрочем, смотрите и мой код - мне не жалко, но я предупредил .... Этот кусочек кода собственно и есть инициализация часов и включение этого прерывания. Там есть ещё одна полезная фича - включение осциллятора и очистка OSF при инициализации.
Для того, чтобы воспользоваться моим кодом,
1. найдите у себя в папке <корень ардуино>\hardware\arduino\avr\libraries\Wire\utility файлы twi.c и twi.h
2. скопируйте эти файлы в папку своего скетча
3. В файле twi.h, после строки "#include <inttypes.h>" (у меня она 23-я) добавьте строки
4. Ну и, наконец, вот он скетч
Всё нормально, инициализирует часы, включает ежеминутное прерывание и слушает его. Чтобы "слушать" прерывание необходимо пин (второй или третий - в моем примере 2-ой) соединить с пином SQW часов.
Кстати, имейте в виду - слушание этого прерывания занимает будильник №2. Будильником №1 можете пользоваться по своему усмотрению, а №2 уже занят.
где-то на просторах этого форума есть фраза (в пересказе) "Если можно обойтись без прерываний, лучше обойтись без прерываний". ИМХО, такой подход тоже имеет право на жизнь, особенно для начинающих.
С этой фразой согласиться не могу (на просторах этого форума понаписано много ... эээ ... спорных утверждений). Впрочем, не знаю, начинающим программистом я был 38 лет назад :)
Евгений, после такого кода я ушёл на долго)))
Так берите библиотеку. Навеняка её нетрудно найти на гитхабе (типа, чтобы примеры были), а изменения в неё я уже сделал.
часы тикают уже два месяца без проблем,
народ, подскажите пожалуйста как обойти проблему(она только для меня эта проблема)
с выводом инфы с часов в виде: 2017/9/27 12:34:5
часы тикают уже два месяца без проблем,
народ, подскажите пожалуйста как обойти проблему(она только для меня эта проблема)
с выводом инфы с часов в виде: 2017/9/27 12:34:5
А куда и как оно сейчас выводится?
Ну, Вы используете "библиотеку" <time.h>? Или <stdio,h> Что тас у Вас вообще под рукой есть? Найдётся ли с полкило свободной памяти в области программы?
на OLED.(часы и не привычно видеть "без ноля")
место найдется .
а библиотека Sodaq_DS3231.h
Блин, ну давайте по шагам
1) Вы можете на свой OLED вывести строку описанну как массив символов? Если у Вас будет строка типа "05:51:00 28.09.2017" Вы сумеете её вывести?
2) Вы можете получить по отдельности как числа значние часов, минут, номер месяца там и всё остальное?
Стоп, я протупил.
написал для примера, а вообще нужны только часы и минуты.
"2) Вы можете получить по отдельности как числа значние часов, минут, номер месяца там и всё остальное?"
конечно могу, там же разные команды для каждой величины.
Так строку можете вывести на экран? Вы не ответили
найду способ. в принципе не проблема.
Ну, тогда, если считать, что часы. минуты и т.д. у находятся в переменных hours, munites, и т.д. Пишете что-то типа
После этого строку buffer спокойно выводите на экран. Число 9 в первой строке - максимальная длина получаемой строки + 1. В Вашем случае максимальная длина - 8, стало быть 9
Если требуется также и дата, аналогично
здесь год выводится без века.
Если разорётся, что не объявлена sprintf, вставьте в начало #include <stdio.h>
тоисть типа:
Ну, типа того. Тогда размер буфера - 6.
Евгений, скажите пожалуйста, вы хотите меня в сатанисты записать? ))))))))))
да уж, не разбираюсь в тонкостях...
при строке:
в сериал выводит нормально, правда сейчас 11:46 и ноля еще не увижу 15 минут (часы не охота сбивать)
на OLED наверное не правильно отсылаю
в сериал выводит нормально, правда сейчас 11:46 и ноля еще не увижу
Увидите. Формат %02d означает: число шириной 2 знака, при необходимости дополненное слева нулём. Так что, куда оно денется. А с OLED разбирайтесь, я не зря спрашивал можете ли Вы туда строку вывести :)
все ок)
sprintf(buffer, "%02d/%02d", houre,minutu); - (символ / )
с ":" был мусор.
сейчас 12:06 а не 12:6
СПАСИБО!!!
Вообще-то никакого мусора быть не должно. Разве что функция вывода из библиотеки OLED символ ':' как-то особо отрабатывает - этого я не знаю.