This commit is contained in:
2026-07-05 18:21:29 +03:00
commit 6c237faadb
7 changed files with 805 additions and 0 deletions

138
docs/protocol.md Normal file
View File

@@ -0,0 +1,138 @@
# Протокол 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 мс