Liquid Cooler for Mobile Phone — ESP32 simulation

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by dwisatriya32.

Components

Sketch code

#include <Wire.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v1.h>
#include <U8g2lib.h>

// --- KONFIGURASI PIN ---
#define DHTPIN 4
#define DHTTYPE DHT22
#define ONE_WIRE_BUS 25

// Pin MOSFET Output
#define TEC_PIN 18
#define FAN_PIN 19
#define PUMP_PIN 23

// --- KONFIGURASI PWM (LEDC API BARU ESP32 CORE V3) ---
#define PWM_FREQ 5000
#define PWM_RES 8 // Resolusi 8-bit (0-255)

// --- INISIALISASI OBJEK ---
DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

// --- VARIABEL PID ---
double Setpoint, Input, Output;
double Kp = 3.0, Ki = 0.5, Kd = 1.0; 
PID tecPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, REVERSE);

void setup() {
  Serial.begin(115200);
  
  // Inisialisasi Sensor & OLED
  dht.begin();
  sensors.begin();
  u8g2.begin();

  // Setup LEDC PWM (API Baru: Tanpa Channel, Langsung Pin)
  ledcAttach(TEC_PIN, PWM_FREQ, PWM_RES);
  ledcAttach(FAN_PIN, PWM_FREQ, PWM_RES);
  ledcAttach(PUMP_PIN, PWM_FREQ, PWM_RES);

  // Setup PID
  tecPID.SetMode(AUTOMATIC);
  tecPID.SetOutputLimits(0, 200); // Batasan PWM (0 - 200)

  Serial.println("System Initialized...");
  Serial.println("Menunggu sensor stabil (Delay 2 detik)...");
  delay(2000); // Waktu stabilisasi sensor DHT22
}

// Rumus Magnus-Tetens untuk menghitung Dew Point
float calculateDewPoint(float temp, float hum) {
  float a = 17.27;
  float b = 237.7;
  float alpha = ((a * temp) / (b + temp)) + log(hum / 100.0);
  return (b * alpha) / (a - alpha);
}

void loop() {
  // 1. Baca Sensor
  float rh = dht.readHumidity();
  float t_amb = dht.readTemperature();
  
  sensors.requestTemperatures();
  float t_hp = sensors.getTempCByIndex(0);    // Suhu Sisi Dingin (HP)
  float t_water = sensors.getTempCByIndex(1); // Suhu Sisi Panas (Air)

  // === RADAR DETEKSI ERROR (TAMPIL DI SERIAL MONITOR) ===
  Serial.println("\n--- Cek Status Sensor ---");
  Serial.print("DHT22  -> Kelembapan: "); Serial.print(rh); 
  Serial.print(" | Suhu Ruang: "); Serial.println(t_amb);
  Serial.print("DS18B20-> Sensor 1 (HP): "); Serial.print(t_hp); 
  Serial.print(" | Sensor 2 (Air): "); Serial.println(t_water);
  Serial.println("-------------------------");

  // 2. Validasi Sensor (Failsafe Mechanism)
  if (isnan(rh) || isnan(t_amb) || t_hp == DEVICE_DISCONNECTED_C || t_water == DEVICE_DISCONNECTED_C) {
    // API Baru: ledcWrite menggunakan PIN, bukan CH
    ledcWrite(TEC_PIN, 0);
    ledcWrite(FAN_PIN, 0);
    ledcWrite(PUMP_PIN, 0);
    Serial.println("CRITICAL ERROR: Sensor terputus! Semua sistem dimatikan.");
    
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_ncenB08_tr);
    u8g2.drawStr(0, 30, "SENSOR ERROR!");
    u8g2.sendBuffer();
    delay(2000);
    return;
  }

  // 3. Kalkulasi Dew Point & Setpoint Dinamis
  float dewPoint = calculateDewPoint(t_amb, rh);
  float safeLimit = dewPoint + 3.0; // Margin aman anti-kondensasi
  
  float targetT

More projects by dwisatriya32