Quạt 5V tự bật khi nóng, vặn núm chỉnh nhiệt độ (Arduino Nano + DHT22)

Quạt mini 5V tự chạy khi nhiệt độ vượt mức bạn đặt bằng núm vặn (20–40°C) và tự tắt khi đã mát, có trễ 1°C nên quạt không bật tắt liên tục. Nóng nhiều thì quạt chạy mạnh hơn. Dùng làm mát tủ mạng, hộp điện tử, chuồng gà con, hộp ủ.

⏱ 75 phút🔧 Biết hàn💰 Linh kiện ~169.500đ🧠 Arduino Nano⚡ Nguồn USB 5V

✅ Đã kiểm thử

Luật điệnKhông lỗiSai chân, chập nguồn, quá áp 5V vào chân 3,3V, thiếu đi-ốt, thiếu trở kéo…
Mô phỏng SPICE2/2 kịch bản · 12 phép đo đạtDòng/áp từng linh kiện ở trường hợp xấu nhất (ngspice)
Biên dịch codeĐạt · dùng 28% bộ nhớarduino:avr:nano
Xem chi tiết 12 phép đo

Quạt chạy hết công suất (D5 mức cao, núm vặn tối đa)

  • Q1: dẫn 242.7mA, Vce=0.15V (bão hòa tốt).
  • LED1: dòng 8.2mA (cho phép 20.0mA).
  • Chân D5 cấp 8.3mA (an toàn ≤ 20.0mA).
  • Chân D6 cấp 8.2mA (an toàn ≤ 20.0mA).
  • Tổng dòng đỉnh từ USB 292.2mA (đủ với cục sạc 5V 1A).
  • Dòng chạy qua quạt: 242.7mA ✓
  • Dòng chân D5 phải cấp: 8.3mA ✓
  • Dòng LED báo quạt chạy: 8.2mA ✓
  • Áp núm vặn vào A0: 0.00V ✓

Quạt tắt (D5 mức thấp, núm vặn ở giữa)

  • Tổng dòng đỉnh từ USB 33.0mA (đủ với cục sạc 5V 1A).
  • Quạt tắt hẳn: 0.0mA ✓
  • Áp núm vặn ở giữa (≈30°C): 2.50V ✓
Kiểm lần cuối: 17:06:25 12/11/2026

Nguyên lý hoạt động

DHT22 đo nhiệt độ mỗi 2,5 giây. Núm vặn 10kΩ chia áp 0–5V vào A0, Arduino quy ra nhiệt độ đặt 20–40°C. Khi nhiệt độ ≥ mức đặt, chân D5 xuất xung PWM mở transistor S8050: dòng chân chỉ ~8mA nhưng transistor cho quạt ăn ~0,25A. Quạt chỉ tắt khi nhiệt độ xuống dưới mức đặt 1°C và đã chạy ít nhất 30 giây (chống bật tắt liên tục). Nóng hơn mức đặt 3°C thì quạt chạy 100%, gần mức đặt chạy 60%. Đi-ốt 1N4007 dập điện áp ngược của động cơ để bảo vệ transistor. Cảm biến hỏng thì quạt chạy luôn (an toàn) và LED nháy.

Sơ đồ đấu dây

Mỗi màu là một dây. Chấm tròn là điểm hàn. Chạm vào tên dây trong bảng để làm nổi bật.

⚡ Mô phỏng tương tácBấm thử — mạch được giải ngay trên máy bạn, điện áp và dòng hiện lên sơ đồ bên dưới.
Tình huống mẫu
Chân D5điều khiển R1
Chân D6điều khiển R2
Biến trở VR1vặn núm (10k)

Đây là mô phỏng một chiều (DC) ở trạng thái tĩnh: dùng để kiểm tra mức áp, dòng và công suất. Hiệu ứng nhấp nháy, PWM hay giao tiếp số do code quyết định nên không chạy ở đây.

