# 環境試驗箱 WiFi 溫控器應用方案
## 一、系統架構總覽
```
┌─────────────────────────────────────────────────────┐
│ 云端/服務器平臺 │
│ (數據存儲 / 遠程監控 / 報警推送) │
└──────────────────────┬──────────────────────────────┘
│ WiFi/MQTT/HTTP
┌──────────────────────▼──────────────────────────────┐
│ WiFi 溫控器 (核心) │
│ ┌─────────┐ ┌──────────┐ ┌───────────────────┐ │
│ │ WiFi模塊 │ │ MCU主控 │ │ 人機交互(屏/APP) │ │
│ └─────────┘ └─────┬────┘ └───────────────────┘ │
└──────────────────────┬──────────────────────────────┘
│ PWM / 模擬量 / 通信
┌──────────────────────▼──────────────────────────────┐
│ 執行機構層 │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ 加熱系統 │ │ 制冷系統 │ │ 風機/循環系統 │ │
│ │(電加熱管)│ │(壓縮機組)│ │ (變頻/定頻風扇) │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
└──────────────────────┬──────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────┐
│ 傳感采集層 │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │溫度傳感器 │ │濕度傳感器 │ │ 過溫/漏電保護 │ │
│ │(PT100/NTC)│ │(濕敏電容) │ │ (安全聯鎖) │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────┘
```
---
## 二、硬件方案選型
### 2.1 主控芯片方案對比
| 方案 | 芯片 | 優勢 | 適用場景 |
|------|------|------|----------|
| **方案A** | ESP32-S3 | WiFi+BLE雙模、自帶觸屏支持、算力強 | 中低端試驗箱、快速開發 |
| **方案B** | STM32F4 + ESP8266 | 工業級穩定性、獨立通信 | 中高端試驗箱 |
| **方案C** | Linux網關(瑞芯微RK3566) + WiFi | 支持邊緣計算、大屏 | 高端智能試驗箱 |
### 2.2 溫度傳感器選型
| 傳感器類型 | 測溫范圍 | 精度 | 特點 |
|-----------|---------|------|------|
| **PT100鉑電阻** | -200~+850℃ | ±0.15℃ | 工業標配,線性好 |
| **NTC熱敏電阻** | -40~+300℃ | ±0.5℃ | 成本低,非線性需校準 |
| **K型熱電偶** | -200~+1200℃ | ±1.5℃ | 高溫適用,需冷端補償 |
| **DS18B20** | -55~+125℃ | ±0.5℃ | 數字輸出,單總線 |
### 2.3 WiFi通信模塊
```
推薦方案:
├── 通信協議:MQTT / HTTP / WebSocket
├── 路由方式:直連AP模式 / STA連路由器
├── 加密方式:WPA2-PSK / TLS
└── 推薦模塊:
├── ESP32-WROOM-32 (內置)
├── ESP8266 (ESP-12F/12S)
└── RTL8720 (低功耗)
```
---
## 三、軟件與控制方案
### 3.1 溫控算法架構
```
┌─────────────────────────────────────────┐
│ 溫控策略層 │
│ │
│ ┌─────────┐ ┌─────────────────┐ │
│ │ PID控制 │?──?│ 模糊自適應PID │ │
│ │ (基礎) │ │ (進階) │ │
│ └────┬────┘ └───────┬─────────┘ │
│ │ │ │
│ ┌────▼────┐ ┌──────▼──────────┐ │
│ │ 前饋補償 │ │ 分段控制策略 │ │
│ │(加熱/制冷│ │(升溫/降溫/恒溫 │ │
│ │ 切換) │ │ 不同參數) │ │
│ └─────────┘ └─────────────────┘ │
│ │
│ ┌─────────────────────────────────┐ │
│ │ 安全保護邏輯 │ │
│ │ · 超溫保護(獨立硬件+軟件雙保險) │ │
│ │ · 傳感器斷線檢測 │ │
│ │ · 制冷/加熱互鎖 │ │
│ │ · 壓縮機延時保護 │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
```
### 3.2 核心PID + 模糊自適應控制代碼框架(ESP32示例)
```c
// ========== 溫控器核心控制邏輯 ==========
#include
#include
#include
// ---- 硬件定義 ----
#define SENSOR_PIN 34 // PT100 ADC采樣
#define HEATER_PIN 25 // PWM加熱輸出
#define COMPRESSOR_PIN 26 // 制冷繼電器
#define FAN_PIN 27 // 風機PWM
// ---- 溫控參數 ----
typedef struct {
float target_temp; // 目標溫度
float current_temp; // 當前溫度
float Kp, Ki, Kd; // PID參數
float output_limit; // 輸出限幅 0~100%
// 分段參數
float heating_Kp, heating_Ki, heating_Kd;
float cooling_Kp, cooling_Ki, cooling_Kd;
// 安全閾值
float over_temp_limit; // 超溫保護上限
float under_temp_limit; // 低溫保護下限
} TempControlParam;
TempControlParam tc = {
.target_temp = 85.0,
.Kp = 15.0, .Ki = 0.8, .Kd = 30.0,
.heating_Kp = 18.0, .heating_Ki = 1.0, .heating_Kd = 35.0,
.cooling_Kp = 20.0, .cooling_Ki = 0.5, .cooling_Kd = 40.0,
.over_temp_limit = 100.0,
.under_temp_limit = -20.0
};
// ---- PID控制器 ----
typedef struct {
float integral;
float prev_error;
float output;
unsigned long last_time;
} PID_Controller;
PID_Controller pid = {0};
float pid_compute(PID_Controller *pid, float setpoint, float measured,
float Kp, float Ki, float Kd, float dt) {
float error = setpoint - measured;
// 積分限幅防飽和
pid->integral += error * dt;
pid->integral = constrain(pid->integral, -50.0, 50.0);
// 微分(帶濾波)
float derivative = (error - pid->prev_error) / dt;
derivative = derivative * 0.7 + pid->derivative * 0.3; // 一階濾波
pid->output = Kp * error + Ki * pid->integral + Kd * derivative;
pid->prev_error = error;
return constrain(pid->output, -100.0, 100.0);
}
// ---- 模糊自適應PID ----
float fuzzy_adjust_Kp(float error) {
// 根據誤差大小自適應調整Kp
if (fabs(error) > 20.0) return tc.Kp * 1.5; // 大誤差增大響應
else if (fabs(error) > 5.0) return tc.Kp * 1.2;
else return tc.Kp * 0.8; // 小誤差減小振蕩
}
// ---- 溫度讀取 (PT100 via ADS1115) ----
float read_temperature() {
// 實際項目中通過I2C讀取ADS1115轉換值
// PT100 R-T轉換: R = R0*(1 + A*T + B*T2)
int16_t adc_val = ads1115_read(SENSOR_PIN);
float resistance = (adc_val * 4.096 / 32768.0) / 0.001; // 1mA恒流源
// Callendar-Van Dusen方程計算溫度
float temp = (resistance / 100.0 - 1.0) / 0.00385; // 簡化線性近似
return temp;
}
// ---- 主控制循環 ----
void control_loop() {
static unsigned long last_tick = 0;
unsigned long now = millis();
float dt = (now - last_tick) / 1000.0;
if (dt < 0.1) return;
last_tick = now;
tc.current_temp = read_temperature();
// === 安全保護 ===
if (tc.current_temp > tc.over_temp_limit || tc.current_temp < tc.under_temp_limit) {
digitalWrite(HEATER_PIN, LOW);
digitalWrite(COMPRESSOR_PIN, LOW);
// 觸發報警
send_alarm("TEMP_OVER_LIMIT");
return;
}
// === 傳感器斷線檢測 ===
if (tc.current_temp < -100 || tc.current_temp > 200) {
send_alarm("SENSOR_DISCONNECT");
return;
}
// === 判斷控制模式 ===
float error = tc.target_temp - tc.current_temp;
if (error > 0) {
// 需要加熱
float Kp_adj = fuzzy_adjust_Kp(error);
float output = pid_compute(&pid, tc.target_temp, tc.current_temp,
Kp_adj, tc.Ki, tc.Kd, dt);
analogWrite(HEATER_PIN, (int)output * 2.55); // 0-255
digitalWrite(COMPRESSOR_PIN, LOW);
}
else if (error < -2) { // 死區-2℃
// 需要制冷
float output = pid_compute(&pid, tc.target_temp, tc.current_temp,
tc.cooling_Kp, tc.cooling_Ki, tc.cooling_Kd, dt);
digitalWrite(COMPRESSOR_PIN, output > 0 ? HIGH : LOW);
analogWrite(HEATER_PIN, 0);
}
else {
// 恒溫區間,PWM微調
analogWrite(HEATER_PIN, 0);
digitalWrite(COMPRESSOR_PIN, LOW);
}
// 風機始終運行
analogWrite(FAN_PIN, 200); // 固定風量
}
// ---- WiFi & MQTT通信 ----
WiFiClient espClient;
PubSubClient mqtt(espClient);
void mqtt_publish_status() {
StaticJsonDocument<256> doc;
doc["device_id"] = "ENV_CHAMBER_001";
doc["temp"] = tc.current_temp;
doc["target"] = tc.target_temp;
doc["heater"] = digitalRead(HEATER_PIN);
doc["cooler"] = digitalRead(COMPRESSOR_PIN);
doc["timestamp"] = millis();
char buffer[256];
serializeJson(doc, buffer);
mqtt.publish("env_chamber/001/status", buffer);
}
void mqtt_callback(char* topic, byte* payload, unsigned int len) {
StaticJsonDocument<256> doc;
deserializeJson(doc, payload, len);
if (strstr(topic, "set_temp")) {
tc.target_temp = doc["temp"];
pid.integral = 0; // 重置積分
}
else if (strstr(topic, "set_profile")) {
// 接收多段溫度曲線
JsonArray profile = doc["profile"];
// 解析并存儲到Flash
}
}
void setup() {
pinMode(HEATER_PIN, OUTPUT);
pinMode(COMPRESSOR_PIN, OUTPUT);
pinMode(FAN_PIN, OUTPUT);
WiFi.begin("SSID", "PASSWORD");
mqtt.setServer("broker.example.com", 1883);
mqtt.setCallback(mqtt_callback);
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
mqtt.loop();
}
control_loop();
mqtt_publish_status();
delay(500); // 2Hz采樣控制周期
}
```
### 3.3 溫度曲線編程(多段程序控制)
```c
// 溫濕度試驗標準曲線存儲 (Flash/EEPROM)
typedef struct {
float temp; // 目標溫度
float ramp_rate; // 升降溫速率 ℃/min
uint32_t hold_time; // 恒溫保持時間 (秒)
} StepParam;
// 示例: 高低溫循環試驗
// 步驟1: 常溫 → -40℃ → 保持2h → 升溫至85℃ → 保持2h → 循環
StepParam test_profile[] = {
{.temp = -40.0, .ramp_rate = 3.0, .hold_time = 7200},
{.temp = 85.0, .ramp_rate = 3.0, .hold_time = 7200},
{.temp = -40.0, .ramp_rate = 3.0, .hold_time = 7200},
// ... 循環
};
void run_temperature_profile() {
static int step = 0;
static uint32_t step_start = 0;
uint32_t now = millis() / 1000;
if (now - step_start > test_profile[step].hold_time) {
step = (step + 1) % (sizeof(test_profile)/sizeof(test_profile[0]));
step_start = now;
tc.target_temp = test_profile[step].temp;
}
// 速率控制: 限制每秒溫度變化量
float max_delta = test_profile[step].ramp_rate / 60.0; // ℃/s
float error = tc.target_temp - tc.current_temp;
if (fabs(error) > max_delta) {
tc.target_temp = tc.current_temp + (error > 0 ? max_delta : -max_delta);
}
}
```
---
## 四、WiFi遠程控制APP/Web界面
### 4.1 功能模塊
```
┌──────────────────────────────────────────┐
│ 手機APP / Web界面 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌────────┐ │
│ │ 實時監控 │ │ 參數設置 │ │ 歷史曲線│ │
│ │ 溫度/濕度│ │ 設定溫度 │ │ 導出PDF │ │
│ │ 運行狀態 │ │ 升降速率 │ │ │ │
│ │ 設備狀態 │ │ 恒溫時間 │ │ │ │
│ └──────────┘ └──────────┘ └────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ ┌────────┐ │
│ │ 程序編輯 │ │ 報警推送 │ │ 多設備 │ │
│ │ 多段曲線 │ │ 微信/短信│ │ 批量管理│ │
│ │ 一鍵下發 │ │ 聲音提醒 │ │ │ │
│ └──────────┘ └──────────┘ └────────┘ │
└──────────────────────────────────────────┘
```
### 4.2 MQTT Topic 設計
```
# 訂閱(APP → 設備)
env_chamber/{device_id}/set_temp # 設置溫度
env_chamber/{device_id}/set_profile # 下發程序
env_chamber/{device_id}/start_test # 啟動試驗
env_chamber/{device_id}/stop_test # 停止試驗
env_chamber/{device_id}/set_params # PID參數調整
# 發布(設備 → APP)
env_chamber/{device_id}/status # 實時狀態
env_chamber/{device_id}/alarm # 報警信息
env_chamber/{device_id}/history/data # 歷史數據
```
---
## 五、高低溫箱分類與方案匹配
### 5.1 按溫度范圍分類
| 類型 | 溫度范圍 | 制冷方式 | 典型應用 | 控制難點 |
|------|---------|---------|---------|---------|
| **低溫箱** | -20℃ ~ +150℃ | 單級壓縮/復疊 | 電子元器件 | 低溫段升溫慢 |
| **高溫箱** | +50℃ ~ +300℃ | 電加熱 | 老化試驗 | 高溫段降溫慢 |
| **高低溫箱** | -70℃ ~ +180℃ | 復疊壓縮+電加熱 | 軍工/汽車 | 寬范圍切換 |
| **快速溫變箱** | -70℃ ~ +180℃ | 液氮輔助/強力壓縮 | 應力篩選 | 升降溫速率5~15℃/min |
### 5.2 不同場景方案對比
| 場景 | 推薦方案 | 溫度精度 | 升降溫速率 | 通信方式 |
|------|---------|---------|-----------|---------|
| 小型恒溫箱 | ESP32 + PT100 | ±0.5℃ | 1~3℃/min | WiFi直連APP |
| 標準高低溫箱 | STM32+ESP8266 + PT100 | ±0.3℃ | 3~5℃/min | WiFi+4G雙模 |
| 快速溫變箱 | 工控機+PLC + 熱電偶 | ±0.5℃ | 5~15℃/min | 以太網+WiFi |
| 大型步入式 | PLC+觸摸屏 + PT100陣列 | ±1.0℃ | 1~3℃/min | Modbus+WiFi網關 |
---
## 六、安全保護設計(關鍵!)
```
┌──────────────────────────────────────────────────────┐
│ 安全保護體系 │
│ │
│ 層級1: 軟件保護 │
│ ├── 超溫/欠溫軟件限值 │
│ ├── 傳感器斷線檢測 (開路/短路) │
│ ├── 壓縮機過載電流檢測 │
│ └── 通信超時看門狗 (斷網自動停止) │
│ │
│ 層級2: 硬件保護 │
│ ├── 獨立溫度繼電器 (雙金屬片/電子式) │
│ ├── 漏電保護器 (30mA) │
│ ├── 壓縮機高低壓保護開關 │
│ └── 加熱管過流保護 │
│ │
│ 層級3: 機械保護 │
│ ├── 門開關聯鎖 (開門斷電) │
│ ├── 泄壓閥 (防爆) │
│ └── 接地保護 │
└──────────────────────────────────────────────────────┘
```
---
## 七、完整產品方案清單(BOM參考)
| 序號 | 部件 | 型號/規格 | 數量 | 參考價格 |
|------|------|----------|------|---------|
| 1 | 主控MCU | ESP32-S3-WROOM-1 | 1 | ¥15 |
| 2 | 溫度傳感器 | PT100 + ADS1115模塊 | 2 | ¥30 |
| 3 | WiFi天線 | PCB板載天線/外置 | 1 | ¥5 |
| 4 | 繼電器模塊 | 4路5V光耦隔離 | 2 | ¥12 |
| 5 | 電源模塊 | 220V→12V/5V 隔離 | 1 | ¥25 |
| 6 | 顯示屏 | 2.4寸TFT ILI9341 | 1 | ¥18 |
| 7 | EEPROM | AT24C256 (程序存儲) | 1 | ¥3 |
| 8 | 散熱風扇 | 5V渦輪風扇 | 1 | ¥8 |
| 9 | 外殼/PCB | 定制 | 1 | ¥30 |
| **合計** | | | | **≈¥146** |
---
## 八、開發路線圖
```
Phase 1 (2周) → 硬件打樣 + 基礎溫度采集 + WiFi連接
Phase 2 (2周) → PID溫控調參 + 基本遠程控制
Phase 3 (2周) → 多段程序 + 安全保護 + APP開發
Phase 4 (1周) → 整機聯調 + 環境適應性測試
Phase 5 (1周) → 認證(CE/FCC/3C) + 量產準備
```
---
> **總結**:WiFi溫控器方案的核心是 **穩定的溫度采集 + 可靠的PID/模糊控制 + 安全雙保險 + 穩定的WiFi通信**。根據試驗箱溫度范圍和精度要求選擇合適的主控平臺和傳感器,高低溫箱推薦使用 **PT100 + 獨立安全繼電器** 方案,確保在-70℃~+180℃寬范圍內穩定運行。