ระบบ “พัดลมเปิดเองเมื่อร้อน / ปิดเองเมื่อเย็น” ใช้ Sensor DHT11 + ICON-32 (ESP32) + Transistor+Relay+Adapter 6V


🎯 1) จุดประสงค์การเรียนรู้เมื่อจบ EP5 นักเรียนจะสามารถ:

  1. อธิบายหลักการทำงานของเซนเซอร์ DHT11 (อุณหภูมิ + ความชื้น) ได้
  2. อ่านค่าอุณหภูมิจาก DHT11 ด้วย ICON-32 (ESP32)
  3. ใช้ลอจิก if / else สร้างเงื่อนไขควบคุมพัดลม
  4. ใช้วงจร Transistor Driver + Relay ที่เรียนใน EP3 มาควบคุมโหลดจริง
  5. เข้าใจแนวคิด Hysteresis (ตั้งค่าเปิด/ปิดคนละจุด เพื่อลดการกระพริบของรีเลย์)
  6. สร้าง Mini Project ระบบ Smart Fan พร้อม Serial Monitor แสดงค่าได้

🧩 2) อุปกรณ์ที่ใช้

#รายการจำนวนหมายเหตุ
1ICON-32 (ESP32)1บอร์ดควบคุมหลัก
2เซนเซอร์ DHT111วัดอุณหภูมิ + ความชื้น
3ทรานซิสเตอร์ NPN (เช่น 2N2222 / BC547)1วงจรขับรีเลย์
4รีเลย์ 5V หรือ 6V (ถ้ามีโมดูลก็ใช้แทนได้)1ใช้สั่งพัดลม/โหลด
5ไดโอด 1N40071Flyback diode
6ตัวต้านทาน 1kΩ1ฐานทรานซิสเตอร์
7LED + R 220Ω1แสดงสถานะพัดลม
8อะแดปเตอร์ 6V 2A1จ่ายไฟให้พัดลม/โหลด
9สายจัมเปอร์ + Breadboardต่อวงจร

🧠 3) หลักการทำงานของระบบ Smart Fan

  1. DHT11 วัด อุณหภูมิ (°C) และ ความชื้น (%RH)
  2. ICON-32 อ่านค่าจาก DHT11 แล้วเปรียบเทียบกับค่า อุณหภูมิที่กำหนด เช่น 30°C
  3. ถ้าอุณหภูมิ สูงกว่าค่าที่กำหนด → สั่งเปิดรีเลย์ → พัดลมทำงาน
  4. ถ้าอุณหภูมิ ต่ำกว่าค่าที่กำหนดเล็กน้อย → สั่งปิดรีเลย์ → พัดลมหยุด
  5. ใช้ Hysteresis เช่น
    • เปิดพัดลมเมื่อ Temp >= 30°C
    • ปิดพัดลมเมื่อ Temp <= 28°C
      เพื่อไม่ให้รีเลย์กลับไปกลับมารัว ๆ

🔌 4) การต่อวงจร

4.1 ต่อ DHT11 เข้ากับ ICON-32

DHT11 แบบโมดูล/แบบ 3 ขา:

  • ขา VCC → 3.3V (หรือ 5V ก็ได้ แต่ใช้ 3.3V จะปลอดภัยที่สุด)
  • ขา GND → GND
  • ขา DATA → GPIO 4 (หรือขาอื่นก็กำหนดเองได้)
C++
ICON-32     DHT11
3.3V   ───► VCC
GND    ───► GND
GPIO4 ───► DATA

4.2 วงจร Transistor + Relay (ทบทวนจาก EP3)

สมมติใช้:

  • GPIO 26 ของ ICON-32 ควบคุมฐานทรานซิสเตอร์ → ขับรีเลย์
  • ด้านโหลดของรีเลย์ต่อกับพัดลม 6V และอะแดปเตอร์ 6V

ฝั่งควบคุม (Control)

C++
          ICON-32
GPIO26 ──[1kΩ]──► B (Base)   NPN Transistor
                   C (Collector) ────┐

                                  Relay Coil

                                    +6V (จาก Adapter)

GND (ICON-32) ────────────────► E (Emitter) → GND ร่วมกับ Adapter

ขดลวดรีเลย์: ขนานด้วยไดโอด 1N4007 (กลับขั้ว)
    +6V ──Relay Coil───┐

                       |<| 1N4007

                       GND

ฝั่งโหลด (พัดลม 6V) – ใช้ขั้ว COM/NO ของรีเลย์

C++
+6V Adapter ─────► COM (รีเลย์)
NO (รีเลย์) ────► พัดลม 6V ───► GND Adapter

สำคัญ: GND ของ ICON-32 กับ GND ของ Adapter ต้องเชื่อมกัน เพื่อให้สัญญาณควบคุมอ้างอิงกันได้


💻 5) ติดตั้งไลบรารี DHT

ใน Arduino IDE:

  1. ไปที่ Tools → Manage Libraries…
  2. ค้นหา: DHT
  3. ติดตั้ง “DHT sensor library” by Adafruit และ “Adafruit Unified Sensor”

