冰楓論壇

標題: ESP32-D2WD [打印本頁]

作者: 洪嵐峰    時間: 2023-4-28 06:47
標題: ESP32-D2WD
ESP32-D2WD  PID 控制器
需要以下零件:

ESP32-D2WD 控制晶片
電源供應器(通常是 USB 電纜)
一個温度感測器(如 DS18B20)
一個加熱器(如電熱線)
一個繼電器模塊(用於控制加熱器)
一個 LCD 模塊(用於顯示溫度和設定參數)
數據線和連接器
以下是 ESP32-D2WD 開發板的連接腳位:

GPIO 26 - 用於控制繼電器
GPIO 27 - 用於讀取温度傳感器
GPIO 14、GPIO 32、GPIO 33 - 用於 LCD 模塊

以下是一個完整的 ESP32-D2WD 的 PID 控制器範例程式碼,包括 PID 類的實現和注釋。

這個程式碼假定您已經安裝了 MicroPython 的庫,例如 onewire、ds18x20、machine、ssd1306 和 pid。

python

import machine
import onewire
import ds18x20
import time
from machine import Pin
from machine import PWM
from machine import I2C
from ssd1306 import SSD1306_I2C

class PID:
    def __init__(self, kp, ki, kd, set_point, min_output, max_output):
        self.kp = kp
        self.ki = ki
        self.kd = kd
        self.set_point = set_point
        self.min_output = min_output
        self.max_output = max_output
        self.last_error = 0
        self.integral = 0

    def compute(self, input_value):
        # 計算偏差
        error = self.set_point - input_value

        # 計算 P 項
        p_term = self.kp * error

        # 計算 I 項
        self.integral += error
        i_term = self.ki * self.integral

        # 計算 D 項
        d_term = self.kd * (error - self.last_error)
        self.last_error = error

        # 計算控制量
        output = p_term + i_term + d_term

        # 限制控制量在最小值和最大值之間
        if output < self.min_output:
            output = self.min_output
        elif output > self.max_output:
            output = self.max_output

        return output

# 定義 PID 參數
kp = 2
ki = 0.5
kd = 1

# 定義溫度範圍和目標溫度
set_temp = 50
min_temp = 0
max_temp = 100

# 初始化温度傳感器和 LCD 模塊
dat = machine.Pin(27)
ds = ds18x20.DS18X20(onewire.OneWire(dat))
i2c = I2C(0, scl=Pin(14), sda=Pin(32), freq=200000)
oled = SSD1306_I2C(128, 64, i2c)

# 初始化繼電器和 PWM
relay = Pin(26, Pin.OUT)
pwm = PWM(relay, freq=1000, duty=0)

# 初始化 PID 控制器
pid = PID(kp, ki, kd, set_temp, 0, 1023)

# 主循環
while True:
    # 讀取温度
    ds.convert_temp()
    time.sleep_ms(750)
    temp = ds.read_temp_async()

    # 計算 PID 控制量
    control = pid.compute(temp)

    # 控制加熱器
    if control > 0:
        pwm.duty(int(control))
    else:
        pwm.duty(0)

    # 顯示溫度和 PID 控制量
    oled.fill(0)
    oled.text("Temp: {} C".format(temp),

python

oled.text("Control: {}".format(control), 0, 20)
oled.show()

# 檢查溫度是否超出範圍
if temp < min_temp:
    # 溫度過低,關閉加熱器
    pwm.duty(0)
elif temp > max_temp:
    # 溫度過高,開啟加熱器
    pwm.duty(1023)

# 等待一段時間
time.sleep(1)




歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