5V5VGNDGNDDHT_DATADHT_DATAFAN_DRVFAN_DRVFAN_BASEFAN_BASEFAN_NEGFAN_NEGLED_DRVLED_DRVLED_ALED_AKNOBKNOBU1 · Arduino Nano5VA0D2D5D6GNDVR1 · Biến trở13W · chân giữaU2 · Cảm biến nhiệt độ – độ ẩm DHT22VCCDATAGNDR1 · Điện trở 470Ω12Q1 · Transistor NPN S8050B (gốc)C (góp)E (phát)M1 · Động cơ DC mini 3–6V-+D1 · Đi-ốt 1N4007A (anode)K (vạch trắng)R2 · Điện trở 330Ω12LED1 · Đèn LED 5mmA · chân dài (+)K · chân ngắn (−)
#DâyNối các điểmÁp mô phỏng
1đỏ
5V
U1 5V ⟷ U2 VCC ⟷ M1 + ⟷ D1 K (vạch trắng) ⟷ VR1 1—
2đen
GND
U1 GND ⟷ U2 GND ⟷ Q1 E (phát) ⟷ LED1 K · chân ngắn (−) ⟷ VR1 3—
3vàng
DHT_DATA
U2 DATA ⟷ U1 D2—
4xanh lá
FAN_DRV
U1 D5 ⟷ R1 1—
5xanh dương
FAN_BASE
R1 2 ⟷ Q1 B (gốc)—
6tím
FAN_NEG
M1 - ⟷ D1 A (anode) ⟷ Q1 C (góp)—
7xanh ngọc
LED_DRV
U1 D6 ⟷ R2 1—
8nâu
LED_A
R2 2 ⟷ LED1 A · chân dài (+)—
9hồng
KNOB
VR1 W · chân giữa ⟷ U1 A0—

Danh sách linh kiện

Ký hiệuLinh kiệnGiá tham khảo
U1Arduino Nano V3 (ATmega328P, chip nạp CH340) kèm cáp USB85.000đTìm mua
U2Module cảm biến DHT22 (AM2302) loại 3 chân có mạch đế65.000đTìm mua
M1Quạt/động cơ DC mini 5V (dòng ≤ 300mA), vd quạt tản nhiệt 5V 4–6cm15.000đTìm mua
Q1Transistor S8050 (TO-92)500đTìm mua
R1Điện trở 470Ω 1/4W (vàng-tím-nâu)200đTìm mua
D1Đi-ốt 1N4007300đTìm mua
LED1LED xanh lá 5mm (green)300đTìm mua
R2Điện trở 330Ω 1/4W (cam-cam-nâu)200đTìm mua
VR1Biến trở núm vặn 10kΩ (loại B10K 3 chân)3.000đTìm mua
Tổng (chưa gồm board hàn, dây, thiếc)169.500đ

Các bước làm

Code nạp cho mạch

Cài thư viện: DHT sensor library, Adafruit Unified Sensor (Arduino IDE → Library Manager). Chọn board Arduino Nano.

/*
  Mạch Gọn — Quạt 5V tự bật theo nhiệt độ (Arduino Nano + DHT22)
  Thư viện: DHT sensor library, Adafruit Unified Sensor
  Chân : D2 <- DHT22 ; D5 (PWM) -> 470Ω -> S8050 -> quạt ; D6 -> 330Ω -> LED xanh
         A0 <- chân giữa biến trở 10k (chỉnh mức nhiệt 20–40°C)
*/
#include <Arduino.h>
#include <DHT.h>

const uint8_t PIN_DHT = 2, PIN_FAN = 5, PIN_LED = 6, PIN_KNOB = A0;
const float SET_MIN = 20.0, SET_MAX = 40.0;
const float HYST = 1.0;                    // tắt khi thấp hơn mức đặt 1°C
const float FULL_ABOVE = 3.0;              // nóng hơn mức đặt 3°C -> chạy 100%
const uint8_t SPEED_LOW = 153, SPEED_FULL = 255;   // 60% và 100%
const uint32_t MIN_RUN_MS = 30000;          // chạy ít nhất 30 giây mỗi lần
const uint32_t KICK_MS = 500;               // đẩy 100% lúc khởi động quạt
const uint32_t READ_MS = 2500;

