Russian Arabic English French German Hungarian Japanese Romanian Turkish Ukrainian

Кухонный таймер "Чтота".

   Всё началось с горелых кастрюлек, почерневшей яичниц выкипевшего супа: этот список мог бы продолжаться долго, если бы однажды взрыв банки со сгущёнкой не прервал мой сладкий сон... спросонья подумалось, "нужно Что-то делать!". Это "Чтота" тут же было решено делать максимально юзабельным, т.к. истории известна масса примеров, когда устройство получались настолько совершенным, что его применение по назначению уже не представляется целесообразным. Конечно же меня тревожило, не покажется ли идея "запомнить что через 3 минуты нужно выключить пельмени" более рациональной, чем тискать хитрые комбинациях множества кнопок, а затем в ожидании готовности, дергаться в сомнениях, "а нажата ли кнопка старт??". Вывод стал очевиден, в устройстве должна быть кнопка, колёсико, индикатор, и НИЧЕГО лишнего!

     Алгоритм работы, "нажать кнопку, крутнуть колесиком сколько нужно, как запищит, прибежать и выключить газ. В общем, концепт "юзабилити" показался таким соблазнительным, что отразился и на конструкции. Подумалось, зачем всё это, какие-то стабилитроны, подтяжки и конденсаторы на ресетах, ведь и так всё будет работать! Народная мудрость даже есть (чем проще, тем надёжней). Если кто-то с большим уважением относится к правилам построения надёжной схемотехники, буду рад прикрепить сюда вариант вашей доработки платы. У меня же всё предельно просто, резисторы на индикатор подбирал амперметром, при 150 Омах течёт порядка 7 мА. ИК-светик подогнал на 3 мА, резистором 430Ом, фотоприёмник сдвоенный, сковырнутый из неживой мышки, подтянул на минус резисторами по 20 кОм (надёжно начинал срабатывать с 6-ти кОм, а на 100кОм я упёрся в предел своего магазина сопротивлений, т.е. по крайней мере в моём случае он свободно может быть +/-10кОм)). Динамик повесил через первый попавшийся транзистор, тут уже как-то за ногу побоялся, да и какая c ее громкость?! Вот и все радиодетали, разве что кварц 4MHz с конденсаторами по 15-20 пик забыл, микруха Attini2313 и два солевых мизинчика.
