#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <WiFi.h>
#include <PubSubClient.h>
// ---- กำหนดขาเซ็นเซอร์ ---- //
#define ONE_WIRE_BUS 4 // DS18B20
#define DHTPIN 5 // DHT22
#define DHTTYPE DHT22
#define OD_SENSOR_PIN A0 // DO Sensor (วัดค่าออกซิเจนละลายน้ำ)
// ---- ขารีเลย์ควบคุมอุปกรณ์ ---- //
#define RELAY_COOLING_TOWER 16
#define RELAY_COMPRESSOR 17
#define RELAY_PUMP1 18
#define RELAY_AIR_PUMP 22
#define RELAY_WATER_PUMP 23
#define FAN_PWM 21 // PWM พัดลม
// ---- การตั้งค่า WiFi และ MQTT ---- //
const char* ssid = "VTCONCEPT_2.4G";
const char* password = "014485299";
const char* mqtt_server = "mqtts://mqtts.tuyacn.com";
WiFiClient espClient;
PubSubClient client(espClient);
// ---- กำหนดค่าเป้าหมาย ---- //
float setpoint = 26.0; // อุณหภูมิเป้าหมายของน้ำ
float temp_water, humidity, wbt, od_value;
bool airPumpActive = true;
unsigned long lastSwitchTime = 0;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
sensors.begin();
dht.begin();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println("Connected to Wi-Fi");
client.setServer(mqtt_server, 1883);
// ตั้งค่าขารีเลย์
pinMode(RELAY_COOLING_TOWER, OUTPUT);
pinMode(RELAY_COMPRESSOR, OUTPUT);
pinMode(RELAY_PUMP1, OUTPUT);
pinMode(RELAY_AIR_PUMP, OUTPUT);
pinMode(RELAY_WATER_PUMP, OUTPUT);
pinMode(FAN_PWM, OUTPUT);
// เปิดอุปกรณ์เริ่มต้น
digitalWrite(RELAY_AIR_PUMP, HIGH); // เปิดปั๊มลมเริ่มต้น
digitalWrite(RELAY_WATER_PUMP, LOW); // ปิดปั๊มน้ำเริ่มต้น
}
// ---- คำนวณ WBT (Wet-Bulb Temperature) ---- //
float calculateWBT(float temp, float rh) {
return temp
* atan(0.151977 * sqrt(rh
+ 8.313659)) + atan(temp
+ rh
) - atan(rh
- 1.676331) + 0.00391838 * pow(rh
, 1.5) * atan(0.023101 * rh
) - 4.686035; }
// ---- ควบคุม Cooling Tower + Compressor ---- //
void controlCoolingSystem() {
sensors.requestTemperatures();
temp_water = sensors.getTempCByIndex(0);
humidity = dht.readHumidity();
wbt = calculateWBT(temp_water, humidity);
Serial
.printf("Water Temp: %.2f°C, RH: %.2f%%, WBT: %.2f°C\n", temp_water
, humidity
, wbt
);
int fan_speed = 0;
if (temp_water > setpoint + 1 && wbt < setpoint) {
digitalWrite(RELAY_COOLING_TOWER, HIGH);
digitalWrite(RELAY_PUMP1, HIGH);
fan_speed = map(temp_water, setpoint, setpoint + 5, 100, 255);
} else {
digitalWrite(RELAY_COOLING_TOWER, LOW);
digitalWrite(RELAY_PUMP1, LOW);
fan_speed = 0;
}
analogWrite(FAN_PWM, fan_speed);
if (temp_water > setpoint + 2 && wbt >= setpoint) {
digitalWrite(RELAY_COMPRESSOR, HIGH);
} else {
digitalWrite(RELAY_COMPRESSOR, LOW);
}
client.publish("cooling/status", String(temp_water).c_str());
}
// ---- ควบคุมปั๊มลม MBBR ---- //
void controlAerationSystem() {
od_value = analogRead(OD_SENSOR_PIN) * (10.0 / 1023.0);
Serial.print("DO Value: ");
Serial.print(od_value);
Serial.println(" mg/L");
unsigned long currentMillis = millis();
if (airPumpActive) {
if (od_value > 5.0) {
digitalWrite(RELAY_AIR_PUMP, LOW);
digitalWrite(RELAY_WATER_PUMP, HIGH);
airPumpActive = false;
lastSwitchTime = currentMillis;
Serial.println("Switched: Air Pump OFF, Water Pump ON");
}
} else {
if (od_value < 3.0 || (currentMillis - lastSwitchTime >= 600000)) {
digitalWrite(RELAY_AIR_PUMP, HIGH);
digitalWrite(RELAY_WATER_PUMP, LOW);
airPumpActive = true;
Serial.println("Switched: Air Pump ON, Water Pump OFF");
}
}
client.publish("aeration/status", String(od_value).c_str());
}
// ---- อัปโหลดข้อมูลไป Tuya ---- //
void sendDataToTuya() {
String jsonData = "{";
jsonData += "\"water_temp\":" + String(temp_water) + ",";
jsonData += "\"humidity\":" + String(humidity) + ",";
jsonData += "\"wbt\":" + String(wbt) + ",";
jsonData += "\"do_value\":" + String(od_value);
jsonData += "}";
client.publish("tuya/data", jsonData.c_str());
}
void loop() {
if (!client.connected()) { client.connect("ESP32_Cooling"); }
client.loop();
controlCoolingSystem();
controlAerationSystem();
sendDataToTuya();
delay(5000);
}