DHT dht(PIN_DHT, DHT22);
float tempC = NAN, setC = 30;
bool fanOn = false, sensorOk = false;
uint8_t failCount = 0;
uint32_t fanStart = 0, lastRead = 0, lastPrint = 0;

float readKnob() {
  long sum = 0;
  for (int i = 0; i < 8; i++) sum += analogRead(PIN_KNOB);
  float v = sum / 8.0 / 1023.0;
  float s = SET_MIN + v * (SET_MAX - SET_MIN);
  return round(s * 2) / 2.0;                // bước 0,5°C
}

void applyFan(uint8_t speed) {
  uint32_t now = millis();
  if (speed && !fanOn) { fanOn = true; fanStart = now; }
  if (!speed) fanOn = false;
  if (fanOn && now - fanStart < KICK_MS) speed = SPEED_FULL;
  analogWrite(PIN_FAN, speed);
}

void setup() {
  pinMode(PIN_FAN, OUTPUT); analogWrite(PIN_FAN, 0);
  pinMode(PIN_LED, OUTPUT);
  Serial.begin(115200);
  dht.begin();
  Serial.println(F("Mach Gon - Quat tu dong theo nhiet do"));
}

void loop() {
  uint32_t now = millis();
  setC = readKnob();
  if (now - lastRead >= READ_MS) {
    lastRead = now;
    float t = dht.readTemperature();
    if (isnan(t)) { if (failCount < 255) failCount++; }
    else { failCount = 0; tempC = t; }
    sensorOk = failCount < 3;
  }

  uint8_t speed = 0;
  if (!sensorOk) {
    speed = SPEED_FULL;                     // an toàn: lỗi cảm biến thì quạt chạy
  } else if (!isnan(tempC)) {
    bool want = fanOn ? (tempC > setC - HYST || now - fanStart < MIN_RUN_MS) : (tempC >= setC);
    if (want) speed = tempC >= setC + FULL_ABOVE ? SPEED_FULL : SPEED_LOW;
  }
  applyFan(speed);
  digitalWrite(PIN_LED, sensorOk ? fanOn : ((now / 250) % 2));

  if (now - lastPrint > 2000) {
    lastPrint = now;
    Serial.print(F("Nhiet do: ")); Serial.print(sensorOk ? String(tempC, 1) : String(F("LOI")));
    Serial.print(F(" C | Muc dat: ")); Serial.print(setC, 1);
    Serial.print(F(" C | Quat: ")); Serial.println(fanOn ? (speed == SPEED_FULL ? F("100%") : F("60%")) : F("tat"));
  }
}

🔌 Cắm thử trên breadboard

Cắm nháp trên board cắm trước cho chắc, chạy đúng rồi hãy làm mạch in. Sơ đồ này do máy tự xếp từ chính netlist ở trên và đã đối chiếu lại: hai chân cùng một cột (cùng nửa board) là thông nhau, không có net nào bị chập.

+−+−55101015152020252530303535JIHGFEDCBAU1 · Arduino NanoGND5VD2D5D6A0U2M1Q1 S8050R1 470D1 1N4007LED1 greenR2 330VR1 10k
  • Mỗi cột 5 lỗ trong cùng một nửa board thông nhau; hai nửa cách nhau bởi rãnh giữa.
  • Hai đường kẻ dọc mép board là đường nguồn: hàng + (vạch đỏ) và hàng − (vạch xanh). Nhớ bắc dây nối đường nguồn trên với đường nguồn dưới nếu dùng cả hai nửa.
  • Màu dây trên hình trùng với màu trong bảng nối dây ở mục Sơ đồ, cắm theo màu cho dễ dò.

🧲 Mạch in để ủi (PCB 1 mặt)

Bản mạch in một mặt đồng, tự xếp linh kiện và tự đi dây, đã kiểm quy tắc khoảng cách và đối chiếu đúng 100% với sơ đồ nguyên lý ở trên. In tỉ lệ 1:1 rồi ủi lên tấm đồng.

