冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 767|回覆: 0
打印 上一主題 下一主題

[討論] ESP32-D2WD

[複製鏈接]

2609

主題

0

好友

999

積分

高級會員

Rank: 4

UID
373967
帖子
8850
主題
2609
精華
0
積分
999
楓幣
1
威望
976
存款
34705
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
454 小時
註冊時間
2023-1-12
最後登入
2024-11-18

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-4-28 06:47:36 |只看該作者 |倒序瀏覽
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)
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1彩票
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-11-18 17:32

回頂部