Напоминание о дне рождения на 50 лет
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 2 |
Необходимые инструменты и машины
| ||||
|
Приложения и онлайн-сервисы
| ||||
|
Об этом проекте
Да, вы правильно прочитали заголовок. Вы когда-нибудь забыли о своем дне рождения, что вам нужно, чтобы кто-то напомнил вам о нем? Или что, если вы можете подарить близкому человеку устройство, которое поздравит его с днем рождения 50 раз ? Я не шучу, этот простой сигнал дня рождения на базе Arduino который работает на одиночном монетном элементе CR2450 можете поздравить своих близких (или себя) с днем рождения на 50 лет, пока батарея не разрядилась.
Я думаю, что это первый раз, когда кто-то делает такой будильник на день рождения, потому что я пробовал искать похожие проекты, но ничего не нашел. Этот проект также доступен на моем личном веб-сайте проекта - https://www.vishnumaiea.in/projects/hardware/birthday-reminder-device-that-will-run-for-50-years-on-a-coin- ячейка
Я построил его в рамках конкурса Hackaday Coin Cell Challenge. Эта штука с будильником на день рождения просто пришла мне в голову, и я начал исследовать, как долго мы можем запускать что-то на монетной ячейке. Я никогда раньше не использовал спящие режимы каких-либо микроконтроллеров. Поэтому мне пришлось узнать все о том, как заставить микроконтроллеры работать с безумно низкими токами и экономить каждый бит энергии ячейки. Это был действительно вызов! Я использовал ATmega168P в качестве микроконтроллера (на самом деле я модифицировал Arduino Nano с ATmega168P, удалив все нежелательные компоненты, такие как регулятор напряжения, мост USB и т. Д.) И использовал Arduino IDE для разработки прошивки.
Время и дату рождения можно запрограммировать с помощью последовательного монитора через USB. Как только время и будильник установлены, MCU переходит в спящий режим. Когда текущее время RTC совпадает с вашим днем рождения каждый год, светодиод будет мигать в течение минуты и напечатает сообщение с днем рождения на последовательном мониторе. Среднее потребление тока составляет около 1,2 мкАч (включая саморазряд), что позволяет проработать более 50 лет на литиевом аккумуляторе CR2450 (540 мАч).
Особенности
- Примерно 1,22 мкАч среднее потребление тока, включая саморазряд элемента ( 608 нА без учета саморазряда, измеренного амперметром, на элементе CR2450N)
- Фактическое время работы различных типов литиевых аккумуляторных батарей:> 29 лет на CR2023 (225 мАч), > 50 лет на CR2450N (540 мАч) и > 64 лет на CR2477N (950 мАч). [фактическое время работы зависит от физического и химического состояния батареи за период]
- День рождения можно установить и обновить с помощью любого программного обеспечения для мониторинга последовательного порта через USB с помощью простых команд.
- Выделенный переключатель настройки времени позволяет устанавливать, просматривать и обновлять время в любое время.
- Программная установка времени означает, что ее можно довольно точно установить с помощью приложения, запущенного на компьютере (программное обеспечение для установки времени / синхронизации на основе Processing находится в стадии разработки).
- Открытый исходный код - все файлы дизайна и программные коды доступны для загрузки с подробной документацией и изображениями с высоким разрешением.
Теперь я расскажу вам, как это сделать, и покажу фактический тест на потребление тока.
Шаг 1. Изменение Arduino Nano
Для этого проекта вы можете использовать чистый микроконтроллер или использовать Arduino Nano . или Mini доски. Все, что требуется, это запустить его с внутренним генератором (1 МГц) и в полном рабочем диапазоне 1,8 - 5 В. CR2450 или аналогичные литиевые элементы имеют номинальное напряжение 3 В, поэтому мы можем запускать микроконтроллер без использования регулятора напряжения. Китайские клоны или Nano и Mini чрезвычайно дешевы, их можно купить по цене чипа! Я использовал такой клон Nano, у которого есть CH340G как USB-последовательный мост. Ниже тот, который я использовал.
У меня была и версия ATmega168, и версия 328. Я купил 168 версий по ошибке несколько лет назад (теперь нашел ей применение). На этой конкретной доске вам нужно удалить,
- ИС моста USB-последовательный порт, которым является CH340G.
- Диод Шоттки, подключенный к USB 5V.
- Два резистора 1 кОм подключены к контактам TX и RX CH340G.
- Светодиоды RX, TX и PWR (SMD)
- Стабилизатор напряжения AMS1117 5 В.
Я использовал светодиод на контакте 13 для отладки и в качестве основного мигалки, поэтому я не стал его снимать. Конденсаторы снимать не нужно, так как они помогают снизить шум. После снятия регулятора необходимо замкнуть контактные площадки регулятора напряжения, как показано на изображении. Это связано с разводкой, используемой в конструкции печатной платы. Пока не снимайте кварцевый генератор микроконтроллера, потому что он нам понадобится для замены битов предохранителей. Микроконтроллеры будут иметь загрузчик Arduino по умолчанию и настройки предохранителя, которые заставят его работать на внешнем кристалле 16 МГц. Если мы удалим кристалл перед установкой предохранителя на использование внутреннего OSC, мы просто не сможем запрограммировать чип с помощью программатора ISP. Ниже представлена модифицированная версия Arduino Nano.
Шаг 2:Замена битов предохранителя ATmega168P
Обычно чипы на платах Arduino поставляются с загрузчиком Arduino и битами предохранителей. Нам нужно изменить это, чтобы запустить MCU в режиме пониженного энергопотребления. Для этого нам необходимо,
- Сделайте так, чтобы микроконтроллер работал на частоте 1 МГц. Мы можем включить внутренний осциллятор, а также бит «деления на 8», чтобы получить тактовую частоту 1 МГц из 8 МГц. Меньше тактовая частота, меньше будет энергопотребление. Мы не будем здесь называть никаких цифр, так что 1 МГц более чем достаточно.
- Отключить модуль обнаружения потемнения (BOD).
- Отключите все внутренние модули, такие как АЦП, таймеры и т. д. Мы сделаем это программно.
- Отключить сторожевой таймер (WDT).
- Сделайте все контакты ввода-вывода входными и низкими, кроме контактов 13, 2 и 3.
Выше приведены настройки предохранителей для ATmega168P. Обратите внимание, что вам нужны P-версии микросхем ATmega, потому что они имеют функцию пикопитания. Обычные версии (не P) не поддерживают эти дополнительные режимы энергосбережения. Так что убедитесь, что у вас есть версии P. Теперь вы можете задаться вопросом, почему я использую 168 вместо 328. Это потому, что, когда я тестировал схему, 328, казалось, потреблял около 30 мкА для того же кода и настроек, которые я использовал для 168, которые потребляли всего около 2 мкА. Не знаю почему. Как я уже сказал, я впервые возился с режимами энергосбережения, такими как глубокий сон. Так что, возможно, я что-то упускаю. Если вы что-то знаете об этом, дайте мне знать в комментариях.
Чтобы поменять бит предохранителя, нам понадобится программист ISP. Есть много ISP-программистов и совместимого программного обеспечения. Я использовал USBasp как программист и ProgISP как программное обеспечение для программирования. Идентификатор микросхемы или подпись используемого мной ATega168P-AU: 1E940B . . Это может измениться в зависимости от вашей версии. Чтобы заменить бит предохранителя:
- Подключите USBasp к Nano. Обычно USBasp имеет 10-контактный разъем, но Nano имеет 6-контактный разъем ISP. Поэтому я сделал простой переходник с 10 контактов на 6 контактов. Возможно, вам понадобится сделать что-то подобное или найти кабель.
- Выберите модель MCU из списка и проверьте подпись с помощью RD . кнопка.
- Установите флажки и предохранители, как показано на изображении ниже, и используйте Авто или кнопку Написать нажмите кнопку в окне настройки предохранителя, чтобы обновить биты предохранителей.
В случае успеха на консоль будет напечатано сообщение. С этого момента вам понадобится ISP для прошивки MCU. Ниже показан USBasp, который я использовал.
Шаг 3. Компиляция и загрузка
Теперь, когда мы изменили плавкие вставки нашего микроконтроллера, нам также необходимо сообщить программному обеспечению Arduino и компилятору об изменениях, которые мы внесли, чтобы мы могли правильно скомпилировать код внутри Arduino IDE. Мы делаем это, добавляя собственное определение доски в "boards.txt " файл, который находится в каталоге установки Arduino, который обычно находится в <место установки> /Arduino/hardware/arduino/avr/boards.txt " в системах Windows. Это может отличаться для вас в зависимости от того, какая у вас ОС или версия вашей IDE. Я использую IDE версии 1.8.5
Как только мы найдем файлboards.txt, вам нужно будет добавить собственное определение нового Arduino Pro Mini . доска. Примерно на строке 655 начнутся определения существующих плат Pro Mini. Будет много версий плат. Итак, нам нужно добавить новый вариант. Добавьте к нему следующее определение и сохраните.
## Arduino Pro или Pro Mini (3,3 В, 1 МГц) с ATmega168 ## ------------------------- ------------------------- pro.menu.cpu.1MHzatmega168 =ATmega168 (3.3V, 1 MHz) pro.menu.cpu.1MHzatmega168.upload .maximum_size =14336 pro.menu.cpu.1MHzatmega168.upload.maximum_data_size =1024 pro.menu.cpu.1MHzatmega168.upload.speed =19200 pro.menu.cpu.1MHzatmega168.bootloader.lowme_fus.pro .bootloader.high_fuses =0xDF pro.menu.cpu.1MHzatmega168.bootloader.extended_fuses =0xF9 pro.menu.cpu.1MHzatmega168.bootloader.file =atmega / ATmegaBOOT_168_pro_8MHzbuild.cpu.1 .menu.cpu.1MHzatmega168.build.f_cpu =1000000L
А вот и скриншот.
Вам нужно отредактировать файлboards.txt, пока Arduino не работает. После сохранения нового файла Board.txt и перезапуска Arduino IDE вы увидите новую плату, которую мы только что добавили в список. Взгляните на скриншоты ниже.
Теперь мы готовы скомпилировать коды Arduino для нашей новой платы. Поскольку мы не используем загрузчик Arduino (BL) , нам нужно создать шестнадцатеричный файл программы и использовать USBasp и ProgISP для прошивки микроконтроллера. Мы можем сделать это с помощью «Экспорт скомпилированного двоичного файла» . в меню "Эскиз" в среде IDE или нажмите Ctrl + Alt + S . Когда мы это сделаем, два шестнадцатеричных файла (формат Intel) будет создан в том же каталоге, что и наш эскиз. Один шестнадцатеричный файл с BL, а другой без BL.
Когда у нас будет шестнадцатеричный файл, в ProgISP выберите Загрузить Flash . возможность загрузить шестнадцатеричный файл, которым мы хотим прошить MCU, затем нажмите Авто кнопка. Если загрузка прошла успешно, она будет выведена на консоль ProgISP.
Шаг 4:Intersil ISL1208 I2C RTC
Intersil ISL1208 представляет собой микросхему RTC с низким энергопотреблением и интерфейсом I2C. Он использует внешний кристалл 32,768 кГц для отслеживания времени. Имеет регистры сигналов тревоги месяц-дата-час-мин-секунда. Он потребляет всего около 400 нА в режиме VBAT и максимум 1,2 мкА в режиме VDD. Рабочее напряжение от 1,8 до 5,5 В. Что делает его хорошим кандидатом, так это энергопотребление и функция будильника с указанием даты месяца. Обычные часы реального времени, такие как DS1307, не имеют настройки месяца в регистре сигналов тревоги, без которой мы не можем генерировать сигнал дня рождения каждый год. У него есть выходной контакт прерывания, который будет генерировать 250 мс активный НИЗКИЙ сигнал, когда текущее время совпадает с датой и временем будильника. Мы будем использовать это, чтобы вывести MCU из спящего режима, что я объясню ниже.
Особенности ISL1208
- Часы / календарь реального времени
- - Отслеживает время в часах, минутах и секундах.
- - День недели, День, Месяц и Год
- 15 выбираемых частотных выходов.
- Одиночный будильник
- - установка секунд, минуты, часа, дня недели, дня или месяца.
- - Режим одиночного события или импульсного прерывания
- Автоматическое резервное копирование на батарею или суперконденсатор.
- Обнаружение сбоя питания
- Компенсация встроенного осциллятора
- 2 байта пользовательской SRAM с резервным питанием от батареи
- Интерфейс I2C
- - Скорость передачи данных 400 кГц.
- Ток питания от аккумулятора 400 нА
- Распиновка такая же, как у устройств ST M41Txx и Maxim DS13xx.
Поскольку у меня была SMD-версия ISL1208, мне пришлось сделать коммутационную плату, чтобы ее можно было подключить к моей основной плате. Ниже то, что я сделал.
Шаг 5. Монетная ячейка CR2450N
Технические характеристики
- Химическая система - Li / MnO2 (согласно IEC 60086)
- Номинальное напряжение - 3 В
- Номинальная емкость - 540 мАч.
- Стандартный ток разряда - 0,8 мА
- Макс. Продолж. Ток разряда - 3,0 мА
- Средний вес - 5,9 г
- Рабочая температура * - -40 - +85 ° C
- Саморазряд при 23 ° C - <1% / год
- Срок годности - до 10 лет.
Шаг 6. Схема
Используйте приведенную выше схему, чтобы припаять модули к монтажной плате. Два резистора 4,7 кОм - это подтягивающие I2C . . Значения могут находиться в диапазоне от 3,3K до 5,6K выше. R2 и R3 - это подтяжки для контактов прерывания. Arduino Nano имеет два вывода аппаратного прерывания - цифровой вывод 3 и 2. Цифровой вывод 2 будет использоваться для прерывания сигнала тревоги от RTC, а цифровой вывод 3 будет использоваться для пробуждения MCU, когда вам нужно установить время. Ниже показан CP2102 . Я использовал модуль USB-to-Serial.
Модуль USB-to-Serial будет использоваться для связи через монитор последовательного порта. Контакты RX и TX CP2102 подключены к контактам RX и TX Nano соответственно. Обратите внимание, что вы не должны подключать + 5 В от USB к основному напряжению VCC.
Шаг 7. Как это работает?
Работа устройства на самом деле тихая и простая. Посмотрим, как работает основной алгоритм,
- Установите текущее время на RTC через последовательный монитор.
- Установите время и дату будильника на часах реального времени.
- MCU переходит в спящий режим после установки времени и будильника путем отключения внутренних периферийных устройств, включая таймеры и АЦП.
- Когда текущее время совпадает с датой и временем срабатывания будильника (ММ, ДД, чч, мм, сс, р), часы реального времени будут генерировать, прерывать и выводить MCU из спящего режима.
- Проснувшись, MCU включит необходимые внутренние периферийные устройства и распечатает сообщение с днем рождения на серийный монитор. Он также мигает светодиодом внутри купола определенным образом.
- Поздравив вас с днем рождения, MCU снова перейдет в спящий режим и проснется только в ваш день рождения в следующем году.
- Но вы можете видеть время и обновлять его при необходимости, повернув переключатель обновления времени . ВКЛ.
При первом включении все регистры RTC будут равны нулю, и он не увеличивается до тех пор, пока мы сначала не выполним запись в любой из них. Чтобы установить время на RTC,
- Включите переключатель обновления времени (подключите цифровой контакт 3 к GND). Мы не можем установить время, не потянув штифт 3 LOW.
- Сначала подключите устройство к компьютеру с помощью кабеля USB. На вашем ПК будет установлен COM-порт для связи.
- Найдите COM-порт устройства в диспетчере устройств.
- Откройте любое программное обеспечение для мониторинга последовательного порта или последовательный монитор Arduino с помощью COM-порта устройства.
MCU выведет на монитор последовательного порта следующее сообщение.
Последовательный порт установлен. Время готовности к обновлению.
- Отправка "t" команда напечатает текущее время, "а" напечатает дату и время будильника, а "c" отменит операцию установки времени и переведет MCU в спящий режим через 6 секунд.
- Вам необходимо отправить текущее время в формате, показанном ниже,
TYYMMDDhhmmssp #
Где:
- T =указывает информацию о времени
- ГГ =наименее значащие цифры года (например, 18 для 2018 года, диапазон от 00 до 99)
- ММ =месяц (например, 01 для января, диапазон от 01 до 12)
- ДД =дата (например, 24, диапазон от 01 до 31)
- чч =часы (например, 06, диапазон от 01 до 12 для 12-часового формата)
- мм =минуты (например, 55, диапазон от 00 до 59)
- сс =секунды (например, 30, диапазон от 00 до 59)
- p =период дня для 12-часового формата (0 =AM, 1 =PM)
- # =разделитель
Например, чтобы установить время и дату «08:35:12 AM, 05-01-2018», мы должны отправить:
T1801050835120 #
На устройство, где:
- T =указывает информацию о времени
- 18 =2018 год.
- 01 =месяц январь
- 05 =дата
- 08 =часы
- 35 =минуты
- 12 =секунды
- 0 =AM
- # =разделитель
Если операция прошла успешно, MCU выведет полученное время на консоль как:
Получено обновление времени =T1801050835120 Дата и время:8:35:12 AM, 01.05.18
Если введенная вами строка времени недействительна, будет напечатано следующее сообщение:
Недействительный ввод времени - <исходная строка>, <длина исходной строки>
После того, как вы успешно установите время, RTC будет отслеживать его, пока есть доступная мощность. Вы можете проверить только что установленное время, отправив "t" команда. Настройка будильника аналогична этой, за исключением другого формата данных. Чтобы установить будильник, вам нужно отправить его как:
AMMDDhhmmssp #
Где:
- А =указывает информацию о тревоге.
- ММ =месяц
- ДД =дата
- чч =часы
- мм =минуты
- сс =секунды
- p =период времени (0 =AM, 1 =PM)
- # =разделитель
Обратите внимание, что в строке будильника нет информации о году, потому что, очевидно, она нам не нужна . Например, чтобы указать день рождения «08:00:00, 28-08», мне нужно отправить:
A08240800000 #
Вы можете в любой момент узнать время будильника с помощью команды "a" . . После установки времени и даты будильника пора перевести MCU в спящий режим. Таким образом, устройство напечатает следующее сообщение:
Все готово. Отключите фиксатор времени сейчас.
Теперь вам нужно выключить переключатель установки времени, т. Е. Переместить цифровой контакт 3 в ВЫСОКОЕ положение (подтягивание 10K сделает это). Система не будет спать, пока вы этого не сделаете. Когда переключатель установки времени находится в положении ВЫКЛ, устройство перейдет в спящий режим через 6 секунд и перед этим распечатает сообщение ниже.
Молодец! Спать через 6 секунд ..
Вот как вы устанавливаете время и будильник. Теперь, когда вам нужно проверить время или обновить его, вы можете включить переключатель настройки таймера, и система выйдет из спящего режима, установит последовательную связь и предложит вам отправить время. После пробуждения он напечатает следующее сообщение:
Serial Established. Time update wake up. Готов к обновлению времени.
Если вы просто проверяете правильность времени и не хотите ничего менять, отправьте "c" команда для отмены операции и повторного перевода системы в спящий режим. На этом этапе вам также необходимо отключить переключатель установки времени.
Когда текущее время совпадает со временем будильника, т.е. В ваш день рождения RTC сгенерирует сигнал прерывания 250 мс на цифровой контакт 2 Nano. Этот сигнал разбудит систему. Проснувшись, устройство узнает, что сегодня ваш день рождения, установит последовательную связь (только если у вас подключен USB-порт) и распечатает следующее сообщение:
Тада! Это твой день рождения! Happy B'Day, <твое имя> :) Увидимся в следующий день рождения! TC. Пока! Засыпаем через 6 секунд ..
И он также будет мигать светодиодом, подключенным к цифровому контакту 13. Вот снимок экрана последовательного монитора Arduino, когда я тестировал систему.
Вот как вы управляете этим устройством. Чтобы понять это на уровне кода, прочтите следующий раздел.
Шаг 8. Код
Это проект с полностью открытым исходным кодом, поэтому я опубликовал исходный код прошивки на моем GitHub по адресу https://github.com/vishnumaiea/Birthday-Alarm/ под лицензией MIT. Вы можете адаптировать, изменять и распространять без каких-либо ограничений. Если вы добавите обратную ссылку на этот проект из вашего измененного, это будет признательно. Я тщательно прокомментировал код и по возможности сделал его прямым.
Всего в коде 13 функций / процедур. Это:
1. void setup ()
Это функция настройки Arduino, которая инициализирует все и устанавливает регистры конфигурации ISl1208 RTC.
2. void loop ()
Функция основного цикла.
3. void sleepNow ()
Эта функция завершает все коммуникации, отключает внутренние периферийные устройства MCU, подключает прерывания к цифровым контактам 3 и 2 и переводит систему в режим глубокого сна. При любом прерывании выполнение программы продолжается со строки после sleep_mode ()
. Обратите внимание, что до того, как это нормальное выполнение программы возобновится, MCU завершил бы процедуры обслуживания прерывания, связанные с выводами прерывания, которые являются alarmInterrupt ()
и timeUpdateInterrupt ()
4. void alarmInterrupt ()
ISR, связанный с INT0 прерывание на цифровом выводе 2.
5. void timeUpdateInterrupt ()
ISR, связанный с INT1 прерывание на цифровом выводе 3.
6. void fetchTime ()
fetchTime ()
читает регистры времени RTC и выводит текущее время на консоль.
7. void blinkLED ()
Светодиоды явно мигают.
8. bool installSerial ()
Устанавливает последовательную связь с помощью модуля USB-to-Serial.
9. bool endSerial ()
Завершает последовательную связь.
10. byte bcdToDec (байт)
Принимает BCD (Цифры в двоичном коде) и преобразуйте его в соответствующее десятичное значение. Нам это нужно, потому что регистры RTC хранят и принимают только значения BCD. Поэтому время от времени нам нужно преобразовывать в BCD и обратно.
11. byte decToBcd (байт)
Принимает десятичное значение и переводит его в соответствующее значение BCD.
12. void printTime ()
Считывает регистры времени RTC и выводит текущее время на консоль, когда "t" команда получена.
13. void printAlarmTime ()
Считывает регистры сигналов тревоги RTC и печатает время и дату сигнала тревоги на консоли, когда "a" команда получена.
Шаг 9. Тестирование
Это будет самая интересная часть этого проекта, где вы узнаете, как я в итоге создал устройство, которое проработало 50 лет на монетоприемнике! Сначала я прототипировал всю схему на макетной плате и доработал дизайн. Я использовал литий-ионную батарею (3,6 В) для тестирования, чтобы сохранить свои новенькие батарейки. Я использовал свой Fluke 87 True RMS мультиметр для текущих измерений. Имеет 0,1 мкА точность для микроамперного диапазона.
Давайте посмотрим, как мы можем перевести Atmega168P в режим глубокого сна и резко снизить потребление тока.
noInterrupts (); // временно отключить прерывания set_sleep_mode (SLEEP_MODE_PWR_DOWN); // Выбираем предпочитаемый спящий режим:sleep_enable (); // Устанавливаем бит включения сна (SE):ADCSRA =0; // отключаем АЦП power_all_disable (); // отключаем все модули digitalWrite (LED_PIN, LOW); // выключаем светодиод для индикации прерывания сна (); // повторно разрешаем прерывания sleep_mode (); // засыпает
Как я уже сказал, это первый раз, когда я использовал спящие режимы в микроконтроллере (MCU), потому что мне это никогда не было раньше. Большая часть информации, касающейся спящих режимов AVR, была найдена в этой ветке форума и в документации библиотеки AVR.
ATmega168P имеет пять спящих режимов.
SLEEP_MODE_IDLE
– least power savingsSLEEP_MODE_ADC
SLEEP_MODE_PWR_SAVE
SLEEP_MODE_STANDBY
SLEEP_MODE_PWR_DOWN
– most power savings
More info on the sleep modes can be found here and in this video. We're using the SLEEP_MODE_PWR_DOWN mode as you can see there. At this mode, the current consumption at 3.6V is only around 0.2 uA See the below graph from the ATmega168PA datasheet that shows the relation between active current vs supply voltage and power down current vs supply voltage.
Here's the actual reading of the current consumed by sleeping ATmega168P @1MHz.
The value hops between 0.1 uA and 0.2 uA due to the lack of precision. But such a precise measurement isn't necessary but would've been interesting to see.
The power consumption of ISL1208 RTC at max is 1.2 uA . So if we add this with the power down mode current consumption of the MCU we get 1.2 + 0.2 =1.4 uA . My meter measured between 1.4 uA and 1.6 uA which justifies the calculations. The variations is only due to the lack of precision and our approximation or rounding of numbers.
Here's an unlisted video from my YouTube channel where I show the testing.
Now let's do the simple math to find how long we can the system on a coin cell. The CR2450N from Reneta has a nominal capacity of 540mAh . I have two red SMD LEDs on the system which consume about 6 mA (even with two LEDs) with when turned ON. So that's the peak current consumption of the device at worst. How long these LEDs light up can be summarized as,
1. As long as the time setting switch is activated while you're setting the time (but you don't have to do this every year)
2. The 6 second delay before sleep.
3. LED flashes on your birthday and stay ON for about 19 seconds.
Let's not be accurate here but just make an approximation. Let's assume the time setting requires 2 minutes (LEDs will be ON for 2 mins) and and additional 1 minute ON time for other things including the birthday flashing. So it's total 3 minutes or 180 seconds for which the system consumes 3 mA current. Let's take the sleep or idle current as 1.6 uA , though it's lower actually. There's 31557600 seconds in a year of 365.25 days. If LEDs stay ON for 180 seconds in a year and OFF for (31557600 - 180) seconds, then the average current consumption will be,
Average Current =[((6 x 10^-3) x 180) + ((1.6 x 10^-6) x 31557420))] / 31557600 =(1.08 + 50.491872) / 31557600 =51.571872 / 31557600 =1.634 x 10^-6 =1.634 uAh
If the average current consumption is 1.634 uAh, then the 540 mAh cell can run the device for:
Time Span (approx) =(540 x 10^-3) / (1.634 x 10^-6) =330477.3562 hours =13769.88 days =37.699 years
Note than this approximation is do not consider self-discharge of the battery. It'll be taken into account later. You can also use the ElectroDroid app to calculate battery life. Here's a screenshot of the calculations we just did.
BUT WAIT...
Can we reduce the current consumption further ? YES WE CAN! I made further optimizations to my design to limit the average current consumption to 0.6 uA , yes I did that. Not let's see what optimizations I did,
1. To remove the extra red SMD LED to reduce the current when the system is active/running. Before it was 6 mA at max with two LEDs. So with one LED, it'll be reduced to half, ie 3 mA.
2. To reduce the current consumption of RTC, we need to disconnect the VDD pin of the ISL1208 RTC from the VBAT pin. Previously the VDD pin was connected to the VBAT pin where I supplied the 3V from the cell (you can see this in the schematic). In that configuration, I also had the LOW_POWER mode bit (LPMOD ) of the RTC set to 1 activating the low power mode. So now you might think if the low power mode is set, then the chip might be consuming the lowest current. But that's not the case when we have the VDD tied to VBAT. Because low power mode bit is only useful if we have VDD> VBAT all the time. At such situation, the RTC's internal power switch will select VBAT as power source reducing the current further by 600 nA when VDD>=VBAT (from typical 1.2 uA which I've mentioned before). But if we can run the RTC in VBAT only with VDD =0, the current consumption can be reduced to the minimum ie, 400 nA as per the datasheet. So what I did is, first I disabled the low power mode by setting LPMOD to 0. Then added a jumper to the RTC breakout board to disconnect the VDD pin from VBAT when I don't need it. Why need the jumper is because, the VDD pin must be greater than or equal to VBAT in order for the I2C to work. So I can connect the jumpers when I need I2C while I'm setting the time, and can disconnect it after. This will let the RTC to consume the targeted 400 nA current. Tada! We did it!
Now that we have reduced the current consumption of the RTC from 1.2 uA to 0.4 uA (400 nA), we can do the math again!
System Active Current =3 mAh max
System Sleep Mode Current =0.4 uA (RTC) + 0.2 uA (MCU) =0.6 uAh
System ON time =60 s (time setting) + 19 s (birthday flashing) + 6 s (before sleep) =85 seconds
System Sleeping Time =31557600 s - 85 s =31557515 seconds
Total time in a year =31557600 seconds
Battery capacity =540 mAh
Here's the current consumption test video after the optimizations and mods.
If we put those new values to the ElectroDroid's battery life calculator, we get, 101 years and 136 days. A theoretical operating time of more than a century! The average current consumption is now only 608 nA . Here's the screenshot.
Okay, What's the actual operating time ?
Batteries aren't perfect, nor anything we design. So let's also consider the 1% self discharge of the cell into account.
1% of initial capacity of 540 mAh CR2450N =5.4 mAh
Self-discharge current =5.4 mA per year or 616.4 nAh (5.4 mA / hours in a year)
Adding this 616.4 nAh with the 600 nAh sleep current =1.216 uAh
Expected operating time with average current of 1.224 uAh =50 years, and 131 days.
That's the actual operating time if the cell will be fine
Here's a table of actual operating times of different types of coin cells with the 1% self-discharge of initial capacity every year.
The main practical concerns associated with running the device for such long periods are,
1. Will the battery retain the charge and voltage for that long ?
2. The effects of environmental variations on the circuit and battery performance.
3. And you screwing up things! XD (don't drop it, chew it, sit on it, run your car through it or launch it into space!)
Coin cells are usually made to last for 10 years, which is their shelf life , and some even last longer than that. But that doesn't mean they'll start to disintegrate to an useless state after that. If the cell is physically fine, it can still power things. As per Renata datasheet, the self-discharge rate of CR2450N is less than 1% of the capacity every year. As per this datasheet from Energizer, that 1% figure is of the fresh capacity. Below is a chart that shows the standard discharge time in years (this doesn't consider the self-discharge or other exceptions). It clearly shows the theoretical expected operating time is way too longer than 10 years.
Self-discharging not only reduces the capacity but also reduces the voltage. Both ATmega168P and ISL1208 are designed to be operated fine at voltages as low as 1.8V. So the reduction in voltage might not be a problem. You can learn more about running systems with coin cells here.
To ensure long operating span, we must make sure the device is properly concealed against much of the environmental changes such as temperature, humidity, corrosion etc. These are some things you can do to protect your circuits,
1. Coat the PCB with long lasting conformal coating.
2. Place a pack of silica gel inside the enclosure.
3. Seal the enclosure with less temperature conductive materials and make it air tight.
4. Place it somewhere safe from naughty hands!
Step 10:Building
I used a perfboard to solder everything as per the schematic. I used berg connectors for the battery, switch and LED so that it'll be easy to remove them if needed. Below are the some images of the PCB.
To build the enclosure I used a 4" x 4" switch box which I bought from an electrical shop. I made two rectangular holes for the switch and USB. You can 3D print an enclosure if you want; sadly I don't have one. The dome was snatched from a cheap LED light and used super glue to fix it on the box. I painted it with silver spray paint.
Use your ingenuity to build it.
What missing is some decorations . I'm not good at decorating things. If you are going to gift this to someone, you know what to do.
The final output is satisfying to the extend of my hardwork. I might find someone else to decorate it.
Step 11 :Improvements
There's always room for improvement. Some of my suggestions are,
1. Using a Nokia 5110 LCD with or instead of the LED bulb. The LCD controller only consumes a couple of 100 uA at normal operating modes without the LED backlighting of course. Monochrome LCDs only consume extremely low currents. So using it would be better than a flashing LED, where you can actually print the happy birthday message on the screen itself. I might do this in future because I have couple of them lying around here.
2. A software that runs on the computer that'll set/sync the time accurately and automatically. I'm thinking of developing a simple one using Processing.
3. Flashing the LEDs to indicate the current age - for example if it's your 5th birthday (OMG are you're reading this ?!), it'll flash a sequence for 5 times. Currently you can not set the current age in the system. You may add this.
4. Designing a dedicated PCB in eagle (planned).
5. If blinking LED isn't your thing you can actually make this more exciting with for example using an opto-coupler you can turn on an AC alarm, music player, lights or anything you want to blink, move and scream on the birthday of the one you wish. You can even exclude the microcontroller and only use the interrupt from the RTC. Everything's possible!
So what are you waiting for ? Make one, decorate it with stickers, color papers, glitter or anything and gift to your loved ones or even yourself! And tell them to wait for this magical device to wish them happy birthday.
What you see here is actually a prototype of a device that'll refine and release in future. So stay tuned. Please feel free to share if you have found any errors with this documentation or have any improvement suggestions. Happy making :)
Код
Birthday Alarm
https://github.com/vishnumaiea/Birthday-AlarmСхема
Schematic of Arduino clone.Производственный процесс
- Индустрия 4.0 и Интернет вещей:тенденции рынка на следующие годы
- 10 факторов для поиска идеального переключателя для вашего приложения
- NVIDIA:компьютер CUDA-X AI, на котором работают все модели AI
- Kontron:коммутатор 40 Gigabit Ethernet для использования в суровых условиях
- Не ударяйте по подшипнику! Правильные инструкции по холодному монтажу
- Для киберпреступников COVID - это дар, который продолжает приносить пользу
- 7 признаков того, что пришло время обновить генератор
- 3 признака того, что пришло время перемотать двигатель
- Практики, обеспечивающие безупречную сборку печатных плат
- Для этого есть робот!