Статті бази ▾ ← Усі бази знань
Автоматика oCBot
Концепція та філософія11 Ласкаво просимо до екосистеми oCBotІдеологія oCBotСфери призначення та режими роботиПериферійні пристроїСвобода периферіїБазові скрипти автоматизаціїВіртуальні панелі оператораСкладні сценарії та логіка автоматизаціїМультиконтролерністьЗагальний огляд автоматики oCBotАрхітектура та опис
Підтримувані контролери4 Контролер Kincony KC868-A6Контролер Kincony KC868-A16Контролер WT32-ETH01Універсальний ESP32 DevKit (Custom)
Каталог периферійних пристроїв9 Датчики температуриДатчики тискуДатчики рівня рідиниДатчики потоку (витратоміри)Виконавчі механізми (Клапани, Насоси, ТЕНи)Датчики середовища (Вологість, Світло, Тиск)Датчики електричні та вагиОргани керування (Кнопки, Енкодери)Електродвигуни та вентилятори
Складання та Перший запуск (DIY)9 Збирання контролера oCBot своїми рукамиПервинне прошивання та запуск контролераШвидке підключення Wi-Fi через BluetoothПідключення ТЕНів та регуляторів потужностіВибір та підключення електромагнітних клапанівПідключення LCD та OLED дисплеїв по шині I2CПромисловий протокол RS485 (Modbus RTU)Калібрування ваг на тензодатчиках (HX711)Усунення типових несправностей
Робота з веб-інтерфейсом17 Головна сторінка (Home)Діаграма процесу (Flow)Сценарії автоматизаціїРедактор скриптівПульти оператораДизайнер пультів HMI DesignerПериферіяПлати та шиниЗагальні налаштуванняОбладнанняТочки монтажуНалаштування графіківОновлення прошивкиНалаштування Wi-FiЛогиПорталПро програму
Написання сценаріїв (C++ Скрипти)7 Огляд скриптівМій перший сценарій: Крок за крокомШІМ-відбір: Як налаштувати клапан правильноНалаштування ПІД-регулятора для стабілізаціїАвтоматизація температурних пауз при затиранні солодуСкрипт ББКРегулювання тиску
Безпека, Хмара та Інтеграція5 Система безпеки oCBot: Захист від аварійСтворення хмарного кабінету UA DistilleryЯк опублікувати звіт про перегонкуШеринг кастомних пультів оператора (HMI)Інтеграція з Home Assistant та MQTT
База знаньАвтоматика oCBotНаписання сценаріїв (C++ Скрипти)

ШІМ-відбір: Як налаштувати клапан правильно

Широтно-імпульсна модуляція (ШІМ, англ. PWM) є основним методом регулювання швидкості відбору спирту або дистиляту за допомогою стандартних електромагнітних клапанів. Оскільки клапан може перебувати лише у двох станах, повністю відкритий або повністю закритий, швидкість відбору (літрів на годину) регулюється часовим співвідношенням цих станів.


Принцип роботи ШІМ-відбору#

ШІМ-відбір базується на понятті періоду ШІМ (зазвичай становить від 5 до 20 секунд).

Наприклад, якщо встановлено період ШІМ 10 секунд, то відсоткове значення відбору (швидкість) визначає час відкриття клапана всередині цього вікна:


Нотатка

Занадто короткий період ШІМ (наприклад, менше 3 секунд) призводить до швидкого механічного зносу клапана та перегріву його котушки. Занадто довгий період (понад 20 секунд) може спричинити температурні коливання в колоні через циклічне осушення та переповнення насадкової частини дефлегматора. Оптимальним вважається період 10 секунд.


Реалізація ШІМ-відбору в C++ скрипті oCBot#

В автоматиці oCBot ви можете реалізувати логіку ШІМ як програмно через таймери, так і апаратно, якщо клапан налаштований у системі як пристрій із підтримкою ШІМ на рівні драйвера.

Ось приклад коду для програмної реалізації циклу ШІМ-відбору «голів» (швидкість 8%):

#include "OcbScript.h"

class PwmSelectionScenario : public OcbScript {
private:
    int valveId;             // ID клапана відбору
    unsigned long lastPeriodStart;
    const unsigned long periodMs = 10000; // Період ШІМ = 10 секунд (10000 мс)
    float selectionPercent;  // Поточний відсоток відбору (0.0 - 100.0)

public:
    PwmSelectionScenario() {
        valveId = 3;            // ID клапана з меню Периферії
        selectionPercent = 8.0; // Встановлюємо 8% для відбору голів
    }

    void init() override {
        lastPeriodStart = millis();
        setPeripheralValue(valveId, 0.0); // Зачиняємо клапан
        logMessage("Запуск ШІМ-відбору. Швидкість: " + String(selectionPercent) + "%");
    }

    void loop() override {
        unsigned long currentMillis = millis();
        unsigned long timeInPeriod = currentMillis - lastPeriodStart;

        // Якщо поточний період завершився, починаємо новий
        if (timeInPeriod >= periodMs) {
            lastPeriodStart = currentMillis;
            timeInPeriod = 0;
        }

        // Розраховуємо час, протягом якого клапан має бути відкритим
        unsigned long openDuration = (periodMs * selectionPercent) / 100.0;

        if (timeInPeriod < openDuration) {
            // Клапан має бути відкритим
            setPeripheralValue(valveId, 1.0);
        } else {
            // Клапан має бути зачиненим
            setPeripheralValue(valveId, 0.0);
        }
    }
};

Практичні поради щодо калібрування швидкості#

  1. Визначення максимальної пропускної здатності:
    • Повністю відкрийте клапан (100% ШІМ) на 60 секунд. Виміряйте об'єм зібраної рідини (наприклад, отримали 50 мл).
    • Помножте на 60, щоб отримати максимальну швидкість в л/год: 0.050 л * 60 = 3 л/год.
  2. Розрахунок відсотка для відбору «голів»:
    • Якщо вам потрібна швидкість відбору голів 150 мл/год, то необхідний відсоток складе: $$\text{Відсоток} = \left( \frac{150 \text{ мл/год}}{3000 \text{ мл/год}} \right) \times 100% = 5%$$
    • Задайте selectionPercent = 5.0 у вашому сценарії.