DIY Таймер: Как это работает и его приложения
Различные виды таймер DIY служат различным целям. Но, несмотря на разнообразие, база все равно сводится к простой схеме таймера. Таким образом, вы можете использовать схему таймера для многих применений, включая генерацию импульсов и генераторы.
Кроме того, дизайн довольно прост, и вы можете сделать это в течение короткого периода. Однако это не значит, что его легко построить.
Вот почему мы создали эту статью, чтобы облегчить вам задачу.
Итак, если вам нужно знать, как сделать таймер DIY, эта статья для вас; Мы покажем вам, как работает схема таймера и покажем вам, как сделать две простые схемы таймера DIY.
Готовый? Тогда давайте сразу же начнем!
Как работает схема таймера?
Как мы упоминали ранее, существуют различные типы таймеров с различными приложениями. Тем не менее, мы подробно поговорим о простой, но полезной схеме таймера, которую вы можете настроить с помощью обычных горшков. Вот схема схемы:
Схема таймера DIY
Глядя на принципиальную схему выше, вы увидите две ИС таймера 555, настроенные как независимые режимы таймера.
Хотя настройки синхронизации различны, конфигурация для обоих таймеров 555 одинакова.
Итак, как это работает?
Вы можете соединить верхний выход 555 с нижним входом сброса 555 с транзистором. Затем вы можете подключиться так, чтобы, когда верхний 555 поднимается высоко, он запустил работу нижнего таймера.
Таким образом, нижний 555 начинает свой отсчет. Но когда выход становится высоким, он перестает считать, возвращается в нормальное состояние и перезапускает процесс.
Другими словами, если тайминг верхнего 555 не остановится, нижний 555 останется неактивным. Таким образом, как только верхний 555 прекращает свою синхронизацию, его выход становится высоким, тем самым переключая выходную нагрузку и активируя нижнюю 555.
Кроме того, вы можете использовать горшок, подключенный к верхним таймерам 555, чтобы определить, как долго вы хотите, чтобы нагрузка оставалась, в то время как горшок, подключенный к нижнему 555, определяет, когда вы хотите, чтобы нагрузка была выключена.
Кроме того, вы можете обновить конструкцию вышеупомянутой схемы с помощью кнопки и по-прежнему включать / выключать таймер одним нажатием кнопки. Одним из преимуществ использования кнопочной конструкции является то, что она гарантирует, что таймер полностью выключен, особенно при отключении питания во время использования цепи. Это также гарантирует, что важные грузы, такие как гейзеры или обогреватели, остаются выключенными в таких случаях.
Как создать простой переключатель таймера DIY
Ранее мы говорили, что покажем вам, как сделать два простых таймера DIY.
Итак, мы будем смотреть на создание таймера обратного отсчета DIY и таймера песка DIY.
DIY Таймер обратного отсчета
Вот как сделать простой таймер обратного отсчета DIY:
Шаг 1: Подготовьте свои материалы
Первое, что вам нужно сделать, прежде чем делать какой-либо проект, это подготовить свои материалы.
Итак, для таймера обратного отсчета, вот материалы, которые вам нужны:
5V USB светодиодная лента (1 метр)
Полистирольная упаковка (толщина 1 см)
Однополюсная кнопка (двойное включение/выключение)
Два листа пергамента
Жесткая карта для отображения обратной стороны
Шаг 2: Создание световода
Световоды формируют свечение светодиодов. Итак, убедитесь, что ваши светодиодные цифры на куске карты. Кроме того, вы можете выбрать печать любого из доступных шрифтов цифрового стиля.
После этого вырежьте части дисплея для вашего полистирольного шаблона. Кроме того, вы можете использовать большую ленту для крепления полистирола к карте. Затем вырежьте каждую часть из полистирола острым ножом.
Шаг 3: Установите основу для ваших светодиодов
Затем настройте базу для светодиодного дисплея. Вы можете использовать кусок картонного крепления или любой жесткий материал. Кроме того, используйте полистирольный световод с предыдущего шага, чтобы отметить положение светодиодов на основании. Как только это будет сделано, приклейте светодиодные ленты к сегментам.
Шаг 4: Запуск проводки
Вот где это становится сложным. Во-первых, вы должны припаять каждую светодиодную ленту к другому проводу, который будет подключаться к одному контакту Arduino.
Убедитесь, что вы помечаете каждый провод, чтобы не тратить часы, пытаясь отличить провода друг от друга. Кроме того, Arduino, который вы используете, определяет способ подключения контактов к проводам.
Шаг 5: Используйте клей для полистирольного световода
Закрепите полистирольный световод на основании с помощью клея, закрывая проводку и светодиоды. Добавьте диффузор, чтобы отдельные светодиоды не были видны.
Шаг 6: Исправление кнопки «Пуск»
Используйте кнопку, имеющую два подключения. Одно соединение идет на контакт Arduino (+ve), в то время как другое идет на землю через 100-метровый резистор.
Шаг 7: Использование кода для программирования таймера
Наконец, вы можете использовать код, чтобы освещать каждый сегмент требуемого числа каждую секунду или минуту. Кроме того, вы можете найти эффективный код для таймера обратного отсчета здесь.
DIY Песочный таймер
Песочный таймер DIY — это старая и винтажная технология.
Итак, вот как сделать простой песчаной таймер DIY:
Шаг 1: Упорядочивайте свои материалы
Компоненты для этой конструкции легко получить. Итак, вам понадобится быстрый клей, небольшое пластиковое полотенце, песок и две бутылки с чем-то, чтобы сделать отверстие.
Шаг 2: Создание чистых отверстий на обеих колпачках
Затем создайте чистые, гладкие отверстия на обеих крышках бутылок.
Шаг 3: Соедините колпачки с помощью клея
Используйте клей, чтобы соединить крышки бутылок вместе.
Шаг 4: Добавьте кусочек воронки в отверстие
Вставьте кусок воронки в отверстия и будьте точны на этом шаге.
Шаг 5: Положите сухой песок в бутылку
Заполните половину одной бутылки сухим песком, используя оставшуюся воронку.
Шаг 6: Поместите подключенные колпачки на бутылки
Добавьте крышки к бутылкам и убедитесь, что они надежно закреплены с помощью ленты.
Подводя черту
Один забавный факт о схеме таймера заключается в том, что она программируема.
По сути, это означает, что вы можете установить то, что вы хотите, чтобы таймер делал. Кроме того, вы можете настроить время задержки в соответствии с вашими личными предпочтениями и установить их время задержки независимо друг от друга. Таким образом, это важнейшая часть схемы таймера.
На этом все и заканчивается! Если у вас есть какие-либо вопросы или вы хотите получить дополнительную информацию о таймерах DIY, не стесняйтесь обращаться к нам.
Hommer Zhao
Привет, я Хоммер, основатель WellPCB. На сегодняшний день у нас более 4000 клиентов по всему миру. Если у вас возникнут какие-либо вопросы, вы можете связаться со мной. Заранее спасибо.
Помидорный таймер на Arduino
Всем привет! Для рационального распределения времени была придумана техника помидорного таймера. Её суть состоит в том, чтобы определить задачи для выполнения, расставить приоритеты, после чего установить таймер 25 минут на одну задачу. Во время работы таймера выполнять задачу, не отвлекаясь на посторонние факторы. После окончания таймера сделать пяти минутный перерыв. После отдыха взяться за следующую задачу.
Чтобы сделать метод удобнее, попробуем создать DIY — фиджет (физический виджет), который бы позволил не отвлекаться на переключение вкладок в браузере или использование дополнительных приложений.
Для этого проекта нам понабиться следующая электроника:
Подключаем компоненты по схеме:
Для сборки прототипа я использовал макетную плату:
Перейдем к написанию скетча:
Будем опрашивать кнопку, при нажатии на которую запустим рабочий таймер, после его окончания запустим сигнал конца и запустим таймер отдыха.
Для управления дисплеем, чтения показаний с кнопки, создания таймеров я использую библиотеки:
#include «GyverButton.h» #include #include
Объявим некоторые константы для пинов и параметров:
#define WORK_TIME 25 //Время работы в минутах #define RELAX_TIME 5 //Время отдыха в минутах #define MOTOR_PIN 5 //Пин вибро-двигателя #define BTN_PIN 3 //Пин кнопки #define LIGHT_PIN 7 //Пин свеиодиода #define MOTOR_FORCE 240 //Сила вращения мотора #define MOTOR_BEEP 1 //Количество повторений сигнала int page = 0; //переменные таймеров uint32_t tam_w; uint32_t tam_r;
GyverOLED oled; //дисплей GButton ok(BTN_PIN, HIGH_PULL); //кнопка TimerMs tmr_w(WORK_TIME * 60000, 0, 1); //рабочий таймер TimerMs tmr_r(RELAX_TIME * 60000, 0, 1); //таймер отдыха
void setup() < oled.init(); //инициализация дисплея pinMode(MOTOR_PIN, OUTPUT); //выход мотора pinMode(LIGHT_PIN, OUTPUT); //выход светодиода analogWrite(MOTOR_PIN, 0); digitalWrite(LIGHT_PIN, LOW); ok.setClickTimeout(100); Wire.setClock(800000L); //Настройка частоты обновления дисплея oled.clear(); oled.home(); oled.setScale(3); oled.autoPrintln(true); oled.print("ТЕХНИКАПОМИДОРА"); oled.update(); delay(3 * 1000); >
void loop() < ok.tick(); //проверяем состояние кнопки //проверяем таймеры tmr_w.tick(); tmr_r.tick(); oled.setScale(2); oled.clear(); oled.home(); switch (page) < case 0: //Стартовое меню oled.print("Нажми на кнопку дляотсчета!"); if (ok.isClick()) < tmr_w.start(); //Если кнопка нажата запускаем таймер page = 1; >break; case 1: //Меню рабочего таймера pause(); //проверка на остановку таймера if (tmr_w.elapsed()) < //Если время истекло запускаем 2й таймер sos(); //Сигнал tmr_r.start(); page = 2; //переходим в меню отдыха >oled.setCursor(25, 0); oled.print("Работа"); oled.setScale(3); oled.setCursor(0, 1 * 2); oled.print(tmr_w.timeLeft() / 1000); //Сколько осталось времени break; case 2: //меню отдыха pause(); //проверка на остановку таймера oled.setCursor(25, 0 * 2); oled.print("Отдых"); oled.setScale(3); oled.setCursor(0, 1 * 2); oled.print(tmr_r.timeLeft() / 1000); //Сколько осталось времени if (tmr_r.elapsed()) < //если время вышло запускаем 1й таймер sos(); tmr_w.start(); page = 1; >break; > oled.update(); //обновление дисплея >
Я добавил функцию паузы, чтобы можно было приостановить таймер:
void pause() < if (ok.isClick()) < //если кнопка нажата if (tmr_w.active()) < //и таймер работы активен tam_w = tmr_w.timeLeft(); tmr_w.stop(); //остановить таймер >else < tmr_w.setTime(tam_w); tmr_w.start(); //заново запустить >if (tmr_r.active()) < //если таймер отдыха активен tam_r = tmr_r.timeLeft(); tmr_r.stop(); //остановить таймер >else < tmr_r.setTime(tam_r); tmr_r.start(); //заново запустить >> >
И функция сигнализации при окончании времени:
void sos() < oled.home(); oled.clear(); oled.print("SOS"); for (int i = 0; i < MOTOR_BEEP; i++) < analogWrite(MOTOR_PIN, MOTOR_FORCE); //Запускаем мотор digitalWrite(LIGHT_PIN, HIGH); //Включаем светодиод delay(1 * 1000); analogWrite(MOTOR_PIN, 0); //Останавливаем мотор digitalWrite(LIGHT_PIN, LOW); //Выключаем светодиод delay(1 * 1000); >>
Демонстрация работы представлена на видео:
Создав такой полезный прибор, вы сможете точнее управлять своим временем и повысить свою работоспособность.
Спасибо за внимание и удачи в ваших проектах!
Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.
Arduino и прерывания таймера
Плата Arduino позволяет быстро и минимальными средствами решить самые разные задачи. Но там где нужны произвольные интервалы времени (периодический опрос датчиков, высокоточные ШИМ сигналы, импульсы большой длительности) стандартные библиотечные функции задержки не удобны. На время их действия скетч приостанавливается и управлять им становится невозможно.
В подобной ситуации лучше использовать встроенные AVR таймеры. Как это сделать и не заблудиться в технических дебрях даташитов, рассказывает удачная статья, перевод которой и предлагается вашему вниманию.
В этой статье обсуждаются таймеры AVR и Arduino и то, как их использовать в Arduino проектах и схемах пользователя.
Что такое таймер?
Как и в повседневной жизни в микроконтроллерах таймер это некоторая вещь, которая может подать сигнал в будущем, в тот момент который вы установите. Когда этот момент наступает, вызывается прерывание микроконтроллера, напоминая ему что-нибудь сделать, например выполнить определенный фрагмент кода.
Таймеры, как и внешние прерывания, работают независимо от основной программы. Вместо выполнения циклов или повторяющегося вызова задержки millis() вы можете назначить таймеру делать свою работу, в то время как ваш код делает другие вещи.
Итак, предположим, что имеется устройство, которое должно что-то делать, например мигать светодиодом каждые 5 секунд. Если не использовать таймеры, а писать обычный код, то надо установить переменную в момент зажигания светодиода и постоянно проверять не наступил ли момент ее переключения. С прерыванием по таймеру вам достаточно настроить прерывание, и затем запустить таймер. Светодиод будет мигать точно вовремя, независимо от действий основной программы.
Как работает таймер?
Он действует путем увеличения переменной, называемой счетным регистром. Счетный регистр может считать до определенной величины, зависящей от его размера. Таймер увеличивает свой счетчик раз за разом пока не достигнет максимальной величины, в этой точке счетчик переполнится и сбросится обратно в ноль. Таймер обычно устанавливает бит флага, чтобы дать вам знать, что переполнение произошло.
Вы можете проверять этот флаг вручную или можете сделать таймерный переключатель — вызывать прерывание автоматически в момент установки флага. Подобно всяким другим прерываниям вы можете назначить служебную подпрограмму прерывания (Interrupt Service Routine или ISR), чтобы выполнить заданный код, когда таймер переполнится. ISR сама сбросит флаг переполнения, поэтому использование прерываний обычно лучший выбор из-за простоты и скорости.
Чтобы увеличивать значения счетчика через точные интервалы времени, таймер надо подключить к тактовому источнику. Тактовый источник генерирует постоянно повторяющийся сигнал. Каждый раз, когда таймер обнаруживает этот сигнал, он увеличивает значение счетчика на единицу. Поскольку таймер работает от тактового источника, наименьшей измеряемой единицей времени является период такта. Если вы подключите тактовый сигнал частотой 1 МГц, то разрешение таймера (или период таймера) будет:
T = 1 / f (f это тактовая частота)
T = 1 / 1 МГц = 1 / 10^6 Гц
T = (1 ∗ 10^-6) с
Таким образом разрешение таймера одна миллионная доля секунды. Хотя вы можете применить для таймеров внешний тактовый источник, в большинстве случаев используется внутренний источник самого чипа.
Типы таймеров
В стандартных платах Arduino на 8 битном AVR чипе имеется сразу несколько таймеров. У чипов Atmega168 и Atmega328 есть три таймера Timer0, Timer1 и Timer2. Они также имеют сторожевой таймер, который можно использовать для защиты от сбоев или как механизм программного сброса. Вот некоторые особенности каждого таймера.
Timer0:
Timer0 является 8 битным таймером, это означает, что его счетный регистр может хранить числа вплоть до 255 (т. е. байт без знака). Timer0 используется стандартными временными функциями Arduino такими как delay() и millis(), так что лучше не запутывать его если вас заботят последствия.
Timer1:
Timer1 это 16 битный таймер с максимальным значением счета 65535 (целое без знака). Этот таймер использует библиотека Arduino Servo, учитывайте это если применяете его в своих проектах.
Timer2:
Timer2 — 8 битный и очень похож на Timer0. Он используется в Arduino функции tone().
Timer3, Timer4, Timer5:
Чипы ATmega1280 и ATmega2560 (установлены в вариантах Arduino Mega) имеют три добавочных таймера. Все они 16 битные и работают аналогично Timer1.
Конфигурация регистров
Для того чтобы использовать эти таймеры в AVR есть регистры настроек. Таймеры содержат множество таких регистров. Два из них — регистры управления таймера/счетчика содержат установочные переменные и называются TCCRxA и TCCRxB, где x — номер таймера (TCCR1A и TCCR1B, и т. п.). Каждый регистр содержит 8 бит и каждый бит хранит конфигурационную переменную. Вот сведения из даташита Atmega328:
TCCR1A | ||||||||
---|---|---|---|---|---|---|---|---|
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0x80 | COM1A1 | COM1A0 | COM1B1 | COM1B0 | — | — | WGM11 | WGM10 |
ReadWrite | RW | RW | RW | RW | R | R | RW | RW |
Начальное значение | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
TCCR1B | ||||||||
---|---|---|---|---|---|---|---|---|
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0x81 | ICNC1 | ICES1 | — | WGM13 | WGM12 | CS12 | CS11 | CS10 |
ReadWrite | RW | RW | R | RW | RW | RW | RW | RW |
Начальное значение | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Наиболее важными являются три последние бита в TCCR1B: CS12, CS11 и CS10. Они определяют тактовую частоту таймера. Выбирая их в разных комбинациях вы можете приказать таймеру действовать на различных скоростях. Вот таблица из даташита, описывающая действие битов выбора:
CS12 | CS11 | CS10 | Действие |
---|---|---|---|
0 | 0 | 0 | Нет тактового источника (Timer/Counter остановлен) |
0 | 0 | 1 | clk_io/1 (нет деления) |
0 | 1 | 0 | clk_io/8 (делитель частоты) |
0 | 1 | 1 | clk_io/64 (делитель частоты) |
1 | 0 | 0 | clk_io/256 (делитель частоты) |
1 | 0 | 1 | clk_io/1024 (делитель частоты) |
1 | 1 | 0 | Внешний тактовый источник на выводе T1. Тактирование по спаду |
1 | 1 | 1 | Внешний тактовый источник на выводе T1. Тактирование по фронту |
По умолчанию все эти биты установлены на ноль.
Допустим вы хотите, чтобы Timer1 работал на тактовой частоте с одним отсчетом на период. Когда он переполнится, вы хотите вызвать подпрограмму прерывания, которая переключает светодиод, подсоединенный к ножке 13, в состояние включено или выключено. Для этого примера запишем Arduino код, но будем использовать процедуры и функции библиотеки avr-libc всегда, когда это не делает вещи слишком сложными. Сторонники чистого AVR могут адаптировать код по своему усмотрению.
Сначала инициализируем таймер:
// avr-libc library includes #include #include #define LEDPIN 13 void setup() < pinMode(LEDPIN, OUTPUT); // инициализация Timer1 cli(); // отключить глобальные прерывания TCCR1A = 0; // установить TCCR1A регистр в 0 TCCR1B = 0; // включить прерывание Timer1 overflow: TIMSK1 = (1
Регистр TIMSK1 это регистр маски прерываний Таймера/Счетчика1. Он контролирует прерывания, которые таймер может вызвать. Установка бита TOIE1 приказывает таймеру вызвать прерывание когда таймер переполняется. Подробнее об этом позже.
Когда вы устанавливаете бит CS10, таймер начинает считать и, как только возникает прерывание по переполнению, вызывается ISR(TIMER1_OVF_vect). Это происходит всегда когда таймер переполняется.
Дальше определим функцию прерывания ISR:
ISR(TIMER1_OVF_vect)
Сейчас мы можем определить цикл loop() и переключать светодиод независимо от того, что происходит в главной программе. Чтобы выключить таймер, установите TCCR1B=0 в любое время.
Как часто будет мигать светодиод?
Timer1 установлен на прерывание по переполнению и давайте предположим, что вы используете Atmega328 с тактовой частотой 16 МГц. Поскольку таймер 16-битный, он может считать до максимального значения (2^16 – 1), или 65535. При 16 МГц цикл выполняется 1/(16 ∗ 10^6) секунды или 6.25e-8 с. Это означает что 65535 отсчетов произойдут за (65535 ∗ 6.25e-8 с) и ISR будет вызываться примерно через 0,0041 с. И так раз за разом, каждую четырехтысячную секунды. Это слишком быстро, чтобы увидеть мерцание.
Если мы подадим на светодиод очень быстрый ШИМ сигнал с 50% заполнением, то свечение будет казаться непрерывным, но менее ярким чем обычно. Подобный эксперимент показывает удивительную мощь микроконтроллеров — даже недорогой 8-битный чип может обрабатывать информацию намного быстрей чем мы способны обнаружить.
Делитель таймера и режим CTC
Чтобы управлять периодом, вы можете использовать делитель, который позволяет поделить тактовый сигнал на различные степени двойки и увеличить период таймера. Например, вы бы хотели мигания светодиода с интервалом одна секунда. В регистре TCCR1B есть три бита CS устанавливающие наиболее подходящее разрешение. Если установить биты CS10 и CS12 используя:
TCCR1B |= (1
то частота тактового источника поделится на 1024. Это дает разрешение таймера 1/(16 ∗ 10^6 / 1024) или 6.4e-5 с. Теперь таймер будет переполняться каждые (65535 ∗ 6.4e-5с) или за 4,194с. Это слишком долго.
Но есть и другой режим AVR таймера. Он называется сброс таймера по совпадению или CTC. Вместо счета до переполнения, таймер сравнивает свой счетчик с переменой которая ранее сохранена в регистре. Когда счет совпадет с этой переменной, таймер может либо установить флаг, либо вызвать прерывание, точно так же как и в случае переполнения.
Чтобы использовать режим CTC надо понять, сколько циклов вам нужно, чтобы получить интервал в одну секунду. Предположим, что коэффициент деления по-прежнему равен 1024.
Расчет будет следующий:
(target time) = (timer resolution) * (# timer counts + 1) (# timer counts + 1) = (target time) / (timer resolution) (# timer counts + 1) = (1 s) / (6.4e-5 s) (# timer counts + 1) = 15625 (# timer counts) = 15625 - 1 = 15624
Вы должны добавить дополнительную единицу к числу отсчетов потому что в CTC режиме при совпадении счетчика с заданным значением он сбросит сам себя в ноль. Сброс занимает один тактовый период, который надо учесть в расчетах. Во многих случаях ошибка в один период не слишком значима, но в высокоточных задачах она может быть критичной.
Функция настройки setup() будет такая:
void setup() < pinMode(LEDPIN, OUTPUT); // инициализация Timer1 cli(); // отключить глобальные прерывания TCCR1A = 0; // установить регистры в 0 TCCR1B = 0; OCR1A = 15624; // установка регистра совпадения TCCR1B |= (1
Также нужно заменить прерывание по переполнению на прерывание по совпадению:
ISR(TIMER1_COMPA_vect)
Сейчас светодиод будет зажигаться и гаснуть ровно на одну секунду. А вы можете делать все что угодно в цикле loop(). Пока вы не измените настройки таймера, программа никак не связана с прерываниями. У вас нет ограничений на использование таймера с разными режимами и настройками делителя.
Вот полный стартовый пример который вы можете использовать как основу для собственных проектов:
// Arduino таймер CTC прерывание // avr-libc library includes #include #include #define LEDPIN 13 void setup() < pinMode(LEDPIN, OUTPUT); // инициализация Timer1 cli(); // отключить глобальные прерывания TCCR1A = 0; // установить регистры в 0 TCCR1B = 0; OCR1A = 15624; // установка регистра совпадения TCCR1B |= (1 void loop() < // основная программа >ISR(TIMER1_COMPA_vect)
Помните, что вы можете использовать встроенные ISR функции для расширения функций таймера. Например вам требуется опрашивать датчик каждые 10 секунд. Но установок таймера, обеспечивающих такой долгий счет без переполнения нет. Однако можно использовать ISR чтобы инкрементировать счетную переменную раз в секунду и затем опрашивать датчик когда переменная достигнет 10. С использованием СТС режима из предыдущего примера прерывание могло бы выглядеть так:
ISR(TIMER1_COMPA_vect) < seconds++; if(seconds == 10) < seconds = 0; readSensor(); >>
Поскольку переменная будет модифицироваться внутри ISR она должна быть декларирована как volatile. Поэтому, при описании переменных в начале программы вам надо написать:
volatile byte seconds;
Послесловие переводчика
В свое время эта статья сэкономила мне немало времени при разработке прототипа измерительного генератора. Надеюсь, что она окажется полезной и другим читателям.
Как я делаю опенсорсную статусную панель «я занят»
Прототип моего проекта светодиодной таблички, которая показывает что я занят — Busy StatusBar
Мне надоело, что на работе меня постоянно отвлекают, сбивая фокус с задачи, так что техника помидора становится бесполезна. Я не нашел удобных способов быстро сообщить всем вокруг, что в ближайшие 20 минут я в режиме гиперфокуса. При этом я не хочу выглядеть занудой к которому все боятся подойти. Мне нужен был инструмент, который точно скажет всем окружающим, что именно в данный момент я занят и через сколько времени я освобожусь и буду готов пообщаться.
Поэтому я решил сделать табличку, которая полностью заменяет помидорный таймер и одновременно показывает окружающим, что я занят и время через которое я освобожусь. Важно было ее максимально легко активировать, за одну секунду — нажал кнопку и загорается статус BUSY с обратным отсчетом. Прошивку и API думаю сделать полностью открытую, чтобы все могли прикручивать устройству свои интеграции, например плагины для тайм-трекеров.
В статье я расскажу как ищу дизайн и эргономику устройств, делаю железо и весь путь от идеи, до подготовки к серийному производству. Покажу текущий прототип на базе ESP32.
Приглашаю всех желающих поучаствовать в разработке.
В опенспейсе нельзя сосредоточиться
Я использую метод помидора и работаю маленькими забегами по 25 минут. Ставлю таймер и стараюсь ни на что не отвлекаться кроме текущей задачи, потом делаю перерыв 5 минут. Это простая техника работает в моем случае и помогает быть максимально эффективным.
Техника помидорного таймера: 25 минут работаю, 5 минут отдыхаю
Но после того, как я стал проджект менеджером это стало невозможно. Все постоянно от меня что-то хотят, спрашивают и отвлекают. Это раздражает, вся моя техника помидора ломается.
Я ставил на стол бумажную табличку с надписью “BUSY”. Многие ее не замечали и игнорировали, тогда начал клеить большой лист на монитор, это работало лучше. Но теперь помимо установки таймера мне нужно было вешать лист, а когда таймер истекает, не забывать его снимать.
Бумажные таблички: маленькую люди не замечают, а большую неудобно вешать на монитор и снимать когда закончил.
Тогда я решил слепить светящуюся табличку. Идея была в том, что большая и яркая надпись активируется и загорается по кнопке, при этом ее не надо ставить и убирать. А главное можно активировать за секунду, в отличии от приклеивания таблички на монитор.
Идея светящейся таблички с быстрой активацией
Справедливости ради, похожие концептуально лампы уже есть в продаже. Но все настольные, которые мне удалось найти, светят во все стороны и раздражают. Либо это какие-то огромные светодиодные табло которые нужно вешать на стену. Если вы знаете хорошие варианты, посоветуйте, пожалуйста.
Первый прототип из картона и диодной ленты
На замену листу бумаги я собрал светящуюся лампу с надписью из картона. Под рукой была только светодиодная лента и тумблер выключения. Экспериментально я пытался подобрать размер и яркость надписи, чтобы человек успевал разглядеть табличку еще на расстоянии при подходе к моему столу.
Светящаяся надпись в табличке из картонной коробки
Свою функцию он выполнял, но оказался неудобным: во время включения картонная коробка ездила по столу и приходилось ее придерживать. Даже если бы я взял удобную кнопку которая нажималась сверху, из-за высоты таблички, она постоянно заваливалась если толкнуть стол. Очевидно было, нужно либо увеличивать вес, либо уменьшать высоту.
А когда освободишься?
Оказалось, что просто надписи недостаточно, если что-то очень срочное, люди все равно прорывались через табличку и спрашивали “Когда ты освободишься?”.
Было понятно, что только надпись не работает и тогда я решил собрать новую версию: добавить таймер обратного отсчета и сделать более практичный корпус. Таймер будет отображать обратный отсчет, показывая через сколько я освобожусь, а новый корпус решит проблемы с устойчивостью и прочностью.
Вторая версия: добавляю дисплей и таймер
Чтобы люди не спрашивали “когда освободишься?”, нужно было объяснить сколько еще я буду занят. Для этого решил использовать дисплей, на котором будет отображаться оставшееся время и статус “BUSY”. Взял готовую диодную матрицу. Размер ее великоват, но в наличии были только такие. На ее основе сделал корпус и распечатал его на 3д принтере.
Устройство активируется в два этапа: первый раз колесиком настраивается время таймера, кнопка старта запускает таймер и выводит статус на это время. Если нажать кнопку старта пока таймер запущен, то он остановится. Предыдущее установленное время таймера сохраняется, так что если нажать кнопку старта, таймер запустится на то же время, которое было установлено в предыдущий раз.
Колесиком настраивается время таймера, кнопкой запускает таймер и выводится статус.
Для настройки времени хотелось иметь именно механический энкодер (колесико), потому что кнопки не так приятно нажимать. Иногда я меняю время интервала и хочется сохранить схожее тактильное ощущение как от помидорного кухонного таймера.
Кнопку старта переместил наверх для удобства и устойчивости. Теперь по ней можно не глядя нажимать открытой ладонью, подобно шахматным часам. Такая конструкция оказалась удобнее любых боковых кнопок, тумблеров и переключателей на кабеле. Нажатие очень однозначное и можно не прицеливаться.
Большую кнопку сверху считаю очень удачной идеей. Я не видел такого в других похожих продуктах. Везде нужно либо нажимать сбоку, либо, даже если есть кнопка сверху, нужно придерживать устройство, чтобы оно не упало и точно целиться пальцем по кнопке.
Этим прототипом уже можно было пользоваться и он вполне выполнял свою задачу.
Минусы первого прототипа с дисплеем:
- Низкая плотность пикселей, тяжело читать
- Надпись плохо видно на солнце
- Занимает много места на столе
- Некрасивый, стыки деталей и винты выделялись
- Нужна розетка
Делаю красиво и уменьшаю размер
После первого прототипа с экраном было понятно общее направление и эргономика. Теперь решил сфокусироваться на дизайне, поиске формы. В новом дизайне таблички сделал акцент на кнопке запуска, теперь она большая и заметная.
В новом дизайне кнопка запуска большая, чтобы быстро нажимать не всматриваясь.
Табличку уменьшил до размера одной строки, этого достаточно для отображения статуса и времени (пиксельным шрифтом 8х64 пикселя), готовую матрицу не нашел, решил делать свою. Из-за компактного размера хочется иметь возможность перемещать табличку от розетки, например повесить на дверь и активировать сообщение НЕ ВХОДИТЬ , поэтому решено добавить аккумулятор.
Пока экспериментирую с размером и формой таблички. Первые версии меньше и тоньше, потому что тогда не учитывал электронику и батарейку. Сейчас размер больше отталкивается от требования электроники и минимально допустимой устойчивости на столе.
7 прототипов формы таблички
Пока сделал 7 итераций, дорабатываю недочеты после каждой версии: меняю размеры, фаски, углы наклона. В последних версиях появился наклон экрана вверх, так чтобы табличку можно было ставить на стол и надпись было видно стоящему человеку у стола.
Изначально были мысли сделать у таблички отверстия под крепления сзади, чтобы можно было вешать ее на оснастку и закреплять на мониторе или на двери. Вешать на шурупах на стену и т.д. Но от этой идеи было решено отказаться, потому что на задней стороне тоже появился дисплей. А возможность крепления вертикально на поверхности думаю сделать с помощью съемного магнитного крепления.
Хронология разработки дизайна таблички: как менялась форма и габариты
С финальным дизайном, кажется получилось определиться. Это белый прямоугольник, с черной лицевой панелью. Черное тонирующее стекло закрывает светодиоды так, чтобы когда они выключены однозначно понятно, что она выключена. Насчет места расположения USB порта пока нет уверенности. кажется, что его правильно размещать сбоку на торце, но тогда это не очень удобно при креплении на монитор. Как вы считаете?
Предфинальный дизайн устройства
Крепление на вертикальные поверхности
Иногда я записываю звук в кабинете и не люблю когда мои домашние открывают дверь или стучат. Поэтому захотелось крепить табличку еще и на дверь домашней студии. Пока планирую вмонтировать внутрь корпуса неодимовые магниты и класть в комплект ответную тонкую металлическую пластину на двустороннем вспененном скотче. Приклеил пластину на стену, монитор, дверь и легко можно крепить и снимать устройство.
Так как при монтаже на дверь, устройство придется регулярно снимать и заряжать, для этого важно чтобы это было легко сделать. Поэтому магниты и металлическая пластина кажется самым правильным вариантом.
Крепление на вертикальные поверхности с помощью магнита и металлической пластины
Дисплей с задней стороны
Еще в первом прототипе стало понятно, что невозможно определить сколько времени осталось до конца таймера, приходилось разворачивать устройство к себе. С кухонным таймером было проще, одним взглядом можно было понять сколько еще работать или отдыхать. Поэтому решил добавить с обратной стороны маленький OLED или ЖК дисплей, чтобы выводить на него оставшееся время и заряд батареи.
Дисплей с обратной стороны показывает сколько времени осталось до окончания таймера
Хотел использовать ЖК дисплей с подсветкой, но его контрастность при малых размерах не дает хорошей видимости, поэтому остановился на OLED с I2C подключением. По размеру выбирал между 0,96" и 1,3З", на втором видимость была лучше и иконки лучше читались, поэтому выбрал его. Понимаю, что возможно выгорание OLED, но пока считаю его оптимальным вариантом с точки зрения контрастности, плюс датчик освещения и изменение яркости продлит жизнь дисплея. Если считаете, что есть варианты получше, посоветуйте, пожалуйста.
OLED дисплеи разного размера для задней стороны устройства. Варианты с инверсией и без.
Диодная матрица и железо
Дисплей выбирали из готовых модулей, но под наши размеры готовых нет. Поэтому делаем свою матрицу на кастомной плате. Разрешение 64х8 пикселей. Чтобы определиться с размером, я попробовал написать «я занят» на основных языках мира и проверить влезет ли она. Для букв шрифта 8 пикселей по высоте достаточно, а в ширину 64 пикселя – минимальное значение, чтобы уместилось слово “занят” на чешском языке, оно самое длинное.
Прототип матрицы 64х8 пикселей с самым длинным словом “занят” на чешском языке.
Первая тестовая плата с диодами 2.1 х 2.1 мм, с расстоянием между диодами 1.5 мм. Все-таки размер великоват, вместе с корпусом получается слишком большая штука, которую неудобно класть в сумку.
Первая тестовая плата с диодами размером 2.1х2.1 мм, разрешение 64х8
Сейчас изучаем 5 различных типов диодов с размером от 1 до 1.6 мм. Планируем сделать на одной плате пробные матрицы 8х8 пикселей с разными диодами, чтобы проверить яркость и выбрать окончательный вариант. На момент написания статьи эти тестовые модули еще в производстве.
Ожидается, что такой размер диодов позволит увеличить разрешение до 80х16 пикселей, так поместиться больше информации на одном экране, а размер самой матрицы станет меньше. Но пока что непонятно как в жизни будут выглядеть эти сверх маленькие RGB диоды. Возможно сообщество подскажет что-то. Какие маленькие диоды посоветуете?
Тестовая плата с матрицами 8х8 с диодами разного размера от 1 до 1.6 мм.
Блок-схема
Первые прототипы делались на Ардуино, но в продакшене планируется использовать ESP32-S3-WROOM1. Он умеет и Bluetooth, и WiFi, умеет засыпать для экономии энергии, у него много периферии и низкий ценник. Возможно в будущем перейдем на что-то типа NRF, но пока ESP32 устраивает.
Блок схема устройства
Процессор ESP32-S3-WROOM-1 на первой дев борде устройства
API и интеграции, Bluetooth LE и WiFi
Хочется сделать табличку максимально универсальной, чтобы ее можно было интегрировать в свои проекты, системы умного и глупого дома. В устройстве будет поддержка Bluetooth Low Energy и WiFi, чтобы можно было вывести свои уведомления, курсы валют, статус серверов, число подписчиков в TikTok и так далее. Хочется сделать максимально удобное открытое API, возможно поддержку протоколов типа MQTT.
Пока API находится на стадии высокоуровневого дизайна, приглашаю всех неравнодушных описать что бы вы хотели видеть в API и способах подключения. Для чего вам была бы полезна такая табличка?
Приглашаю поучаствовать в проекте
Мне хочется сделать по-настоящему полезное устройство, которое будет помогать людям каждый день. Сейчас проект находится на этапе дизайна и разработки и я приглашаю всех поучаствовать в обсуждении. Какие функции будут полезны именно вам, и что бы вы хотели видеть в финальном устройстве. Весь процесс разработки я буду детально описывать здесь.
Если интерес к проекту будет достаточным, мы с командой планируем запустить проект на краудфандинговой площадке. Поэтому прошу оставить почту на сайте BusyStatusBar.com и подписаться на наш инстаграм @busystatusbar
- busystatusbar
- gtd
- продуктивность
- промышленный дизайн
- time management
- управление временем
- я занят
- GTD
- Управление персоналом
- Производство и разработка электроники