# Протокол 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 мс