[Перевод] Умная крышка для мониторинга хлебной закваски
Хлеб — это один из основных компонентов нашего рациона, и многие предпочитают печь его самостоятельно в домашних условиях. В статье вы узнаете, как собрать и настроить уникальное приспособление для удаленного мониторинга подъема закваски, а также познакомитесь с результатами анализа собранных таким образом данных.
Несколько лет назад у меня возникла идея реализовать отслеживание подъема хлебной закваски с помощью компьютерного зрения. В теории это было очень удобно, но необходимость повторять процесс для каждого кормления делала затею непрактичной, так как нужно настраивать камеру, скачивать изображения и вручную их обрезать, после чего уже прогонять через анализирующий скрипт. К тому же анализ производился только постфактум, а мне нужен был способ в реальном времени получать информацию о готовности закваски либо о времени, когда она поднялась, на случай, если нужный момент был упущен.
В прошлом году я встретил ветку на Reddit, а также узнал о проекте sourd.io Кристины Суну. В обоих случаях авторы измеряли высоту закваски с помощью расположенного в крышке датчика расстояния. Мне это решение показалось гениальным, и я решил его повторить. Однако помимо онлайн-мониторинга я хотел также регистрировать данные с целью последующего анализа, для чего решил подключить датчик к интернету и считывать их напрямую. Сохранение на SD-карту я счел затратным и менее привлекательным в условиях современного мира, где практически все подключается по WiFi.
Если захотите собрать такое устройство сами — все файлы проекта и код доступны на GitHub.
Три режима: максимальный подъем/время, график и статистика
Отбор, просмотр и скачивание данных для сессии кормления
Честно говоря, этот проект занял больше времени, чем я ожидал, и порой меня даже одолевало равнодушие, полностью лишавшее мотивации его продолжать. В конечном итоге нахлынула очередная (не помню уже третья или четвертая) волна вдохновения, и я доделал-таки последние штрихи. Я рад, что не забросил начатое, потому что в итоге получил один из самых модных девайсов, какие мне доводилось собирать. Я делюсь с вами этим, потому что люди, особенно инженеры ПО, часто говорят о сторонних проектах и связанных с ними сложностях. В таких случаях мне кажется вполне нормальным уделять внимание своему душевному спокойствию и иногда просто впадать в режим «овоща».
Разработка
Если вас интересуют только полученные в итоге данные, можете сразу промотать к концу статьи, где я визуализирую рост, температуру и влажность на протяжении нескольких недель кормлений. В противном случае продолжайте читать, и вы узнаете подробности о разработке этого узкоспециализированного, около-эзотерического кухонного гаджета.
Электрическая часть
Все необходимые компоненты я заказал с Digikey и Aliexpress, а в качестве основы для подключения задействовал монтажную плату:
- NodeMCU ESP8266;
- датчик расстояния VL6180X;
- датчик температуры и влажности DHT22;
- OLED-дисплей SSD1306 128×32.
Для тестирования работоспособности всех этих компонентов я написал отдельный код, после чего перешел к проектированию печатной платы, чтобы облегчить интеграцию устройства в формфактор крышки банки.
Прототип платы с готовыми модулями
Раньше я собирал устройства на макетных платах (например, контроллер приготовления продуктов методом су-вид (sous vide)), но это занимало очень много времени. И поскольку я уже научился работать в KiCad, то теперь предпочитаю несколько недель подождать доставки заморских плат, особенно с учетом их дешевизны ($2 за 5 экземпляров плюс пересылка).
Макет платы и схема
Слева изображена верхняя сторона платы с дисплеем, а справа нижняя сторона с датчиками расстояния и температуры/влажности
На этом этапе мне уже не терпелось испробовать устройство в деле, поэтому я взял крышку из-под йогурта, вырезал в ней дырку и с помощью изоленты закрепил плату.
Выглядит неприглядно, зато работает
Устройство получилось достаточно работоспособным, чтобы предварительно протестировать начальный процесс, в ходе которого я также определил, что для получения реальной пользы от измерений потребуется знать следующие данные:
- высоту банки;
- начальную высоту закваски;
- высоту, до которой закваска поднялась.
Все требуемые значения я получил с помощью того же расположенного под крышкой датчика и простых математических вычислений.
Значения:
- d1=расстояние до дна банки;
- d2=расстояние до начальной высоты закваски;
- d3=расстояние до текущей высоты закваски;
- h1=начальная высота закваски;
- h2=текущая высота закваски.
Основные уравнения:
- h1=d1−d2h1=d1−d2
- h2=d2−d3h2=d2−d3
- h_процент подъема=h2/h1=(d2−d3)/(d1−d2)
В результате я получил формулу для вычисления уровня подъема закваски в процентах.
Корпус
Корпус я разработал во Fusion 360, после чего напечатал его на своем Monoprice Mini 3D.
Я не особо горжусь этим дизайном, так как плату мне пришлось крепить к корпусу с помощью термоклея, главным образом из-за того, что я забыл оставить на ней достаточно пространства для крепежных отверстий. При проектировании я старался добиться минимальной площади платы, чтобы снизить затраты, ради чего пришлось пожертвовать удобством интеграции.
Поскольку я не хотел припаивать модули прямо к плате, то решил использовать гнезда «мама», чтобы их в итоге можно было снимать. В связи с этим вся конструкция получилась достаточно высокой, и кнопку включения пришлось «нарастить». Мне не хотелось снова обращаться к Digikey специально ради особой кнопки, поэтому я просто приклеил к ней винт.
Все верно, это винт, приклеенный к кнопке включения
Как бы то ни было, но собралось все без проблем, и единственной заметной снаружи ошибкой стала торчащая шляпка винта. Можно сказать, что я намеренно таким образом придал конструкции стимпанковский вид.
Активная, здоровая закваска под внимательным мониторингом
Прошивка
Я решил использовать задачно-ориентированную архитектуру, так как реализация всего в одном конечном автомате может внести путаницу и сложности при отладке. В случае же многозадачности процессор выполняет одновременно только одну из задач, но при этом быстро между ними переключается, создавая видимость многопоточности. В других проектах я использовал FreeRTOS, но в этом случае хотел задействовать нечто более легковесное, так как не нуждался во всех примочках данной ОС.
Многозадачность выглядит как многопоточность (Source: FreeRTOS)
В процессе поиска я познакомился с TaskScheduler, кооперативным многозадачным фреймворком, который соответствовал всем моим требованиям.
Легковесная реализация кооперативной многозадачности в TaskScheduler (источник: GitHub)
Код был поделен на следующие задачи/файлы:
- measurements.cpp — считывает данные с датчиков и производит измерения, доступные для других задач.
- userinput.cpp — обрабатывает нажатия кнопки пользователем (короткое нажатие, длинное и двойное).
- display.cpp — отображает информацию на дисплее.
- iot.cpp — отправляет данные измерений в облако.
Удобство этой архитектуры в том, что каждый файл содержит менее 200 строчек кода, а четкое разделение задач упрощает разработку и отладку.
Дисплей показывает, насколько поднялась закваска, и сколько с этого момента прошло времени
После реализации архитектуры сама прошивка сложностей не вызвала. Единственной «особой» операцией стала запись высоты банки в EEPROM, чтобы она сохранялась между сессиями даже в случае отключения. Интересно отметить, что у ESP8266 нет собственной EEPROM, поэтому она эмулируется с использованием раздела флэш-памяти.
Подключение к облаку
Одной из самых долгих частей проекта стала настройка подключения ESP8266 к AWS. При этом возникло множество проблем совместимости библиотек, чего следовало ожидать, так как эта микросхема была выпущена 6 лет назад (на момент разработки). Если бы я не нашел ее в своем ящике с деталями, то использовал бы ESP32, с которой наверняка возникло бы куда меньше проблем.
Если вы решите воспроизвести проект, то позвольте избавить вас от лишней головной боли. Можете воспользоваться подготовленным мной шаблоном настройки, который также доступен на GitHub.
Как только мне удалось настроить передачу устройством сообщений через MQTT в AWS, я настроил облачную инфраструктуру на получение и сохранение передаваемых данных. Поток получился следующий:
- Устройство отправляет сообщение с данными через MQTT.
- В ответ на событие получения сообщения срабатывает функция AWS Lambda, считывая данные и передавая их в поток доставки Kinesis Firehose.
- Kinesis Firehose получает данные и сохраняет их на Amazon S3.
Архитектура AWS для простых IoT-приложений (источник: DZone)
Изначально я собирался использовать для визуализации данных Amazon QuickSight, но это предполагало ограничение скорости обновления, что для меня оказалось критическим. Вместо этого я, не страшась трудностей, создал собственную информационную панель с помощью Flask и HTML/CSS/JavaScript, которая запрашивает данные из S3, используя Amazon Athena. Ввиду своей чрезмерной лени я не стал выяснять, как разместить эту панель на AWS бесплатно и решил использовать Heroku (как делал это ранее для своего онлайн-калькулятора рецептов).
После успешного подключения к облаку и настройки информационной панели можно было начинать мониторить закваску.
Анализ
Основной целью мониторинга было облегчить контроль времени готовности закваски. И поскольку данные в любом случае собирались, я решил, что нелишним будет попутно провести анализ, чтобы выявить значительные детали процесса.
Общие выводы
За несколько недель мониторинга мне удалось собрать достаточное количество информации. Интересовало же меня два основных момента:
- Изменяется ли максимальная высота закваски по ходу повторяющихся кормлений.
- Будет ли закваска расти также, если поместить ее в холодильник и не кормить несколько дней.
На графике ядерной плотности, построенном для лучшего понимания данных, наблюдается некоторая кластеризация, но очевидные тенденции отсутствуют.
График ядерной плотности, показывающий распределение и кластеризацию данных. Очевидные корреляции отсутствуют
Приведенный ниже график отражает последовательность кормлений:
- 5 последовательных кормлений, начиная с 21 января;
- 3 последовательных кормления: 30 января, 3 февраля и 17 февраля;
- 2 последовательных кормления 12 февраля.
Примечание: горизонтальная ось немного смещена, так как в некоторые дни я делал несколько кормлений, а график предполагает, что каждое кормление происходит в отдельный день.
График кормления на протяжении нескольких недель
На графике ниже связи между длительностями подъема закваски не наблюдается. При этом нахождение закваски несколько дней в холодильнике также не оказало эффекта, что меня очень порадовало.
Статистической значимости между наиболее важными метриками не наблюдается
Подробности
Судя по данным временных рядов наблюдается увеличение высоты подъема закваски от первого до последнего кормления. Вот мои наблюдения:
- Пиковая высота подъема возросла со ~100% до ~200% к 6-му последовательному кормлению.
- Уклон при увеличении высоты подъема не изменялся, в том числе при нахождении закваски в холодильнике.
- Пиковая высота подъема достигается к ~5 часам и сохраняется в течение ~3–5 часов.
Примечание: я использовал расстойную камеру, в связи с чем температура и влажность сохранялись постоянными практически весь процесс ферментации. На протяжении большинства дней температура была установлена на 24С, но интересно то, что регистрировалось, как правило, около 30C. Для определения, какой из датчиков врет, нужно дополнительное тестирование.
Высота подъема, температура и влажность с течением времени
Парные графики временных рядов. Отметить здесь особо нечего, за исключением вполне ожидаемой корреляции температуры и влажности
Остальные данные о кормлении отражены на общей сводке ниже. Здесь можно обратить внимание на несколько интересных моментов, но для окончательных выводов требуются дополнительные эксперименты:
- 30 января: все кормления дали относительно одинаковый результат, даже первое после извлечения закваски из холодильника, где она находилась 5 дней.
- 3–5 февраля: после второго кормления сформировался более крутой уклон. Думаю, что в этот раз я изменил пропорции подкормки с 1:2:2 на 1:3:3, но точно не помню (а может в тот раз кормление делала жена?). Также интересно, что температура для третьего кормления не была постоянной. Может, расстойная камера была отключена?
- 12 февраля: после второго кормления подъем оказался на 100% выше, чем после первого. Скорее всего, пропорции подкормки были изменены. Кроме того, при первом кормлении также весьма странно себя вел показатель влажности.
- 17–18 февраля: после первого кормления подъем происходил дольше, чем после последующих двух, что опровергает мои наблюдения от 30 января…
Визуализация остальных данных о кормлениях (можно нажать для полного размера)
По сути, данные показывают, что в процессе участвует много других переменных. Поэтому, чтобы все эти измерения оказались действенными, нужно проследить ряд дополнительных показателей:
- пропорции подкормки;
- начальную и конечную температуру закваски (с помощью кулинарного термометра);
- жесткость воды (необязательно).
Помимо этого, я хочу провести кое-какие дополнительные эксперименты:
- сравнить пропорции ингредиентов подкормок и/или замесов теста;
- сравнить скорость роста в/вне среды с контролируемой температурой (то есть расстойной камеры);
- найти идеальное место при условии отсутствия расстойной камеры (Духовка с включенным светом? Микроволновка с теплой водой?).
Заключение
После этого исследования можно сделать вывод, что контроль времени подъема закваски не столь важен, поскольку она остается активной в своем пике на протяжение не менее двух часов. И если придерживаться хотя бы примерно регулярного графика кормления и поддерживать относительно стабильную среду, то можно выработать уверенное понимание того, сколько времени закваске требуется на подъем. Вы также можете настроить замедленную съемку на смартфоне, чтобы пронаблюдать, как этот процесс происходит.
Вся эта затея с выпечкой была очень интересной, так как инженеры любят метрики, а в случае с хлебной закваской измерять можно очень многое. И хоть собранный мной гаджет может кому-то показаться излишним, меня порадовала точность и уверенность, которую он для меня обеспечил, избавив от лишних догадок о состоянии закваски.
Я считаю, что всех пекарей можно поделить на две категории: тех, кто готовит по ощущениям, и тех, кто пользуется кухонными весами с точностью 0.01 г. Угадайте, к каким отношусь я ;)
Я называю это чертовски хороший мякиш!
Надеюсь, что вы нашли этот проект интересным. Если же у вас возникли попутные идеи о возможных дополнительных экспериментах, то не стесняйтесь делиться ими в комментариях.
Удачной выпечки!