Files
ballu-remote/docs/protocol.md
2026-07-05 18:21:29 +03:00

4.7 KiB
Raw Permalink Blame History

Протокол MideaUART

Основные параметры UART

  • Бодовая скорость: 9600
  • Формат кадра: 8N1 (8 бит данных, отсутствие стоп-бита, четность отключена)
  • Таймаут: 50 мс

Структура команды

struct Control {
    Mode mode;          // Режим работы
    float targetTemp;  // Целевая температура (°C)
    bool modeChange;    // Флаг смены режима
    bool tempChange;    // Флаг смены целевой температуры
    uint8_t pwmArg;     // ШИМ-аргумент (2 байта)
    bool powerState;    // Состояние питания
    int16_t presets;    // Индекс предварительно установленных действий
};

Доступные режимы работы

enum class Mode {
    MODE_OFF,          // Выключено
    MODE_COOL,          // Охлаждение
    MODE_HEAT,          // Отопление
    MODE_AUTO,         // Авторегулировка
    MODE_DRY,           // Сушка
    MODE_FAN,           // Вентилятор
    MODE_SLEEP,         // Сон
    MODE_TURBO,         // Турбо
    MODE_PRESET_1-16    // Предварительно заданные режимы
};

Команды управления

4.1. Изменение режима работы

Control control;
control.mode = Mode::MODE_COOL;  // Установка режима охлаждения
control.modeChange = true;       // Нужно отправить команду
ac.control(control);             // Таймаут 50 мс

4.2. Изменение температуры

control.targetTemp = 25.0f;      // 25°C
control.tempChange = true;       // Нужно отправить команду
ac.control(control);

4.3. Изменение параметров подогрева (PWM)

control.pwmArg = 7000;           // ШИМ-аргумент (мощность)
ac.control(control);

4.4. Изменение глушения (Swing Mode)

control.swingMode = SwingMode::VERTICAL;  // Вертикальное
ac.control(control);

4.5. Изменение состояния питания

ac.setPowerState(false);         // Выключить питание

4.6. Изменение режима и температуры одновременно

control.mode = MODE_COOL;        // Режим охлаждения
control.targetTemp = 26.0f;       // Изменение целевой температуры
control.modeChange = true;
control.tempChange = true;
ac.control(control);

Пример полного цикла управления

void setup() {
    Serial.begin(9600);
    ac.setStream(&Serial);
    ac.setup();
}

void loop() {
    // Пример: включить охлаждение на 25°C через 3 секунды
    delay(3000);
    
    Control control;
    control.mode = MODE_COOL;
    control.targetTemp = 25.0f;
    control.modeChange = true;
    control.tempChange = true;
    
    ac.control(control);  // Таймаут 50 мс
    
    // Подождать 5 минут коммутации
    delay(300000);
    
    // Выключить
    ac.setPowerState(false);
}

Дополнительные функции

  1. Получение состояния:

    float indoorTemp = ac.getIndoorTemp();       // Текущая температура
    Mode currentMode = ac.getMode();             // Текущий режим
    float targetTemperature = ac.getTargetTemp(); // Целевая температура
    
  2. Сброс всех настроек:

    ac.reset();
    
  3. Создание предварительных действий:

    control.presets = 5; // Установить алгоритм 5
    ac.control(control);
    

Особенности реализации

  • Тайминг: Все команды должны быть отправлены через 50 мс после инициализации
  • Мультиплексирование: Одну команду можно отправить каждые 50 мс
  • Порядок команд:
    1. Выбор режима
    2. Изменение температуры
    3. Установка параметров подогрева
    4. Включение/выключение питания

Примечания

  • Все значения температуры в целых десятых градусов (15.7 = 157)
  • Для создания алгоритмов используйте presets-ше
  • Не забывайте вызывать ac.loop() каждые ~5 мс