Shohrux Yuldashev
Published

IoT PRO – Smart Heater and Cooler System Using ESP32

An IoT-based heater–cooler system that automatically heats or cools a cup of water using a Peltier module and ESP32 Wi-Fi control.

BeginnerWork in progress24 hours2,341
IoT PRO – Smart Heater and Cooler System Using ESP32

Things used in this project

Hardware components

ESP32S
Espressif ESP32S
×1
Heatsink Fan Kit, Altivar® Adjustable Speed Drives
Heatsink Fan Kit, Altivar® Adjustable Speed Drives
×1
Fan / Force Cooled Heat Sink, CPU
Fan / Force Cooled Heat Sink, CPU
×1
Temperature Sensor
Temperature Sensor
×1

Story

Read more

Schematics

Wiring diagram

how everything is connected full guide

Code

IoT Heater-Cooler

Arduino
#include <WiFi.h>
#include <WebServer.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>

// ===================== SOZLAMALAR =====================
const char* WIFI_SSID     = ""; 
const char* WIFI_PASSWORD = "";

// Pinlar (ESP32-S3)
#define PIN_DHT 4
#define PIN_SDA 8
#define PIN_SCL 9
#define PIN_REN 15
#define PIN_LEN 16
#define PIN_RPWM 17
#define PIN_LPWM 18

// Obyektlar
DHT dht(PIN_DHT, DHT22);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Bu yerda 0x27 standart, lekin setupda skaner qilamiz
WebServer server(80);

// Global o'zgaruvchilar
float roomTemp = 0;
float targetTemp = 22.0;
float hysteresis = 0.5;
int pwmPower = 200;
String mode = "AUTO"; 
String currentAction = "OFF";

// ===================== BOSHQARUV FUNKSIYALARI =====================
void stopSystem() {
  ledcWrite(PIN_RPWM, 0);
  ledcWrite(PIN_LPWM, 0);
  currentAction = "OFF";
}

void startHeat(int power) {
  digitalWrite(PIN_REN, HIGH);
  digitalWrite(PIN_LEN, HIGH);
  ledcWrite(PIN_RPWM, 0);
  ledcWrite(PIN_LPWM, power);
  currentAction = "HEAT";
}

void startCool(int power) {
  digitalWrite(PIN_REN, HIGH);
  digitalWrite(PIN_LEN, HIGH);
  ledcWrite(PIN_LPWM, 0);
  ledcWrite(PIN_RPWM, power);
  currentAction = "COOL";
}

void updateControl() {
  float t = dht.readTemperature();
  if (!isnan(t)) {
    roomTemp = t;
  }

  if (mode == "AUTO") {
    if (roomTemp < (targetTemp - hysteresis)) {
      startHeat(pwmPower);
    } else if (roomTemp > (targetTemp + hysteresis)) {
      startCool(pwmPower);
    } else {
      stopSystem();
    }
  }
}

// ===================== WEB SAHIFA =====================
void handleRoot() {
  String s = "<html><head><meta name='viewport' content='width=device-width, initial-scale=1'>";
  s += "<style>body{font-family:sans-serif;text-align:center;padding:20px; background:#f4f4f4;} .card{background:white;padding:20px;border-radius:10px;display:inline-block;box-shadow:0 2px 10px rgba(0,0,0,0.1);}</style></head><body>";
  s += "<div class='card'><h1>IoT Pro Controller</h1>";
  s += "<h2>Harorat: " + String(roomTemp, 1) + " C</h2>";
  s += "<p>Holat: <b style='color:red;'>" + currentAction + "</b> | Rejim: <b>" + mode + "</b></p>";
  s += "<hr><form action='/set'>Maqsadli Temp: <input name='t' type='number' step='0.1' value='"+String(targetTemp)+"' style='width:60px;'><br><br>";
  s += "Rejim: <select name='m'><option value='AUTO'>AUTO</option><option value='MANUAL'>MANUAL</option></select><br><br>";
  s += "<input type='submit' value='Saqlash' style='padding:10px 20px; background:#28a745; color:white; border:none; border-radius:5px;'></form></div>";
  s += "</body></html>";
  server.send(200, "text/html", s);
}

void handleSet() {
  if (server.hasArg("t")) targetTemp = server.arg("t").toFloat();
  if (server.hasArg("m")) mode = server.arg("m");
  updateControl();
  server.sendHeader("Location", "/");
  server.send(302, "text/plain", "OK");
}

// ===================== SETUP VA LOOP =====================
void setup() {
  Serial.begin(115200);
  delay(1000);
  
  // I2C Skaner va LCD init
  Wire.begin(PIN_SDA, PIN_SCL);
  
  // LCD manzilini tekshirish
  byte error, address;
  address = 0x27; // Dastlab 0x27 ni ko'ramiz
  Wire.beginTransmission(address);
  error = Wire.endTransmission();
  if (error != 0) address = 0x3F; // Agar xato bo'lsa 0x3F ni ko'ramiz

  lcd = LiquidCrystal_I2C(address, 16, 2);
  lcd.init();
  lcd.backlight();
  lcd.print("WiFi ulanmoqda...");

  dht.begin();
  pinMode(PIN_REN, OUTPUT);
  pinMode(PIN_LEN, OUTPUT);
  
  ledcAttach(PIN_RPWM, 20000, 8);
  ledcAttach(PIN_LPWM, 20000, 8);
  stopSystem();

  // WiFi ulanish
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("WiFi ulanmoqda...");
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  // IP Manzilni LCD va Serialga chiqarish
  Serial.println("\nWiFi Ulandi!");
  Serial.print("IP Manzil: ");
  Serial.println(WiFi.localIP());

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("IP Manzil:");
  lcd.setCursor(0, 1);
  lcd.print(WiFi.localIP().toString()); // toString() muhim
  server.on("/", handleRoot);
  server.on("/set", handleSet);
  server.begin();
  Serial.println("Web-server ishga tushdi.");
}

void loop() {
  server.handleClient();
  
  static unsigned long lastUpdate = 0;
  if (millis() - lastUpdate > 2000) {
    lastUpdate = millis();
    updateControl();
    
    // Serial monitorda kuzatish
    Serial.print("Temp: "); Serial.print(roomTemp);
    Serial.print(" | Target: "); Serial.print(targetTemp);
    Serial.print(" | Action: "); Serial.println(currentAction);
    
    // Agar LCD hali ham bo'sh bo'lsa, har loopda yangilashni majburlaymiz
    lcd.setCursor(0, 0);
    lcd.print("T:" + String(roomTemp, 1) + " Target:" + String(targetTemp, 1) + " ");
    lcd.setCursor(0, 1);
    lcd.print("IP:" + WiFi.localIP().toString() + "   ");
  }
}

Credits

Shohrux Yuldashev
1 project • 3 followers

Comments