Сперва я думал сделать неудобный тумблер "вкл/выкл", чтобы обвязка (из которой только фотопара) не ела батарейки когда устройство выключено, но посчитав ноги, решил, что одну можно отжалеть на эти нужды - ток там мизерный, поэтому включил ее как питание, напрямую. Уходя в сон тинька выключает ВСЁ, через что он может убегать оставляя только подтяжку кнопки. Замерял тестером, при работе (без пищалки), устройство ест 7 -9 мА во сне, как и обещано даташитом (около 0.1мкА). Т.е. тестер даже не смог унюхать этого на нижнем пределе, это радует, батарейки скиснут раньше от саморазряда. Далее по списку, в алгоритме работы применил такую хитрость - поскольку время приготовления еды не нуждается в чётком старте, решил, что моментом начала отсчёта будет установка цифры колесом. Т.е. секунды обнуляется каждый раз, как потрогают колесико. Отсюда удобство пользования, например если проверив готовность пельменей вы решите что через 3 минуты они сварятся, а на таймере 5, то всего-то нужно прокрутить минус две цифры, и спокойно возвращаться к своим делам. Ног у тиньки было впритык, от лампочек - "индикация текущих режимов" пришлось отказаться, но сделал "тик-так"-звук на динамик (неожиданно получился очень правдоподобный звук маятника!). Когда писал программу, уже предполагал, что по завершению, выложу ее с исходником здесь, поэтому комментариев у меня там более чем достаточно для того, чтобы при желании разобраться (почти всё подписал!). В общем звуки, продолжительность которых существенна, вынесены в основной цикл (чтобы не мешать программам работающим по прерываниям, в частности динамической индикации и отсчёту времени). Целый регистр я отвёл под ноль, чтоб не писать лишнюю команду и под "флаги", и (у меня это уже вошло в привычку) в разных участках подпрограммы устанавливают или снимают битики в регистре "flajki", так другие подпрограммы узнают, как действовать, в соответствии с текущим состоянием программы. Например, в теле прерывания "TIM1_COMPA" я делаю "sbr flajki,0b00100000", а зацикленное тело программы содержит событие соответствующие этому флажку "sbrc flajki,5 rcall s4el4ek". Споткнувшись о ее, программа узнает что нужно щёлкнуть динамиком. Отсчёт времени организован "четвертьсекундами". В минуте их 240. Они там считаются, и обеспечивают этот красивый звук, "тик-так". Хитрый алгоритм, по которому работает колёсико фотопары оказался до смешного простым (до этого с ними я дела не имел). Один из выходов сдвоенного фотодиода вешается на прерывание "intt_1", и как только оно вызывается(появлением минуса на ноге), проверяется состояние второго выхода. Если там ноль, значит "тень" пришла с одной стороны, если один, значит с другой. Инкриминировать или декриминировать счётчик решается на основании этого. Потом в теле функции прерывания обнуляется "четверть секундовый" отсчёт, и вызывается подпрограмка которая разрешает прерывание "TIM1_COMPA( четверть секундовый отсчёт )". Процессорного времени в избытке, поэтому всё это проделывается каждый раз при провороте колеса, не задумываясь о том, включено ли уже это прерывание. Кнопка вкл/выкл немножко капризничала, поэтому пришлось со всех сторон обвешать её паузами от дребезга, и контролем отпускания, в результате получилась красивая фишечка (надпись "OF" , высвечивающаяся при выключении). Уходя в сон, как выяснилось, необходимо выполнить команду "sei", разрешив прерывания (в принципе это и логично). Ещё я там намудрил, заставив, выходя из сна перенаправлять программу на "Reset" (это был так сказать "выбор пути наименьшего сопротивления". Меня стали терзать сомнения, что же окажется в буфере обмена, когда из тела функции программу бросает в ее же саму, что окажется в буфере и как действовать когда выкручусь. В общем, мысль просто перезапустить программу на фоне этих хитросплетений показалась просто идеальной и не сколечко не повредила функционалу, даже память "RE" не сбрасывается!
Ну вот, вроде идея "сделать идеально простой кухонный таймер" воплощена, как это обычно и бывает, "когда задача показалась слишком простой, хочется ее усложнить". Первым же делом захотелось пристроить лишнюю ногу (PB7). Подумалось, что если сделать из нее простой выход 1/0, и через разъёмчик пустить сигнал на нехитрое внешнее устройство "размыкатель цепи", то получится ВДВОЙНЕ полезная вещь! Скажем, поставить аккумы на зарядку (а то я как раз накануне слегка поджарил комплект, забыв своевременно снять с зарядки). Индикатор у меня 7-ми сегментный, а ног в порту B - 8. С тем, в каких участках программы расставить sbi-cbi вопросов не возникло, но динамическая индикация выводит сразу байт в (portB). Тут вспомнилась замечательная пара команд, "bst и bld" Получилось очень красиво.

Кухонный таймер "Чтота".    Затем, из-за того, что процедура кнопки оказалась такой удобной (помните, при нажатии ее на экране горит надпись "OF", буквально парой новых строк, и дублированием кусочка кода (с косметическими правками), был приделан наворот - если ее прижать и держать, то с промежутком в секунду на экране высвечиваются надписи "OF", и "RE". Если отпустить, когда там будет "RE", то загрузится последнее накрученное колесиком значение и включится обратный отсчёт (скажем, варится у вас горох, вы не знаете когда он приготовится и решили посматривать - как он там, через каждые 5 минут. Нужно просто придавить кнопку и ждать пока не высветится надпись "RE", после чего отпустить кнопку.
"Аппетит приходит во время еды". Следующим наворотом стал "СE"-кундомер. Ну, в самом деле, все функции готовы, что там делов, настроить ещё один дубликат, чтобы счёт шел в обратном направлении. Подумано - приделано. Сделал это аккуратненько, в "память последнего значения для "RE"-старта записывается КАЖДАЯ четверть секунда. Скажем, проявляете вы фотографии, запустили-выключили секундомер как положено, убедились что время подобрано хорошо (например 27 секунд (секунды он не покажет, только минуты, но то что это именно такой промежуток времени, будет помнить чётко, с точностью до четвертьсекунды)). Как и в классическом секундомере, кнопка в этом режиме действует, как старт-стоп попеременно не обнуляя значения. Чтобы обнулить секундомер, придётся или снова выбрать его через меню " *OF* *RE* *SE*", или выключить-включить "Чтота". Так же была приделана блокировка колесика по переходу в режим "RE" из "SE"-кундомера, а то случайно задев его потеряются выставленные секунды. Чтоб колёсико снова заработало, нужно сделать "выкл-вкл".
Приделывая и тестируя режим секундомера, наткнулся на один косяк - отсчёт до нуля выставленного колесом значения подразумевает, что как только на экране появляется 0, сработает сигнал, а если на секундомере прошло всего несколько секунд, и на экране всё так же горит 0 минут, то обратный отсчёт УЖЕ будет нулевым, и следовательно состояние, при котором должен сработать сигнал, так и не наступит. Счётчик провалится на 99 минут, а если натикало минута + несколько сек, то посчитав секунды, наступит состояние "0", и целая минута как бы пропадёт в никуда (сперва долго тупил над этой логической загадкой, потом понял, объяснения этому нет, остаётся править руками) Как выкручивался из этой ситуёвины, описал в коментах.
Когда всё было закончено, захотелось встроить в "Чтота" изюминку. Что как не мелодия способно преобразить микрушку? Для этого я обратился за помощью к форумчанам. Огромное спасибо откликнувшимся. Мой выбор пал на гимн СССР, сделанный на ШИМ-е из статьи этого же сайта. Пошаманив немного, не с первой и не третьей попытки код удалось адаптировать под своё устройство (в который раз вспомнилась народная мудрость, "проще сделать самому, чем исправить под себя чужое", но, в конце концов я это сделал).
Подготовил этот релиз с мыслью, что устройство уже и так гораздо более функционально, чем задумывалось, а мне снова хочется приделать навороты. Делать, конечно, хорошо, но когда-то нужно и начинать пользоваться! Если кто решит сделать себе "Чтота", не поленитесь припаять микруху на колодке. Сейчас, наверное, я займусь созданием прошивки "Чтота v. 1.1"
Ожидается пополнение функционала режимом "ЧС"-[Часы].[десятки минут] - (в старшем разряде часы выставляются, а в младшем десятки минут) для случаев, когда требуется поставить таймер на длительное время (например зарядка аккумуляторов на несколько часов), и маленькая фишечка *НC*-(Нет Сирены). Чтобы устройство по завершению тайминга самостоятельно выключалось (когда нет возможности проконтролировать завершение работы таймера).

Последний абзац.
   Таймер имеет экран, кнопку и колёсико. После включения кнопкой, на экране высвечивается *0*. Колёсиком выставляется время тайминга (прокрутка зациклена и можно выставлять от нуля в минус, 0 - 99 - 98 - 97---). Отсчёт начинается автоматически при выставлении каждого нового значения, и всегда стартует с 59 секунд. Во время отсчёта, звучит "тик-так-тик-так" похожий на звук маятника По завершению отсчёта звучит гимн СССР, после чего,: пи:пи:пи:(до тех пор, пока его не выключат). Однократное простое нажатие на кнопку выключает устройство. Если прижать и удерживать, то на экране попеременно с промежутком в секунду загораются надписи - "OF" "RE*" "CE". Это названия режимов. Чтобы выбрать один из них, нужно отпустить кнопку, пака надпись на экране.
"OF" - Выключить.
"RE" - Повторный запуск отсчёта. Из памяти загружается последнее выставленное колёсиком/секундомером значение (в процессе отсчёта колёсико по-прежнему активно, и позволяет вносить изменения!). Память для повтора не сбрасывается после выкл-вкл.
"CE" - Секундомер. В этом режиме простое нажатие кнопки запускает - останавливает секундомер, колесико заблокировано, переход в любой другой режим (а так же выключение) осуществляется так же длительным нажатием клавиши - "OF" "RE" "CE". Выбор "OF" выключит. Выбор "RE" запустит повторный отсчёт суммарного времени, которое насчитал секундомер (колесико будет заблокировано!). Выбор "CE" обнулит значение секундомера.
Я использовал поверхностный монтаж (я предпочитаю подогнуть ножки у микрухи, и поставить на контакты, даже если она DIP), оптопара вынесена (на платке контакты для припаивания проводов), резисторы сделал для каждого сегмента (на схеме изображено иначе, там для каждого символа один общий резистор).
Включенные фьюзы: CKSEL0, CKSEL1, SUT1, CKDIV8. ШИТЬ КОНТРОЛЛЕР ОТДЕЛЬНО, платка рассчитана на 3 вольта!

Файлы:
Печатная плата в формате SL 5.0.
Прошивка МК с исходником.

Источник: http://radiokot.ru/circuit/digital/home/59/

Добавить комментарий


Защитный код
Обновить

Рейтинг@Mail.ru Яндекс.Метрика