💻 6) โค้ดพื้นฐาน: อ่านค่าจาก DHT11

C++
#include <DHT.h>

#define DHTPIN 4       // ขา DATA ของ DHT11
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  dht.begin();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // องศาเซลเซียส

  if (isnan(h) || isnan(t)) {
    Serial.println("อ่านค่า DHT11 ไม่ได้");
    delay(1000);
    return;
  }

  Serial.print("Temp: ");
  Serial.print(t);
  Serial.print(" °C   Humidity: ");
  Serial.print(h);
  Serial.println(" %");

  delay(1000);
}

กลองรันดู แล้วเอามืออังเซนเซอร์ / เป่าลมหายใจใส่ → ดูค่าเปลี่ยนใน Serial Monitor


💻 7) โค้ด Smart Fan: เปิด–ปิดพัดลมตามอุณหภูมิ (มี Hysteresis)

สมมติ:

  • เปิดพัดลมเมื่อ Temp >= 30°C
  • ปิดพัดลมเมื่อ Temp <= 28°C
  • ใช้ GPIO 26 เป็นขาควบคุมรีเลย์
  • มี LED ที่ GPIO 2 แสดงสถานะพัดลม (ติด = พัดลม ON)
C++
#include <DHT.h>

#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

const int relayPin = 26;
const int ledPin = 2;

const float TEMP_ON  = 30.0;  // อุณหภูมิที่เริ่มเปิดพัดลม
const float TEMP_OFF = 28.0;  // อุณหภูมิที่ปิดพัดลม (ต่ำกว่าเล็กน้อย เพื่อลดการสลับถี่)

bool fanOn = false;

void setup() {
  Serial.begin(115200);
  dht.begin();

  pinMode(relayPin, OUTPUT);
  pinMode(ledPin, OUTPUT);

  digitalWrite(relayPin, LOW); // เริ่มต้น ปิดพัดลม
  digitalWrite(ledPin, LOW);
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("อ่านค่า DHT11 ไม่ได้");
    delay(1000);
    return;
  }

  Serial.print("Temp: ");
  Serial.print(t);
  Serial.print(" °C , Humidity: ");
  Serial.print(h);
  Serial.print(" % , Fan: ");
  Serial.println(fanOn ? "ON" : "OFF");

  // Logic ควบคุมแบบ Hysteresis
  if (!fanOn && t >= TEMP_ON) {
    fanOn = true;
    digitalWrite(relayPin, HIGH);  // เปิดรีเลย์
    digitalWrite(ledPin, HIGH);    // LED แสดงว่าพัดลมทำงาน
  } 
  else if (fanOn && t <= TEMP_OFF) {
    fanOn = false;
    digitalWrite(relayPin, LOW);   // ปิดรีเลย์
    digitalWrite(ledPin, LOW);
  }

  delay(1000);
}

ครูสามารถเอาโค้ดนี้ไปให้เด็กลองแล้วถามนักเรียนว่า:
“ถ้า TEMP_ON และ TEMP_OFF ต่างกันน้อยมาก หรือเท่ากัน จะเกิดอะไรขึ้นครับ?” → นำเข้าสู่แนวคิด Hysteresis


🔧 8) เพิ่มปุ่ม “โหมดแมนนวล” (เลือกเองว่าจะให้พัดลมทำงานไหม)

ต่อจาก EP1/EP1.1 ได้เลย:

แนวคิด:

  • กดปุ่มสลับโหมด:
    • Mode 0 = Auto (ควบคุมด้วยอุณหภูมิ)
    • Mode 1 = Manual Override (บังคับเปิดตลอด)

🧪 9) แบบฝึกหัด

  1. เปลี่ยนค่าตั้งต้น TEMP_ON / TEMP_OFF แล้วทดลองในห้องเรียน
  2. เพิ่มข้อความ Serial ให้แสดง “Status: COOL / WARM / HOT” ตามช่วงอุณหภูมิ เช่น
    • t < 28 → COOL
    • 28–32 → WARM
    • 32 → HOT
  3. เพิ่ม LED สีเขียว/เหลือง/แดง แสดงระดับอุณหภูมิ
  4. ลองเปลี่ยนจากพัดลมเป็น หลอดไฟ → เป็น “ระบบโคมไฟกันชื้น”
  5. ให้เด็กวาด Diagram การทำงานของระบบ (Block Diagram):
    DHT11 → ICON-32 → Transistor+Relay → Fan + LED

🧠 10) สรุปแนวคิดสำคัญ

หัวข้อสรุป
DHT11วัดอุณหภูมิ (°C) + ความชื้น (%)
ICON-32 (ESP32)อ่านค่าจาก DHT11 ผ่านไลบรารี + ขา GPIO
Relay + Transistorใช้ขยายกำลังควบคุมพัดลมจากสัญญาณดิจิทัลขนาดเล็ก
Hysteresisตั้งเกณฑ์เปิด/ปิดต่างกัน ลดการตัดต่อถี่ของรีเลย์
Smart Fanตัวอย่างจริงของระบบควบคุมอัตโนมัติ (Automation)