Kích thước board48,3×53,3 mm49 lỗ khoan · mũi 0,8 / 0,9 / 1 / 1,2mm
Đi dây 1 mặt15 đoạn · 318,8 mm · 1 cầu nhảyCầu nhảy = đoạn dây hàn ở mặt linh kiện
Kiểm tra bản mạchĐạt DRC · khớp 100% netlistĐường ≥0,8mm, khe ≥0,5mm; mọi net đối chiếu lại từ hình học thật
Mặt đồng — đã lật gương sẵn để in rồi ủi úp xuống tấm đồng
Mặt linh kiện — vị trí, chiều cắm và tên từng chân
U1U2M1Q1R1D1LED1R2VR1D1D0RSTGNDD2D3D4D5D6D7D8D9D10D11D12VINGND2RST25VA7A6A5A4A3A2A1A0AREF3V3D13VCCDATAGND+-
Cầu nhảy cần hàn (dây đơn ở mặt linh kiện):
  • net 5V: U1.5V → U2.VCC
Hướng dẫn ủi – ăn mòn – khoan – hàn (đầy đủ)

Hướng dẫn làm mạch in bằng phương pháp ủi

Mạch: Quạt 5V tự bật khi nóng, vặn núm chỉnh nhiệt độ (Arduino Nano + DHT22)

Kích thước board: 48,3×53,3 mm · 49 lỗ khoan (mũi 0,8, 0,9, 1 và 1,2 mm) · 15 đoạn mạch, tổng 318,8 mm · 1 cầu nhảy.

Quy tắc đã kiểm: đường mạch rộng 0,8mm (nguồn và GND 1mm), khe cách tối thiểu 0,5mm. Mạch in đã được máy đối chiếu đúng 100% với sơ đồ nguyên lý.

1. In đúng tỉ lệ 1:1

  • In trang "MẶT ĐỒNG" bằng máy in LASER, đặt tỉ lệ 100%, KHÔNG chọn "Fit to page" hay "Scale to fit".
  • Dùng thước trên bản in đo lại đoạn 100mm: phải đúng 100mm mới dùng được.
  • In trên giấy in ảnh bóng, giấy decal bóc, hoặc giấy tạp chí láng. Mực càng dày càng tốt.
  • Trang "MẶT ĐỒNG" đã được LẬT GƯƠNG sẵn: úp mặt có mực vào tấm đồng là đúng chiều.

2. Chuẩn bị tấm đồng

  • Cắt phíp đồng (board đồng một mặt) lớn hơn kích thước mạch mỗi bề khoảng 5mm.
  • Chà mặt đồng bằng giấy nhám mịn (P800–P1200) rồi rửa sạch, lau khô. Mặt đồng phải sáng, không vết dầu mỡ, không chạm tay vào.

3. Ủi mực sang đồng

  • Úp mặt có mực vào tấm đồng, dùng băng keo giấy dán cố định một cạnh.
  • Bàn ủi để mức nóng nhất (cotton/linen), KHÔNG dùng chế độ phun hơi nước.
  • Ủi đè mạnh và đều 3–5 phút, tập trung từng vùng nhỏ, chú ý các góc và mép.
  • Để nguội hẳn rồi ngâm cả tấm vào nước ấm 5–10 phút, bóc giấy thật nhẹ. Giấy decal thì bóc khi còn ấm.
  • Soi kỹ: chỗ nào mực bị thiếu hoặc đứt đường thì tô lại bằng bút lông dầu (bút CD) rồi để khô.

