Статті бази ▾ ← Усі бази знань
Автоматика oCBot
Концепція та філософія12 Ласкаво просимо до екосистеми oCBotЗвідки взявся oCBotІдеологія oCBotСфери призначення та режими роботиПериферійні пристроїСвобода периферіїБазові скрипти автоматизаціїВіртуальні панелі оператораСкладні сценарії та логіка автоматизаціїМультиконтролерністьЗагальний огляд автоматики oCBotАрхітектура та опис
Підтримувані контролери22 Контролер Kincony KC868-A6Підключення живлення й USB на KC868-A6Підключення периферії до KC868-A6Реле й аналогові виходи KC868-A6Сухі контакти й аналогові входи KC868-A6Твердотілка, драйвер помпи й датчики: підключення до колодки DA/IOШини й роз'єми KC868-A6: RS485, I2C, 1-Wire і рештаЩо зайнято на ESP32 у KC868-A6: карта GPIOЯк зібрати щиток на KC868-A6Як прогнати сценарії без куба: тестовий стенд для KC868-A6Контролер Kincony KC868-A16Підключення живлення й USB на KC868-A16Підключення периферії до KC868-A16Проміжне реле й контактор АСКО-УКРЕМ на KC868-A16Силові виходи KC868-A16: MOSFET замість релеСухі контакти й аналогові входи KC868-A16Шини й мережа KC868-A16: Ethernet, RS485, I2C, 1-WireЩо зайнято на ESP32 у KC868-A16: карта GPIOЯк зібрати щиток на KC868-A16Як прогнати сценарії без куба: тестовий стенд для KC868-A16Контролер WT32-ETH01Універсальний ESP32 DevKit (Custom)
Каталог периферійних пристроїв11 Датчики температуриДатчики тискуДатчики рівня рідиниСхема підключення щупа рівня через платку оптопариДатчики потоку (витратоміри)Схема підключення витратоміра до KC868-A6 і A16Виконавчі механізми (Клапани, Насоси, ТЕНи)Датчики середовища (Вологість, Світло, Тиск)Датчики електричні та вагиОргани керування (Кнопки, Енкодери)Електродвигуни та вентилятори
Складання та Перший запуск (DIY)27 Збирання контролера oCBot своїми рукамиПервинне прошивання та запуск контролераШвидке підключення Wi-Fi через BluetoothПідключення ТЕНів та регуляторів потужностіВибір та підключення електромагнітних клапанівКілька плат PCA9685 на одній шиніПін OE — апаратне зняття всіх виходівПлата PCA9685 зблизька — що на ній є і навіщоПлата розширення PCA9685 — 16 каналів ШІМСервопривід на платі PCA9685 — режим 50 ГцТвердотілки на платі розширенняПідключення LCD та OLED дисплеїв по шині I2CДвигун і частотний перетворювач: силове підключенняПроводка датчиків DS18B20: чому зникають показанняПроводка датчиків DS18B20: як зібрати шину на A6 і A16Промисловий протокол RS485 (Modbus RTU)Термометри стартового комплекту: ланцюжок на M12 і ящик з нержавійкиЧастотник AE200 (Yingshida) по Modbus: клеми, параметри й регістр завдання частотиЧастотник CFM310 по Modbus: панель RS485, сервісне меню і три регістриЧастотник Ennera FCE по Modbus: налаштування і діагностикаЧастотник без Modbus (900E): пуск реле й оберти 0–10 ВШина RS485 на кілька пристроїв: шлейф, термінатори, адресиВаги на тензодатчиках (NAU7802)Роз'єми M12: кодування A, B, D, X і кількість контактівРоз'єми M12: трійники, вилки, гнізда і заглушкиРоз'єми M12: чим захистити від води — корпус, кабель, IPУсунення типових несправностей
Робота з веб-інтерфейсом18 Головна сторінка (Home)Технічна підтримка: віддалена допомогаДіаграма процесу (Flow)Сценарії автоматизаціїРедактор скриптівПульти оператораДизайнер пультів HMI DesignerПериферіяПлати та шиниЗагальні налаштуванняОбладнанняТочки монтажуНалаштування графіківОновлення прошивкиНалаштування Wi-FiЛогиПорталПро програму
Написання сценаріїв (C++ Скрипти)10 Огляд скриптівМій перший сценарій: Крок за крокомШІМ-відбір: Як налаштувати клапан правильноНалаштування ПІД-регулятора для стабілізаціїАвтоматизація температурних пауз при затиранні солодуСкрипт ББКРегулювання тискуРозрахунок ABV за температурою париСкрипт «Розрахунок ABV»ABV у сценаріях
Безпека, Хмара та Інтеграція6 Безпека щита автоматикиСистема безпеки oCBot: Захист від аварійПідключення контролера до кабінету the.in.uaЯк опублікувати звіт про перегонкуШеринг кастомних пультів оператора (HMI)Інтеграція з Home Assistant та MQTT
Сценарії5
ББК5 Сценарій ББК: що робить автоматика і де вона чекає на васББК: залізо й прив'язки — без чого сценарій не стартуєББК: параметри за етапами — що означає кожен і як обратиББК: перший запуск — спочатку на воді, потім брагаББК: аварії — що написано на картці, чому і що робити
#Скрипти#C++#АвтоматизаціяОновлено: 24 лип 2026

Автоматизація температурних пауз при затиранні солоду

Написано для прошивки 0.2.93 (коміт 9648be9) · порталу 0.0.176Можливо, застаріло: поточна прошивка 0.2.238, поточний портал 0.0.344

Затирання солоду для отримання пивного сусла або браги для віскі вимагає точного дотримання температурного профілю, витримування затору при певних температурах (паузах) протягом заданого часу для активації різних ферментів солоду.


Основні температурні паузи затирання#

Під час затирання пивовари найчастіше використовують такі паузи:

  1. Білкова пауза (45°C - 55°C, 15-20 хв):
    • Розщеплює великі білки, покращує живлення дріжджів та знижує в'язкість сусла (особливо важливо при використанні несолодженого жита/пшениці).
  2. Мальтозна (бета-амілазна) пауза (60°C - 65°C, 30-60 хв):
    • Активує бета-амілазу, яка утворює прості цукри (мальтозу), що легко зброджуються дріжджами. Робить пиво більш міцним та сухим.
  3. Оцукрювання (альфа-амілазна) пауза (67°C - 72°C, 30-45 хв):
    • Активує альфа-амілазу, яка утворює незброджувані цукри (декстрини), що надають пиву повнотілості та солодового смаку.
  4. Mash-out (78°C, 10-15 хв):
    • Деактивує всі ферменти та знижує в'язкість сусла для полегшення процесу фільтрації дробини.

Профіль затирання: ступінчастий графік температури в часі — білкова пауза 50 °C, мальтозна 63 °C, оцукрювання 70 °C і mash-out 78 °C


Реалізація профілю затирання в 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)");
        }
    }
};

Порада

Під час затирання обов'язково використовуйте заторну мішалку (насос для рециркуляції сусла). Без постійного перемішування температура на дні котла біля ТЕНу буде значно вищою, ніж зверху затору, що призведе до пригорання солоду та неправильних показів давача температури.