Техника помидора — это метод тайм-менеджмента, разработанный итальянцем Франческо Чирилло, в котором таймер используется для разбивки работы на периоды времени, разделенные перерывами. Каждый период времени называется «помодоро» — Чирилло использовал кухонный таймер в форме помидора, а «помидор» по-итальянски — «помодоро».

M5Stack — это компания, которая производит впечатляющий ассортимент модульных IoT-устройств, и я давно хотел попробовать одно из них. Я решил начать с их продукта Core Ink. Свой я купил у Пиморони, M5Stack тоже продаю напрямую.

Это действительно хорошее автономное устройство с несколькими кнопками, экраном с электронными чернилами, зуммером, перезаряжаемой батареей и возможностями Wi-Fi. Все это умещается в очень красивом корпусе и выглядит вот так:

Я решил использовать Core Ink, чтобы сделать таймер Pomodoro в подарок близкому человеку, программируя на C с помощью Arduino IDE. Я получил свой код с помощью прилагаемого кабеля USB C. Вот как выглядит конечный продукт (ускорено на видео):

Как вы можете видеть на видео, моя версия таймера работает так…

  • Нажмите верхнюю кнопку на устройстве, чтобы запустить его.
  • Звучит зуммер.
  • Начинается 25-минутный рабочий период, при этом дисплей отсчитывает 25 минут.
  • Звучит зуммер, возвещая о коротком 5-минутном перерыве… дисплей отсчитывает 5 минут.
  • Звучит зуммер, и начинается очередной 25-минутный период работы…
  • После 4 периодов работы по 25 минут, разделенных 5-минутными перерывами, следует более длинный 10-минутный перерыв.
  • После 10-минутного перерыва цикл начинается снова.
  • В любой момент повторное нажатие верхней кнопки сбрасывает таймер в состояние ожидания.
  • При нажатии на кнопку питания отображается сообщение на прощание и устройство выключается.

Кодирование таймера Pomodoro с помощью Arduino IDE

Как это работает? На высоком уровне код имеет те же две точки входа, что и любой другой скетч Arduino:

  • setup(): код, который запускается один раз при первом включении устройства.
  • loop(): код, который непрерывно выполняется в цикле после завершения setup().

M5Stack предоставляет SDK для каждого из своих устройств в виде библиотеки Arduino. Это обеспечивает функции, упрощающие работу с дисплеем, кнопками и зуммером устройства. Приведен пример кода, и я использовал его, чтобы узнать о программировании устройства. Я не буду здесь подробно останавливаться на том, как использовать SDK, вместо этого мы сосредоточимся в основном на логике таймера Pomodoro.

Таймер имеет три состояния, поэтому я объявил константы для каждого из них:

  • STATE_IDLE: В настоящее время не используется, жду начала!
  • STATE_WORKING: В один из периодов работы.
  • STATE_BREAK: В один из перерывов, который может быть более коротким или длинным.

Я сохраняю текущее состояние в глобальной переменной с именем currentState, начальное значение которой устанавливается на STATE_IDLE. Другие глобальные переменные отслеживают, в какой итерации процесса мы находимся, чтобы у нас был более длинный перерыв после 4 рабочих периодов, сколько минут осталось в текущем состоянии и время, когда мы вошли в текущее состояние.

В устройстве нет часов реального времени, поэтому для отслеживания времени я использую функцию Arduino millis(), которая отслеживает количество миллисекунд с момента запуска программы (фактически время включения устройства). Вы можете прочитать об этой функции в Документации Arduino.

Настраивать

Функция setup() выглядит так:

Это инициализирует M5 SDK, очищает экран и создает на нем область рисования, а затем отображает начальное сообщение «Нажмите, чтобы начать». Наконец, он издает звуковой сигнал один раз. После завершения выполнения функция loop() начинает выполняться непрерывно.

Если вы хотите увидеть, как работает отрисовка текста на экране, ознакомьтесь с полным исходным кодом на GitHub.

Петля

После завершения setup() устройство бесконечно выполняет код функции loop(). Я решил написать свою функцию loop() так, чтобы она работала примерно так для каждой итерации:

  • Была ли нажата кнопка в верхней части устройства? Если это так, подайте звуковой сигнал три раза и сбросьте некоторые глобальные переменные, отслеживающие теперь, сколько минут осталось в текущем рабочем интервале и на какой итерации процесса мы находимся. Также установите текущее состояние на STATE_WORKING:
  • Была ли нажата кнопка питания? Если это так, отобразите сообщение на прощание, подайте звуковой сигнал, очистите экран и выключите устройство:
  • Затем, если мы не находимся в состоянии бездействия, проверяем, прошла ли минута, и уменьшаем количество минут, оставшихся в текущей фазе (рабочих, длительных или коротких перерывов), и обновляем экран. Если в текущей фазе не осталось минут, трижды подайте звуковой сигнал и решите, что делать дальше. Если мы находимся в рабочем состоянии, то интервал помидора только что закончился, и нам нужно сделать короткий или более длительный перерыв в зависимости от того, сколько рабочих интервалов мы сделали. Если мы находимся в состоянии перерыва, то перерыв только что закончился и пора начинать новый рабочий интервал:

И это в основном все. Это был относительно простой проект, который едва касался того, что может сделать это устройство, но в результате получился хороший конечный продукт :)

Попробуй сам!

Надеюсь, вам понравилось читать об этом — если вы приобрели Core Ink и хотите попробовать это, я разместил код на GitHub, и вы можете использовать его или изменить в своих целях. Я бы хотел посмотреть, что вы строите!