4. Ăn mòn (etching)

  • Pha dung dịch sắt(III) clorua FeCl3 theo hướng dẫn trên bao bì, hoặc dung dịch oxy già + muối ăn + a-xít; dùng hộp nhựa, KHÔNG dùng đồ kim loại.
  • Nhiệt độ dung dịch khoảng 40–50°C thì ăn nhanh hơn. Lắc nhẹ hộp cho đều, thường 10–25 phút là xong.
  • An toàn: đeo găng tay cao su và kính bảo hộ, làm ở nơi thoáng. Dung dịch ăn mòn làm hỏng quần áo, bồn rửa và gây bỏng rát da.
  • Xong thì rửa board bằng nước sạch, lau khô, dùng xăng thơm hoặc axeton lau sạch lớp mực.
  • Dung dịch đã dùng KHÔNG đổ xuống bồn rửa hay cống; đựng vào can kín và bỏ đúng nơi thu gom chất thải.

5. Khoan lỗ

  • Đối chiếu trang "BẢN VẼ LỖ KHOAN" để biết lỗ nào dùng mũi nào.
  • Dùng mũi khoan 0,8mm, 0,9mm, 1mm và 1,2mm, khoan từ MẶT ĐỒNG vào để mũi tự định tâm giữa pad.
  • Khoan tốc độ cao, đẩy nhẹ; mũi nhỏ rất dễ gãy. Khoan xong chà nhẹ bavia hai mặt.

6. Hàn linh kiện

  • Linh kiện cắm ở MẶT KHÔNG CÓ ĐỒNG, hàn ở mặt đồng. Theo trang "MẶT LINH KIỆN" để đặt đúng vị trí và đúng chiều.
  • Hàn linh kiện thấp trước (điện trở, đi-ốt), cao sau (tụ, hàng chân, board vi điều khiển).
  • Chú ý chiều: LED chân dài là (+); đi-ốt có vạch trắng là K; tụ hoá có vạch là (−); transistor theo mặt chữ như nét vẽ đỏ.
  • Mạch này còn 1 CẦU NHẢY: hàn đoạn dây đơn ở mặt linh kiện theo nét đỏ gạch trên bản vẽ:
  • cầu nhảy net 5V: từ U1.5V sang U2.VCC
  • Trước khi cấp điện: đo thông mạch giữa chân nguồn và GND — KHÔNG được kêu (không được chập).

Lưu ý với board vi điều khiển

  • Board nhái có thể khác thứ tự chân. Đối chiếu tên chân in cạnh từng lỗ trên trang "MẶT LINH KIỆN" với chữ in trên board thật TRƯỚC KHI ăn mòn. Nếu khác, đừng hàn mà báo lại để sửa bản vẽ.
Bản vẽ lỗ khoan
BẢN VẼ LỖ KHOAN (nhìn từ mặt linh kiện)mũi khoan 0,8mm — 7 lỗmũi khoan 0,9mm — 5 lỗmũi khoan 1mm — 35 lỗmũi khoan 1,2mm — 2 lỗ

Đo kiểm bằng đồng hồ vạn năng

Giữa chân giữa biến trở và GND khi vặn từ đầu đến cuốithay đổi 0 → 5V
Giữa 2 dây quạt khi quạt chạy 100%4,5 – 5,0V
Giữa chân C và E của S8050 khi quạt chạy 100%dưới 0,3V
Vặn núm về 20°C (hết bên trái) ở phòng 28°CQuạt chạy, LED xanh sáng

Sửa lỗi thường gặp

Quạt kêu rè nhưng không quay ở mức 60%

Quạt nhỏ cần lực khởi động; code đã đẩy 100% trong 0,5 giây đầu. Nếu vẫn không quay, sửa SPEED_LOW trong code lên 200.

Quạt chạy luôn và LED nháy

Đang báo lỗi cảm biến: kiểm tra dây OUT vào D2 và chân +/−.

Transistor nóng

Quạt ăn quá 400mA; thay quạt nhỏ hơn hoặc dùng MOSFET IRLZ44N cho quạt lớn.

Không nạp được code

Cài driver CH340, chọn "ATmega328P (Old Bootloader)", thử cáp USB khác.

⚠️ An toàn

  • Mạch chạy 5V từ USB, an toàn.
  • Không dùng mạch này để bật quạt điện 220V; muốn điều khiển quạt 220V hãy nhờ thợ điện hoặc dùng ổ cắm thông minh có chứng nhận.