fork download
  1. #include <OneWire.h>
  2. #include <DallasTemperature.h>
  3. #include <Adafruit_Sensor.h>
  4. #include <DHT.h>
  5. #include <WiFi.h>
  6. #include <PubSubClient.h>
  7.  
  8. // ---- กำหนดขาเซ็นเซอร์ ---- //
  9. #define ONE_WIRE_BUS 4 // DS18B20
  10. #define DHTPIN 5 // DHT22
  11. #define DHTTYPE DHT22
  12. #define OD_SENSOR_PIN A0 // DO Sensor (วัดค่าออกซิเจนละลายน้ำ)
  13.  
  14. // ---- ขารีเลย์ควบคุมอุปกรณ์ ---- //
  15. #define RELAY_COOLING_TOWER 16
  16. #define RELAY_COMPRESSOR 17
  17. #define RELAY_PUMP1 18
  18. #define RELAY_AIR_PUMP 22
  19. #define RELAY_WATER_PUMP 23
  20. #define FAN_PWM 21 // PWM พัดลม
  21.  
  22. // ---- การตั้งค่า WiFi และ MQTT ---- //
  23. const char* ssid = "VTCONCEPT_2.4G";
  24. const char* password = "014485299";
  25. const char* mqtt_server = "mqtts://mqtts.tuyacn.com";
  26. WiFiClient espClient;
  27. PubSubClient client(espClient);
  28.  
  29. // ---- กำหนดค่าเป้าหมาย ---- //
  30. float setpoint = 26.0; // อุณหภูมิเป้าหมายของน้ำ
  31. float temp_water, humidity, wbt, od_value;
  32. bool airPumpActive = true;
  33. unsigned long lastSwitchTime = 0;
  34.  
  35. OneWire oneWire(ONE_WIRE_BUS);
  36. DallasTemperature sensors(&oneWire);
  37. DHT dht(DHTPIN, DHTTYPE);
  38.  
  39. void setup() {
  40. Serial.begin(115200);
  41. sensors.begin();
  42. dht.begin();
  43.  
  44. WiFi.begin(ssid, password);
  45. while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
  46. Serial.println("Connected to Wi-Fi");
  47. client.setServer(mqtt_server, 1883);
  48.  
  49. // ตั้งค่าขารีเลย์
  50. pinMode(RELAY_COOLING_TOWER, OUTPUT);
  51. pinMode(RELAY_COMPRESSOR, OUTPUT);
  52. pinMode(RELAY_PUMP1, OUTPUT);
  53. pinMode(RELAY_AIR_PUMP, OUTPUT);
  54. pinMode(RELAY_WATER_PUMP, OUTPUT);
  55. pinMode(FAN_PWM, OUTPUT);
  56.  
  57. // เปิดอุปกรณ์เริ่มต้น
  58. digitalWrite(RELAY_AIR_PUMP, HIGH); // เปิดปั๊มลมเริ่มต้น
  59. digitalWrite(RELAY_WATER_PUMP, LOW); // ปิดปั๊มน้ำเริ่มต้น
  60. }
  61.  
  62. // ---- คำนวณ WBT (Wet-Bulb Temperature) ---- //
  63. float calculateWBT(float temp, float rh) {
  64. 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;
  65. }
  66.  
  67. // ---- ควบคุม Cooling Tower + Compressor ---- //
  68. void controlCoolingSystem() {
  69. sensors.requestTemperatures();
  70. temp_water = sensors.getTempCByIndex(0);
  71. humidity = dht.readHumidity();
  72. wbt = calculateWBT(temp_water, humidity);
  73.  
  74. Serial.printf("Water Temp: %.2f°C, RH: %.2f%%, WBT: %.2f°C\n", temp_water, humidity, wbt);
  75.  
  76. int fan_speed = 0;
  77. if (temp_water > setpoint + 1 && wbt < setpoint) {
  78. digitalWrite(RELAY_COOLING_TOWER, HIGH);
  79. digitalWrite(RELAY_PUMP1, HIGH);
  80. fan_speed = map(temp_water, setpoint, setpoint + 5, 100, 255);
  81. } else {
  82. digitalWrite(RELAY_COOLING_TOWER, LOW);
  83. digitalWrite(RELAY_PUMP1, LOW);
  84. fan_speed = 0;
  85. }
  86. analogWrite(FAN_PWM, fan_speed);
  87.  
  88. if (temp_water > setpoint + 2 && wbt >= setpoint) {
  89. digitalWrite(RELAY_COMPRESSOR, HIGH);
  90. } else {
  91. digitalWrite(RELAY_COMPRESSOR, LOW);
  92. }
  93.  
  94. client.publish("cooling/status", String(temp_water).c_str());
  95. }
  96.  
  97. // ---- ควบคุมปั๊มลม MBBR ---- //
  98. void controlAerationSystem() {
  99. od_value = analogRead(OD_SENSOR_PIN) * (10.0 / 1023.0);
  100.  
  101. Serial.print("DO Value: ");
  102. Serial.print(od_value);
  103. Serial.println(" mg/L");
  104.  
  105. unsigned long currentMillis = millis();
  106.  
  107. if (airPumpActive) {
  108. if (od_value > 5.0) {
  109. digitalWrite(RELAY_AIR_PUMP, LOW);
  110. digitalWrite(RELAY_WATER_PUMP, HIGH);
  111. airPumpActive = false;
  112. lastSwitchTime = currentMillis;
  113. Serial.println("Switched: Air Pump OFF, Water Pump ON");
  114. }
  115. } else {
  116. if (od_value < 3.0 || (currentMillis - lastSwitchTime >= 600000)) {
  117. digitalWrite(RELAY_AIR_PUMP, HIGH);
  118. digitalWrite(RELAY_WATER_PUMP, LOW);
  119. airPumpActive = true;
  120. Serial.println("Switched: Air Pump ON, Water Pump OFF");
  121. }
  122. }
  123.  
  124. client.publish("aeration/status", String(od_value).c_str());
  125. }
  126.  
  127. // ---- อัปโหลดข้อมูลไป Tuya ---- //
  128. void sendDataToTuya() {
  129. String jsonData = "{";
  130. jsonData += "\"water_temp\":" + String(temp_water) + ",";
  131. jsonData += "\"humidity\":" + String(humidity) + ",";
  132. jsonData += "\"wbt\":" + String(wbt) + ",";
  133. jsonData += "\"do_value\":" + String(od_value);
  134. jsonData += "}";
  135.  
  136. client.publish("tuya/data", jsonData.c_str());
  137. }
  138.  
  139. void loop() {
  140. if (!client.connected()) { client.connect("ESP32_Cooling"); }
  141. client.loop();
  142.  
  143. controlCoolingSystem();
  144. controlAerationSystem();
  145. sendDataToTuya();
  146.  
  147. delay(5000);
  148. }
  149.  
Success #stdin #stdout 0.02s 25944KB
stdin
Standard input is empty
stdout
#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);
}