Представляю вашему вниманию очень простые часы на МК Attiny2313. Особо в них в тот момент не нуждался, но руки чесались что нибудь сделать на микроконтроллере, в плане освоения его работы. Итак, меньше слов — больше дела. Схемотехника часов проста как валенок, смотрим принципиальную схему (а если надо её увеличить, чтоб получше разглядеть — кликаем): Для удобства работы, приобрёл семисегментный четырёхразрядный индикатор CC56-12YWA. Порылся, оказалось память меня не обманула, и он действительно лежал там. Смотрю параметры на выходе: 5 V, 350mA. Вполне нормально для питания электронных часов, подумал я, и начал его ковырять. Вскрыл, включил, проверил — на выходе оказалось 5,07 вольт. Теперь собираем всё это во что-нибудь подходящее по размерам, долго с корпусом не мучился, на глаза попалась пластмассовая мыльница — её и приспособил, правда получилось не совсем аккуратно, но зато работает, как часы 🙂 Удачи в сборке, с вами был Fenix.Обсудить статью ЧАСЫ НА ATTINY |
radioskot.ru
Дальше те, кто знают как изготавливаются платы поймут, что я перевёл рисунок утюгом на текстолит, протравил, залудил и т.д., а те, кто не в курсе — почитайте в интернете про изготовление плат методом ЛУТ — (Лазерно-утюжная технология).
результат я заснять забыл, но думаю, что качество будет видно и на готовой плате:
Видно места, которые не взялись, но ничего страшного не случилось, отстал только полигон.
Дальше нужно было запаять компоненты, на которых я особо останавливаться не буду, только оставлю их список:
$regfile = "attiny2313.dat" $crystal = 8000000 Dim Count As Byte Dim Number(4) As Integer Dim Pointmem As Byte Dim Point As Bit Dim Mine As Byte Dim Hour As Byte Dim Seco As Byte Config Porta.1 = Output Porta.1 = 1 Waitms 10 Porta.1 = 0 Waitms 70 Porta.1 = 1 Waitms 10 Porta.1 = 0 Config Portb = Output Config Porta.0 = Output Config Portd.2 = Output Config Portd.3 = Output Config Portd.6 = Output Config Sda = Portd.5 Config Scl = Portd.4 Config Pind.0 = Input Portd.0 = 1 Config Pind.1 = Input Portd.1 = 1 Config Timer1 = Timer , Prescale = 64 On Timer1 Awake: Config Timer0 = Timer , Prescale = 64 On Ovf0 Refresh Dig1 Alias Porta.0 : Dig2 Alias Portd.2 : Dig3 Alias Portd.3 : Dig4 Alias Portd.6 Enable Interrupts Enable Ovf0 Enable Timer1 Start Timer1 Hour = 0 Mine = 0 If Pind.1 = 0 And Pind.0 = 0 Then Porta.1 = 1 Waitms 100 Porta.1 = 0 Hour = 0 Mine = 0 Seco = 1 Seco = Makebcd(seco) I2cstart I2cwbyte &HD0 I2cwbyte 0 I2cwbyte Seco I2cstop Mine = Makebcd(mine) I2cstart I2cwbyte &HD0 I2cwbyte 1 I2cwbyte Mine I2cstop Hour = Makebcd(hour) I2cstart I2cwbyte &HD0 I2cwbyte 2 I2cwbyte Hour I2cstop Waitms 1000 Porta.1 = 1 Waitms 10 Porta.1 = 0 End If Do I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Hour , Nack I2cstop Seco = Makedec(seco) Mine = Makedec(mine) Hour = Makedec(hour) If Seco = 80 Then Seco = 10 Seco = Makebcd(seco) I2cstart I2cwbyte &HD0 I2cwbyte 0 I2cwbyte Seco I2cstop End If If Hour > 9 Then Number(1) = Hour / 10 Number(1) = Abs(number(1)) Else Number(1) = 20 End If Number(2) = Hour Mod 10 If Mine > 9 Then Number(3) = Mine / 10 Number(3) = Abs(number(3)) Else Number(3) = 0 End If Number(4) = Mine Mod 10 If Pind.1 = 0 Then Porta.1 = 1 Waitms 10 Porta.1 = 0 If Mine = 59 Then Mine = 0 Else Incr Mine End If Mine = Makebcd(mine) I2cstart I2cwbyte &HD0 I2cwbyte 1 I2cwbyte Mine I2cstop Else If Pind.0 = 0 Then Porta.1 = 1 Waitms 10 Porta.1 = 0 If Hour = 23 Then Hour = 0 Else Incr Hour End If Hour = Makebcd(hour) I2cstart I2cwbyte &HD0 I2cwbyte 2 I2cwbyte Hour I2cstop End If End If Waitms 250 Loop Awake: If Point = 1 Then Porta.1 = 1 Waitus 10 Porta.1 = 0 End If Toggle Point Return Refresh: Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4 Incr Count : If Count > 4 Then Count = 1 If Count = 2 And Point = 1 Then Pointmem = Number(2) + 10 Portb = Lookup(pointmem , Digits) Else Portb = Lookup(number(count) , Digits) End If Select Case Count Case 1 : Set Dig1 Case 2 : Set Dig2 Case 3 : Set Dig3 Case 4 : Set Dig4 End Select Return Digits: Data &B00101000 , &B01111011 , &B00110100 , &B00110010 , &B01100011 Data &B10100010 , &B10100000 , &B00101011 , &B00100000 , &B00100010 Data &B00001000 , &B01011011 , &B00010100 , &B00010010 , &B01000011 Data &B10000010 , &B10000000 , &B00001011 , &B00000000 , &B00000010 Data &B11111111
Прошиваем почти 2 килобайта кода в мк и наблюдаем как только-что ожившее устройство начало служить человеку.
И так, часы готовы, а как они работают? Это я демонстрирую в первой половине этого видео (не прошу подписки или чего-то ещё, просто материал)
habr.com
Простые часы на микроконтроллере.
Представляю на ваш суд простые цифровые часы на микроконтроллере. Индицируют они только часы и минуты. Всяческие новороты, типа будильника и даты, отсутствуют, так как основной задачей было просто индикация времени в темное время.
В качестве индикатора был использован 7-сегментный 4-х разрядный индикатор с общим катодом и объединенными одноименными сегментами. Почему объединенными? Да, просто на плате меньше дорожек и перемычек и все намного компактнее при использовании динамической индикации. О которой, кстати, можно почитать тут.
И вот что получилось на одностороннем стеклотекстолите размерами 60х40 мм:
Кнопкой S2 устанавливают минуты, а кнопкой S3 — часы. Я еще сделал кнопку на сброс (S1), которая позволяет установить время на полночь, иногда бывает полезно, хотя ее можно не устанавливать. Точка, разделяющая часы и минуты, моргает с частотой 1,25 Гц, то есть 0,4 секунды горит, 0,4 сек. нет.
Файлы:
Печатная плата в формате SL 4.0
Прошивка с исходником
Вопросы, как всегда в Форум.
Как вам эта статья? | Заработало ли это устройство у вас? |
Эти статьи вам тоже могут пригодиться:
www.radiokot.ru
Начну с того, что каждый человек живёт во времени, которое, к огромному сожалению, не возможно остановить. И раз мы живём в этом мире, то давайте следить за временем и не упускать ни минуты, тратя её впустую. Для этого я и сделал это чудесное устройство, по имени часы.
На улице встало солнце, я нарисовал плату и почесал на ксерокс, дабы напечатать плату
Дальше те, кто знают как изготавливаются платы поймут, что я перевёл рисунок утюгом на текстолит, протравил, залудил и т.д., а те, кто не в курсе — почитайте в интернете про изготовление плат методом ЛУТ — (Лазерно-утюжная технология).
результат я заснять забыл, но думаю, что качество будет видно и на готовой плате:
Видно места, которые не взялись, но ничего страшного не случилось, отстал только полигон.
Дальше нужно было запаять компоненты, на которых я особо останавливаться не буду, только оставлю их список:
И пускай вас не смущает длина этого списка, ведь мы собираем устройство на долгие года, и оно должно быть собрано на должном уровне!
Кто желает посмотреть на плату с другой стороны, вот фото:
Как и все устройства, часы нуждаются в программе. В данном случае программа написана на языке BASIC в BASCOM AVR. Этот язык очень удобный для программирования, так как код понятный, эффективный и занимает не много места на микроконтроллере. Писать программу с ноля я не стал, а взял исходник одной статьи сайта паяльник. Кто интересуется — найдёт, я же просто оставлю доработанный мною код тут:
$regfile = "attiny2313.dat"
$crystal = 8000000
Dim Count As Byte
Dim Number(4) As Integer
Dim Pointmem As Byte
Dim Point As Bit
Dim Mine As Byte
Dim Hour As Byte
Dim Seco As Byte
Config Porta.1 = Output
Porta.1 = 1
Waitms 10
Porta.1 = 0
Waitms 70
Porta.1 = 1
Waitms 10
Porta.1 = 0
Config Portb = Output
Config Porta.0 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.6 = Output
Config Sda = Portd.5
Config Scl = Portd.4
Config Pind.0 = Input
Portd.0 = 1
Config Pind.1 = Input
Portd.1 = 1
Config Timer1 = Timer , Prescale = 64
On Timer1 Awake:
Config Timer0 = Timer , Prescale = 64
On Ovf0 Refresh
Dig1 Alias Porta.0 : Dig2 Alias Portd.2 : Dig3 Alias Portd.3 : Dig4 Alias Portd.6
Enable Interrupts
Enable Ovf0
Enable Timer1
Start Timer1
Hour = 0
Mine = 0
If Pind.1 = 0 And Pind.0 = 0 Then
Porta.1 = 1
Waitms 100
Porta.1 = 0
Hour = 0
Mine = 0
Seco = 1
Seco = Makebcd(seco)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
Mine = Makebcd(mine)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte Mine
I2cstop
Hour = Makebcd(hour)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte Hour
I2cstop
Waitms 1000
Porta.1 = 1
Waitms 10
Porta.1 = 0
End If
Do
I2cstart
I2cwbyte &HD0
I2cwbyte &H00
I2cstart
I2cwbyte &HD1
I2crbyte Seco , Ack
I2crbyte Mine , Ack
I2crbyte Hour , Nack
I2cstop
Seco = Makedec(seco)
Mine = Makedec(mine)
Hour = Makedec(hour)
If Seco = 80 Then
Seco = 10
Seco = Makebcd(seco)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
End If
If Hour > 9 Then
Number(1) = Hour / 10
Number(1) = Abs(number(1))
Else
Number(1) = 20
End If
Number(2) = Hour Mod 10
If Mine > 9 Then
Number(3) = Mine / 10
Number(3) = Abs(number(3))
Else
Number(3) = 0
End If
Number(4) = Mine Mod 10
If Pind.1 = 0 Then
Porta.1 = 1
Waitms 10
Porta.1 = 0
If Mine = 59 Then
Mine = 0
Else
Incr Mine
End If
Mine = Makebcd(mine)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte Mine
I2cstop
Else
If Pind.0 = 0 Then
Porta.1 = 1
Waitms 10
Porta.1 = 0
If Hour = 23 Then
Hour = 0
Else
Incr Hour
End If
Hour = Makebcd(hour)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte Hour
I2cstop
End If
End If
Waitms 250
Loop
Awake:
If Point = 1 Then
Porta.1 = 1
Waitus 10
Porta.1 = 0
End If
Toggle Point
Return
Refresh:
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4
Incr Count : If Count > 4 Then Count = 1
If Count = 2 And Point = 1 Then
Pointmem = Number(2) + 10
Portb = Lookup(pointmem , Digits)
Else
Portb = Lookup(number(count) , Digits)
End If
Select Case Count
Case 1 : Set Dig1
Case 2 : Set Dig2
Case 3 : Set Dig3
Case 4 : Set Dig4
End Select
Return
Digits:
Data &B00101000 , &B01111011 , &B00110100 , &B00110010 , &B01100011
Data &B10100010 , &B10100000 , &B00101011 , &B00100000 , &B00100010
Data &B00001000 , &B01011011 , &B00010100 , &B00010010 , &B01000011
Data &B10000010 , &B10000000 , &B00001011 , &B00000000 , &B00000010
Data &B11111111
Прошиваем почти 2 килобайта кода в мк и наблюдаем как только-что ожившее устройство начало служить человеку.
Чесно сказать, я испытываю невероятное удовольствие от того, что могу создать нечто такое, что для многих далёкое и не понятное)
Так выглядит устройство без корпуса, корпус буду делать после написания статьи:
И так, часы готовы, а как они работают? Это я демонстрирую в первой половине этого видео (не прошу подписки или чего-то ещё, просто материал)
Таким образом, за 2 дня я сделал устройство, которое покажет мне, сколько мне осталось заниматься одним делом и переходить к другому, когда пора идти, или начать что-то важное.
Ну а на этом всё, спасибо тем, кто дочитал до конца, успехов вам в ваших проектах, и как говорится: «треска вам, 47, и до встречи на других частотах! QRZ..»
Автор: TehnoPingvin
Источник
www.pvsm.ru
Протые часики с секундами на 7ми сегментных индикаторах с календарём и термометром, + 6 эффектов индикации.
Мой НОВОГОДНИЙ ПОДАРОК.
ВСЕХ С НОВЫМ 2014м ГОДОМ.
Это простеникие часики — термометр на семисегментных светодиодных матрицах с общим анодом.
Что они могут:
Дата: (Дата — Месяц — День недели)
Температура дома:
А это датчик на улицу выкинул:
6 режимов индикации:
Автопоказ даты и температуры каждые 35 секунд.
Описание кнопок:
Кнопка «-» в режиме установки часов и кнопка перебора режимов индикации в рабочем режиме часов.
Кнопка «ОК» — для входа в режим установки часов.
Кнопка «+» в режиме установки часов и кнопка показания даты и температуры в рабочем режиме часов.
Перебор режимов индикации:
Жмём кнопку «-» — перебор режимов индикации.
Появится:
Первый режим индикации — цифры плавно гаснут и плавно появляются новые.
Жмём ещё раз
Появится:
Второй режим индикации — часики работают как обычно.
И ещё раз
Появится:
Третий режим индикации — цифры при смене меняются перебором.
Ещё раз нажимаем
Появится:
Четвёртый режим индикации — цифры при смене накладываются друг на друга.
Ещё одно нажатие
Появится:
Пятый автоматический режим индикации — режимы индикации сами меняются каждый час.
И ещё одно нажатие
Появится:
Шестой автоматический режим индикации — режимы индикации сами меняются каждые сутки в 00:00.
Включение / выключение автоматического показа даты и температуры каждые 35 секунд.
Жмём и держим в течении 3 секунд кнопку «+» — показ даты/температуры.
Если появится:
Автопоказ выключен.
Автопоказ включен.
Установка времени:
Для установки времени жмём и держим кнопку «ОК» в течении 3х секунд во время показа времени.
Часы переходят в режим установки времени и начинают мигать часы.
Кнопками «-» и «+» устанавливаем час и нажимаем кнопку «ОК» и переходим к установке минут.
И так далее в последовательности час > минуты > число > месяц > день недели.
При долгом удержании кнопок «-» или «+» цифры автоматически сами убывают или прибавляются.
Часы собраны на минимуме микросхем:
PIC16F628 — контроллер часов.
DS1307 — сами часики.
BU2090 — Дешифратор катодов.
DS18B20 — термодатчик.
DS32KHz — микросхема генератора для точности хода.
Если точность не нужна и вы просто подберёте точный кварц на 32.768
то DS32KHz можно и не ставить.
Схема стандартная.
Схема стандартная №2.
Она нужна если вы будете использовать многосветодиодные индикаторы.
Типа таких:
(фотка)
Для которых 5ти вольт анодного напряжения маловато будет.
Для переключения контроллера на эту схему нажимаем и держим кнопку «-» и включаем часы.
Для обратного перевода делаем тоже самое.
Это команда инвертирует выходные импульсы с контроллера для управления анодными ключами.
Регулируя питание в такой схеме можно менять яркость часиков.
Схемка регулятора яркости:
Настройка катодов, то есть назначение сегментов.
В часах можно использовать любые индикаторы.
Для платы что входит в проект я использовал три светодиодные сборки от модулей стиральных машин DE07-00011A.
Прошивка контроллера рассчитана на использование моей платы для моих индикаторов,
если будете использовать другие или рисовать свою плату
нужно после сборки платы и запуска часов переназначить подключение сегментов к BU2090.
Т.к. их порядок нарушается — например вместо 0ля или 7ка будет белеберда.
Исключение только для точки, если она есть в индикаторе.
Точки надо подключать только к 15му выводу BU2090.
Назначение сегментов:
Сам процесс:
Жмём и держим кнопку «+» и включаем часы — появится 8ка — показывая что все сегменты подключены.
После отпускания кнопки в 1м разряде загорается один из сегментов.
Начинается перебор сегментов.
Надо назначить сегменты от A до G — согласно рисунку ниже:
При зажигании нужных сегментов нажимаем кнопку «+»
и так последовательно от появления сегмента A до G — согласно рисунку.
Затем загорается 2й разряд — это разрешение мигания секундных индикаторов.
На тот случай если вы секундные семисегментники расположите по центру между часами и минутами вместо секундных точек.
Тут так же
Если нажать кнопку «+» на 0 то мигание отключается.
Если на 1 то включается.
После чего часы переходят в рабочий режим.
Платы нарисованы с помощью программы Sprint Layout 5.0
На плате «LED clk» кнопки расположены сверху.
На плате «LED clk_v2» — сбоку.
Плата «LED clk_v3» для 2го варианта схемы — для больших индикаторов.
Сдесь фотка верхней части платы «LED clk_v2» с подписанными элементами для большей наглядности:
А тут со стороны монтажа:
Сдесь фотка верхней части платы «LED clk_v3» с подписанными элементами для большей наглядности:
Тут со стороны монтажа:
Прошивка контроллера Clck_6x14_v7.hex показывает день недели буквами — пН, оР, сР, ЧР, пА, сb, ос.
Почему день недели, а не год? — (Вы меня можете спросить)
Да потому что все и так знают какой сейчас год, а вот с днём недели иногда проблемы возникают.
Прошивка Clck_6x14_v7с.hex имеет коррекцию времени.
В период установки времени после установки дня недели
загораются часы и секунды.
В часах кнопками «-» и «+» устанавливаем время в секундах
на сколько нужно подводить время — диапазон от -4 до +4 секунд.
Затем нажав кнопку «OK» переходим к установке дней.
Если поставить 00, то коррекция будет происходить каждый день в 03:00.
Если 01, то через день.
Если 02, то через два дня.
И т.д. до 31го дня — то есть через 31 день.
Коррекция потребовала места в контроллере поэтому пришлось пожертвовать назначением сегментов.
Но их можно назначить сначала зашив в контроллер прошивку Clck_6x14_v7.hex,
назначить на ней сегменты и мигание секунд,
а потом не трогая EEPROM контроллера зашить прошивку с коррекцией.
Все настройки сохранятся.
Прошивка Clck_6x14_v7сb.hex имеет ещё и будильник помимо коррекции времени.
Чтобы поставить будильник жмём и держим кнопку «OK» в течении 3х секунд.
Когда на дисплее появится время ранее установленного будильника, а секундах появится b1 отпускаем кнопку.
Если кнопку продолжать держать, то мы войдём в установку времени.
Выставляем час и миеуты.
Если поставить 00:00 то будильник отключается.
bumotors.ru
Дата публикации: .
Это мой третий проект на AVR: кухонный таймер. Аппаратная часть основана на микроконтроллере Atmel ATtiny2313, питание от батареи 3.6V, для настройки используется вращающийся регулятор(энкодер) с кнопкой, три семисегментных светодиодных индикатора и пьезозуммер для сигнализации. Программное обеспечение использует некоторые более сложные функции контроллера AVR: прерывание таймера и глубокий режим пониженного энергопотребления. Корпус выполнен из дерева.
Схема очень проста. Светодиодные индикаторы в таймере имеют общий анод и с десятичной точкой расположенной слева. Сегменты подключаются через резисторы 200 Ом к выводам контроллера, а общие аноды через транзисторы. Значения резисторов R9-R11, возможно, потребуется корректировать для нормальной яркости дисплея, основанной на реально имеющихся образцах индикаторов и напряжения питания. Для точности отсчета времени в устройстве можно использовать внешний кварц на частоту 1МГц, который подключается к выводам XTAL1-2, но перед этим выставить соответствующую конфигурацию фьюз-битов.
ATtiny2313 припаян непосредственно на печатную плату поэтому я включил 6-контактный разъем для программирования. Зуммер я использовал «CPM 121», со встроенным генератором, который работает от 3-15V. Пъезоизлучатель потребляет примерно 3,5 мА ,что лежит в пределах нагрузочной способности порта микроконтроллера.
Извлеките батарею перед подачей питания для программирование контроллера!
После включения питания начинается тест индикаторов и зуммера. Нажатие кнопки энкодера переводит прибор в спящий режим. При повторном нажатии кнопки таймер пробуждается и переходит в режим установки времени. Поворот налево увеличивает время, поворот направо уменьшает время. Максимальное время около 99 минут + 59 секунд. Минимальное время составляет 5 секунд. Установка времени меньше 0 секунд выключает таймер. Нажатие на кнопку запускает таймер. Первые и последние 5 секунд отсчета таймер мигая индикаторами показывает оставшееся время. По окончании отсчета включается зуммер определенное количество раз (чем больше установленное время, тем чаще) и засыпает. Нажатие кнопки во время работы таймера, показывает оставшееся время в течение 5 секунд.
Для сокращения размеров таймера я использовал одну литиевую батарею напряжением 3.6V размера АА. Корпус состоит из передней панели сделанной из 4 мм фанеры, стенки вырезаны из одной части деревянного бруска. Чтобы сделать точные вырезы для ручки энкодера, индикаторов и зуммера был сделан трафарет на бумаге.
Описание прошивок:
econom_timer_at tiny2313 — стандартная прошивка для трехразрядного индикатора с ОА и точками слева от цифр;
econom_timer_at tiny2313_FYT-3631BG-11 — для трехразрядного индикатора с ОА и точками справа от цифр;
economic_timer_ attiny2313_up10to1min — для трехразрядного индикатора с ОА и точками справа от цифр, при настройке времени свыше 10 минут, разрядность шага энкодера 1 минута;
econom_timer_attiny2313_E30561_OK+OUT — прошивка под индикатор E30561_OK, на выходе(PA0) на время отсчета лог. единица.
Автор: KIO
Обсуждение статьи на форуме.
Архив для статьи «Экономичный кухонный таймер на Attiny2313» | |
Описание: Файл прошивки микроконтроллера, макет печатной платы Eagle 5 | |
Размер файла: 44.24 KB Количество загрузок: 2 767 | Скачать |
radioparty.ru
Дата публикации: .
Главным стимулом создания этого проекта был вопрос — как много я смог бы втиснуть с точки зрения аппаратного и программного обеспечения в наручные часы, устройство которое не больше по размерам, чем его дисплей. OLED -дисплей был выбран из-за того, что его толщина только 1,5 mm, ему не требуется подсветка (каждый пиксель производит свой собственный свет), но главным образом потому, что он выглядит очень круто.
Первоначально для часов планировалось использовать дисплей 0,96″, но это оказалось слишком сложно, чтобы воплотить в нем все свои идеи. Решение увеличить размер экрана до 1,3″ было правильным.
Аппаратная реализация
В аппаратной части часы содержат микроконтроллер Atmel ATmega328P, 2,5 V регулятор напряжения Torex, часы реального времени DS3231M(RTC), 1.3″ 128×64 монохромный OLED дисплей, 2 светодиода (красный и зеленый), зуммер, 3-х позиционный переключатель для навигации, питание от 150 mAh LiPo аккумулятора, который можно заряжать через USB и 2-х печатных плат(хотя одна используется только для монтажа OLED дисплея).
Принципиальная схема часов
ATmega328P использует свой внутренний генератор 8 МГц и работает от 2,5 V линейного регулятора. Ее ток потребления составляет около 1,5 mА при активной и 100 nА в режиме сна.
DS3231M является отличным прибором, который выпускается в небольшом 8-ми контактном корпусе и включает в себя встроенную температурную компенсацию MEMS резонаторов с точностью ± 5 ppm (± 2 минуты 40 секунд в год). В обвязке только фильтрующий конденсатор и несколько дополнительных подтягивающих резисторов. Питание RTC подключено не к выводу VCC, а к выводу Vbat, для того чтобы уменьшить ток потребления с 100 uА до 2,5uA. К сожалению, этот чип очень трудно заполучить по разумной цене, если вы не в США. Я получил необходимое количество DS3231M в качестве образцов.
Для зарядки аккумулятора используется Microchip MCP73832 вместе с некоторыми дополнительными компонентами для распределения нагрузки, где батарея может заряжатся без вмешательства в остальную часть часов.
Вы могли заметить, что на схеме светодиоды напрямую связаны с микроконтроллером без резисторов. Внутренние MOSFET микроконтроллера имеют сопротивление около 40 Omh, напряжение с 2,5 V падает до 2 V, что достаточно для питания светодиодов. Мне хотелось использовать синий светодиод, но у него большое падение напряжения, что потребовало бы увеличить напряжение питания до 3 V и ставить некоторые дополнительные резисторы и MOSFET.
Поскольку микроконтроллер работает от 2,5 V чтобы измерить напряжение батареи нужно понизить этот сигнал перед тем как подключить его к АЦП. Для этого используется делитель напряжения. Однако, делитель напряжения подключен параллельно батарее и через него будет постоянно протекать ток 350 uA, а это огромная трата энергии. В этой версии проекта добавлен P-MOSFET, чтобы делитель был включен только при необходимости.
2,5 V регулятор используется марки Torex XC6206, в первую очередь я выбрал его из-за своего крошечного ток покоя, всего 1 uA. Почему выбран линейный регулятор, а не импульсный? КПД у импульсного стабилизатора не менее 80% при нагрузке 2 mА, но с нагрузками 100 uА его эффективность падает до менее чем 50%. Так как потребление устройства в спящем режиме составляет 2-3 uA, импульсный стабилизатор показал себя невероятно плохо по сравнению с линейным регулятором. Эффективность 2,5 V линейного регулятора составляет до 60% с 4,2 V на входе и до 83% с 3 V на входе.
Нижняя сторона платы |
Верхняя сторона платы под дисплеем |
Программное обеспечение
Итак, мы имеем в нашем распоряжении хороший OLED-дисплей и 32 КB флеш памяти микроконтроллера, конечно же, мы можем иметь больше, чем просто время и дату?
Почти все анимировано
Много времени было потрачено на оптимизацию кода визуализации, который включает в себя копирование растровых изображений с флэш в кадровый буфер оперативной памяти и отправки кадра по SPI на OLED. Конечный результат был способен поддерживать 100 FPS почти во всех областях с частотой генератора микроконтроллера 8 МГц. Однако, поскольку кадр анимации длится определенное время, чтобы сократить расход энергии, частота кадров ограничена до 60 FPS.
Некоторые из основных анимированных кадров:
— CRT анимация при входе и выходе из спящего режима (по аналогии с анимацией Android CRT).
— Цифры главных часов имеют эффект Ticker.
— Меню имеет анимированные прокрутки влево/вправо, при входе в текущее меню, при навигации по меню выше или ниже.
Будильники
— Активация до 10 будильников.
— Количество будильников ограничено только количеством доступных EEPROM и RAM.
— У каждого будильника настраиваются часы, минуты и в какие дни недели он должен быть активным.
Игры
Побег |
Автомобиль Dodge |
Приложения
Фонарик. Включаетвсе пикселиOLEDи светодиоды, а также имеетрежим стробоскопа |
Стопкадр |
Некоторые возможности:
— 3 канала регулировки громкости для:
Основного режима;
Будильника;
Почасового сигнала.
— Режим ожидания
— Регулировка яркости дисплея
— Анимация
Вы же не собираетесь, от этого отказываться, или может g shock купить спб ?
Энергосбережение
В активном режиме микроконтроллер пытается уйти в режим сна при каждой возможности. В режиме сна контроллер просыпается на миллисекунду чтобы посмотреть нуждается устройство в обновлении, если нет, то он возвращается в режим сна, это обычно занимает менее 100 us, если дисплей не нуждается в обновлении. В этом режиме ток потребления может быть примерно от 0,8 мА до 2 мА, в зависимости от того, как долго высвечивается кадр.
В режиме сна микроконтроллер отключает OLED дисплей и уходит в спящий режим, где его разбудит только нажатие кнопки, сигнал от RTC или при подключении к USB. В этом состоянии микроконтроллер потребляет ничтожные 100 nА.
В спящем режиме общий ток потребления часов 6 uA. В активном режиме ток может варьироваться от 2 мА до более чем 70 мА, средний ток потребления 10 mA.
Общее потребление тока, емкость аккумулятора: 150mAh
Минимальный (В режиме сна) |
Нормальный (Индикация главных часов) |
Высокий (Фонарик) |
6uA 2.85 years |
10mA 15 hours |
64mA 2 hours, 20 minutes |
Если часы находятся в активном режиме в среднем 1 минуту в день (с 5-секундный тайм-аутом сна и проверкой времени 12 раз в день), то они должны работать около 1 года 4 месяцев на одной зарядке. (30 дней, если часы просыпаются на 1 минуту в час).
Потребление тока для отдельных компонентов
Компонент | Потребление тока |
ATmega328P (сон/активный) | 100nA / 1.5mA |
OLED (сон/активный) | 500nA / 8.5mA |
DS3231M RTC | 2.5uA |
Диод Шоттки (D1) (ток обратной утечки) | 1uA |
Регулятор (ток покоя) | 1uA |
Другие (MOSFET и конденсаторы и т.п. утечки) | 1uA |
Всего (сон/активный) | 6.1uA / 10mA |
Дальнейшее совершенствование проекта
— Программирование через USB.
На данный момент используются 4 провода для SPI программирования, при частом подключении к разъему программирования, боюсь что он расшатается.
— Добавить другой метод измерения заряда батареи.
На данный момент уровень заряда батареи определяется ее напряжением, это не очень точный метод получения оставшегося заряда батареи.
— Поддержка различных микроконтроллеров.
Текущая прошивка использует примерно 28 KB из 32 KB свободного места памяти ATmega328P, при использовании других микроконтроллеров с большим объемом памяти, необходимо будет добавить больше возможностей, например калькулятор. Тем не менее, ATmega328P имеет самое большое количество памяти для AVR в 32 контактных TQFP корпусах, чтобы иметь больше памяти я должен был бы использовать 44 контактный AVR. ATmega1284 выглядит очень интересно.
— Импульсный стабилизатор, регулятор подкачки заряда или может быть гибридное решение?
Линейный регулятор который используется в данный момент не является особо эффективным, импульсный регулятор, кажется, не очень хорош при низком токе. Может есть возможность использования регулятора подкачки заряда или гибридное решение — линейным регулятор для неактивного режима и импульсный стабилизатор для активного режима?
Может кто знает?
Фотогалерея проекта
Автор: Zak Kemble
Архив для статьи «Наручные часы на Atmega328 и OLED дисплее» | |
Описание: Исходный код(Си), файлы прошивки микроконтроллера, схема и макет печатной платы Eagle 6 | |
Размер файла: 279.08 KB Количество загрузок: 3 719 | Скачать |
radioparty.ru