Как стать автором
Обновить

Python и пиво — взболтать, но не смешивать

Время на прочтение3 мин
Количество просмотров5.7K


Привет, Habr! Решил описать небольшую систему автоматизации для создания чудесного напитка. Для того, чтобы пиво было вкусным важны время и температура, температура и время. Причём они настолько же необходимы, как и ингридиенты, составляющие сусло. Чтобы пройти путь до готового продукта требуется от 14 до 20 шагов с различной температурой и временем пивоварения. Для всех заинтересовавшихся этим загадочным процессом, прошу под кат.

Нам потребуется два чана различного объёма, для трёх видов:

  • сусло Эля
  • Пшеничное сусло
  • Пильзнер

Каждый тип проходит соответственно различные шаги по времени и температуре. Конечно можно было бы использовать инструкцию и секундомер, но это ужасно неудобно. Поэтому составим csv таблицу, в которой будем хранить: номер шага, объем, целевую температуру, время.

Далее возьмём rasbpberry pi zero и присоединим к нему два датчика температуры DS18B20.
Каждый из датчиков позволит отслеживать температуру в соответствующем чане. Для того, чтобы автоматизировать процесс отсчёта времени установим на малинку adafruit 128x64 oled, на дисплее которого будет отображаться вся необходимая информация.
Кнопками же мы сможем управлять проходом по шагам таблицы, а также запускать таймер.

Код таймера
def timer_code(seconds, t_counter = 2, restart = False):
    time.sleep(0.023)
    seconds -= time.time() - t_counter
    t_counter = time.time()
    minutes = trunc(seconds / 60.0)
    return seconds, minutes, t_counter

Загадочные
time.sleep(0.023)
здесь по причине того, что на обновление дисплея уходит порядка двух секунд, соответственно экспериментально была установленна данная поправка, позволяющая времени таймера идти каждые две секунды.

Итак, у нас есть таймер, который уменьшается каждые две секунды, соответственно важно, когда он дойдёт до нуля, а мы проморгали время, он отсчитал его, т. е. шёл со знаком минус.

Отображаемые на дисплее секунды
if timer:
    if ((minutes < 0) and (seconds < 0)):
        sec = -round(seconds - 60.0*minutes)
    else:
        sec = round(seconds - 60.0*minutes)
else:
    sec = 0


Готово. Осталось лишь в бесконечном цикле отобразить всю необходимую информацию на дисплее и вуаля — мы получаем полуавтоматическую пивоваренную установку.

Код отрисовки
draw.rectangle((0, 0, width, height), outline=0, fill=0)
draw.text((x,top),    f"{beer_type[countB]} step {step} Pot 1", font=font, fill=255)
draw.text((x,top+8),  f"T={T1} deg., Target {Target1[step]}", font=font, fill=255)
draw.text((x,top+16), f"V={V1[step]} litres", font=font, fill=255)
if hop[step] == '':
     draw.text((x,top+25), " Pot 2 ", font=font, fill=255)
else:
     draw.text((x,top+25), f" Pot 2,  Pot = {hop[step]}", font=font, fill=255)
draw.text((x,top+34), f"T={T2} deg., Target {Target2[step]}", font=font, fill=255)
draw.text((x,top+45), f"V={V2[step]} litres", font=font, fill=255)
draw.text((x,top+54), f"Timer {minutes} min {sec} sec", font=font, fill=255)
# Display image.
disp.image(image)
disp.show()


Не забудем лишь запускать таймер по нажатию кнопки.

Кнопка
# Start timer
if not button_A.value:
    t_counter = time.time()
    print('A #5', button_A.value)
    timer = True


Конечно, полный код немного сложнее и в нём присутствует вывод всех трёх типов сусла, переключения между режимами и видами, переход по шагам, считывание данных с датчиков и прочее, но это было бы слишком громоздко. Кому интересно — можете написать мне в личные сообщения. Кстати, инвайт на Хабре достался за перевод видео о пивопарении. Всем вкусного пива и хорошей пятницы!
Теги:
Хабы:
Всего голосов 9: ↑7 и ↓2+5
Комментарии21

Публикации

Истории

Работа

Python разработчик
137 вакансий
Data Scientist
61 вакансия

Ближайшие события