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

138 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Протокол MideaUART
## Основные параметры UART
- **Бодовая скорость**: 9600
- **Формат кадра**: 8N1 (8 бит данных, отсутствие стоп-бита, четность отключена)
- **Таймаут**: 50 мс
## Структура команды
```c
struct Control {
Mode mode; // Режим работы
float targetTemp; // Целевая температура (°C)
bool modeChange; // Флаг смены режима
bool tempChange; // Флаг смены целевой температуры
uint8_t pwmArg; // ШИМ-аргумент (2 байта)
bool powerState; // Состояние питания
int16_t presets; // Индекс предварительно установленных действий
};
```
## Доступные режимы работы
```c
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. Изменение режима работы
```c
Control control;
control.mode = Mode::MODE_COOL; // Установка режима охлаждения
control.modeChange = true; // Нужно отправить команду
ac.control(control); // Таймаут 50 мс
```
### 4.2. Изменение температуры
```c
control.targetTemp = 25.0f; // 25°C
control.tempChange = true; // Нужно отправить команду
ac.control(control);
```
### 4.3. Изменение параметров подогрева (PWM)
```c
control.pwmArg = 7000; // ШИМ-аргумент (мощность)
ac.control(control);
```
### 4.4. Изменение глушения (Swing Mode)
```c
control.swingMode = SwingMode::VERTICAL; // Вертикальное
ac.control(control);
```
### 4.5. Изменение состояния питания
```c
ac.setPowerState(false); // Выключить питание
```
### 4.6. Изменение режима и температуры одновременно
```c
control.mode = MODE_COOL; // Режим охлаждения
control.targetTemp = 26.0f; // Изменение целевой температуры
control.modeChange = true;
control.tempChange = true;
ac.control(control);
```
## Пример полного цикла управления
```c
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. **Получение состояния**:
```c
float indoorTemp = ac.getIndoorTemp(); // Текущая температура
Mode currentMode = ac.getMode(); // Текущий режим
float targetTemperature = ac.getTargetTemp(); // Целевая температура
```
2. **Сброс всех настроек**:
```c
ac.reset();
```
3. **Создание предварительных действий**:
```c
control.presets = 5; // Установить алгоритм 5
ac.control(control);
```
## Особенности реализации
- **Тайминг**: Все команды должны быть отправлены через 50 мс после инициализации
- **Мультиплексирование**: Одну команду можно отправить каждые 50 мс
- **Порядок команд**:
1. Выбор режима
2. Изменение температуры
3. Установка параметров подогрева
4. Включение/выключение питания
## Примечания
- Все значения температуры в целых десятых градусов (15.7 = 157)
- Для создания алгоритмов используйте `presets`-ше
- Не забывайте вызывать `ac.loop()` каждые ~5 мс