#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP32Servo.h>
#define ONE_WIRE_BUS 2 // DS18B20 數據線接在 Arduino 2 號腳
#define FAN_SPEED_PIN 4 // PWM 輸出控制電風扇的速度
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//Servo myFan;
void setup() {
Serial.begin(115200);
sensors.begin(); // 初始化溫度感測器
pinMode(FAN_SPEED_PIN, OUTPUT);
// myFan.attach(FAN_SPEED_PIN); // 連接電風扇控制的 PWM 輸出引腳
}
void loop() {
// 讀取手動輸入的溫度
float temperatureC;
if (Serial.available() > 0) {
String input = Serial.readString();
temperatureC = input.toFloat(); // 將輸入的字串轉換為浮點數溫度值
} else {
// 如果沒有手動輸入,則正常從溫度感測器讀取溫度
sensors.requestTemperatures(); // 請求溫度數據
temperatureC = sensors.getTempCByIndex(0); // 讀取攝氏溫度值
// 如果溫度為空,表示讀取失敗,則不做任何事情
if (temperatureC == -127.00) {
Serial.println("Failed to read from DS18B20 sensor!");
return;
}
}
// 根據溫度計算風扇速度
int fanSpeed = map(temperatureC, 20, 40, 100, 255); // 在溫度 20~40 度範圍內控制轉速 100~255
// 將風扇速度限制在合理範圍內
fanSpeed = constrain(fanSpeed, 100, 255);
// 顯示溫度和風扇速度到串列埠
Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.print(" °C, Fan Speed: ");
Serial.println(fanSpeed);
// 控制風扇速度
analogWrite(FAN_SPEED_PIN, fanSpeed);
delay(5000); // 延遲 5 秒鐘,以便溫度感測器取樣
}