API details.

class Pid[source]

Pid(Kp=0, Ki=0, Kd=0, set_point=0, sample_time=0.01)

Pid()
Pid params:
kp: 0, ki: 0, kd: 0, set_point: 0, sample_time: 0.01
class ACSimulator:
    def __init__(self, room_temp) -> None:
        self.room_temp = room_temp
        self._initial_room_temp = room_temp
    
    def update(self, cool_power, dt):
        if cool_power > 0:
            self.room_temp -= 1 * cool_power * dt
        else:
            self.room_temp += 1 * cool_power * dt
        self.room_temp += (self._initial_room_temp - self.room_temp) * 0.02 * dt
        return self.room_temp
room_temp = 32
ac = ACSimulator(room_temp)
pid = Pid(5, 0.01, 0.1, set_point=room_temp)
start_time = time.time()
last_time = start_time
setpoint, y, x = [], [], []
pid
Pid params:
kp: 5, ki: 0.01, kd: 0.1, set_point: 32, sample_time: 0.01
while time.time() - start_time < 10:
    current_time = time.time()
    dt = current_time - last_time

    power = pid(room_temp)
    room_temp = ac.update(power, dt)

    x += [current_time - start_time]
    y += [room_temp]
    setpoint += [pid.set_point]

    if current_time - start_time > 1:
        pid.set_point = 23
    last_time = current_time
import matplotlib.pyplot as plt
plt.plot(x, y, label='measured')
plt.plot(x, setpoint, label='target')
plt.xlabel('time')
plt.ylabel('temperature')
plt.legend()
plt.show()