Автоматизація температурних пауз при затиранні солоду
Затирання солоду для отримання пивного сусла або браги для віскі вимагає точного дотримання температурного профілю, витримування затору при певних температурах (паузах) протягом заданого часу для активації різних ферментів солоду.
Основні температурні паузи затирання#
Під час затирання пивовари найчастіше використовують такі паузи:
- Білкова пауза (45°C - 55°C, 15-20 хв):
- Розщеплює великі білки, покращує живлення дріжджів та знижує в'язкість сусла (особливо важливо при використанні несолодженого жита/пшениці).
- Мальтозна (бета-амілазна) пауза (60°C - 65°C, 30-60 хв):
- Активує бета-амілазу, яка утворює прості цукри (мальтозу), що легко зброджуються дріжджами. Робить пиво більш міцним та сухим.
- Оцукрювання (альфа-амілазна) пауза (67°C - 72°C, 30-45 хв):
- Активує альфа-амілазу, яка утворює незброджувані цукри (декстрини), що надають пиву повнотілості та солодового смаку.
- Mash-out (78°C, 10-15 хв):
- Деактивує всі ферменти та знижує в'язкість сусла для полегшення процесу фільтрації дробини.
Реалізація профілю затирання в C++ скрипті oCBot#
В автоматиці oCBot такий процес реалізується через структуру кроків (державного автомата). Нижче наведено готовий шаблон скрипта для 3-х температурних пауз:
#include "OcbScript.h"
struct MashStep {
float temperature; // Цільова температура паузи
unsigned long duration; // Тривалість паузи в мілісекундах
String name; // Назва кроку
};
class MashingController : public OcbScript {
private:
int heaterId; // ID ТЕНу
int tempSensorId; // ID давача температури в заторі
int buzzerId; // ID пищалки для сповіщень
MashStep steps[3]; // Масив кроків затирання
int currentStepIndex; // Індекс поточного кроку
unsigned long stepStartTime;
bool isTempReached; // Чи досягли температури паузи для старту таймера
public:
MashingController() {
heaterId = 2;
tempSensorId = 1;
buzzerId = 6;
currentStepIndex = 0;
isTempReached = false;
// Визначаємо кроки профілю затирання
steps[0] = { 52.0, 15 * 60000, "Білкова пауза" }; // 15 хв при 52°C
steps[1] = { 63.0, 40 * 60000, "Мальтозна пауза" }; // 40 хв при 63°C
steps[2] = { 78.0, 10 * 60000, "Mash-out" }; // 10 хв при 78°C
}
void init() override {
currentStepIndex = 0;
isTempReached = false;
startNextStep();
}
void loop() override {
if (currentStepIndex >= 3) {
// Всі кроки виконано
setPeripheralValue(heaterId, 0.0);
logMessage("Затирання повністю завершено!");
stopScript();
return;
}
float currentTemp = getPeripheralValue(tempSensorId);
MashStep currentStep = steps[currentStepIndex];
if (!isTempReached) {
// Нагрів до цільової температури кроку
if (currentTemp < currentStep.temperature) {
setPeripheralValue(heaterId, 100.0); // Вмикаємо нагрів на 100%
} else {
// Температури досягнуто, починаємо відлік часу паузи
isTempReached = true;
stepStartTime = millis();
setPeripheralValue(buzzerId, 1.0); // Короткий звуковий сигнал
delay(500);
setPeripheralValue(buzzerId, 0.0);
logMessage("Температури досягнуто. Старт таймера для: " + currentStep.name);
}
} else {
// Підтримання температури під час паузи (простий гістерезис або ПІД)
if (currentTemp < currentStep.temperature - 0.2) {
setPeripheralValue(heaterId, 30.0); // Підігрів на зниженій потужності
} else if (currentTemp > currentStep.temperature + 0.2) {
setPeripheralValue(heaterId, 0.0);
}
// Перевірка часу витримки
if (millis() - stepStartTime >= currentStep.duration) {
logMessage("Крок '" + currentStep.name + "' завершено.");
currentStepIndex++;
isTempReached = false;
startNextStep();
}
}
}
void startNextStep() {
if (currentStepIndex < 3) {
logMessage("Перехід до кроку: " + steps[currentStepIndex].name + " (" + String(steps[currentStepIndex].temperature) + "°C)");
}
}
};
Порада
Під час затирання обов'язково використовуйте заторну мішалку (насос для рециркуляції сусла). Без постійного перемішування температура на дні котла біля ТЕНу буде значно вищою, ніж зверху затору, що призведе до пригорання солоду та неправильних показів давача температури.