File size: 1,810 Bytes
96a5049
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#pragma once
#include "Arduino.h"
#include "config.h"
#include "engine_control.h"
#include "pid_controller.h"

class IdleController {
private:
    float targetRPM;
    float currentPosition;
    unsigned long lastUpdateTime;
    bool isAirConditionerOn;
    float engineTemp;
    
    // ПИД-регулятор
    PIDController pid;
    
    // Указатель на объект управления двигателем для получения температуры
    EngineControl* engineControl;
    
    // Вспомогательные методы
    void updateValvePosition(float position);
    
public:
    IdleController();
    void begin();
    void update(float currentRPM);
    
    // Методы для работы с целевыми оборотами
    void setTargetRPM(float rpm) { 
        if (rpm >= 700 && rpm <= 2000) {
            targetRPM = rpm;
            pid.SetSetpoint(rpm);
        }
    }
    float getTargetRPM() const { return targetRPM; }
    
    // Методы для настройки ПИД
    void setPIDParameters(float kp, float ki, float kd) {
        pid.SetTunings(kp, ki, kd);
    }
    
    // Методы для управления положением
    void setPosition(float position) { updateValvePosition(position); }
    float getCurrentPosition() const { return currentPosition; }
    
    // Методы для работы с температурой и кондиционером
    void setEngineTemperature(float temp) { engineTemp = temp; }
    void setAirConditioner(bool isOn) { isAirConditionerOn = isOn; }
    
    // Метод для установки указателя на объект управления двигателем
    void setEngineControl(EngineControl* control) { engineControl = control; }
};