Đèn ngủ tự bật khi có người (Arduino)
Miễn phíINO

📡 IoT – Lập trình nhúng · 🛠️ DIY – Tự làm · dùng với Gói Chuyên nghiệp · bộ IoT – Lập trình nhúng

Đèn ngủ tự bật khi có người (Arduino)

Tự làm đèn ngủ LED 5V tự bật khi có người đi qua trong bóng tối: Arduino Nano, cảm biến PIR, quang trở. Có mã nguồn miễn phí.

Tệp tải về

Giấy phép CC BY 4.0 — dùng miễn phí, ghi nguồn “OctaX.vn”. Demo bản thật yêu cầu tài khoản miễn phí để tải.

Muốn sửa theo ý mình?

Trợ lý OctaX sửa kích thước, nội dung, thương hiệu theo yêu cầu — ước tính ≈ 3 credit.

✦ Tuỳ biến bằng AI

Chỉ dùng nguồn 5V. Không tự đấu vào điện lưới 220V nếu không có chuyên môn.

Vật tư

  • Arduino Nano
  • Cảm biến chuyển động PIR HC-SR501
  • Quang trở + điện trở 10 kΩ
  • MOSFET IRLZ44N + điện trở 220 Ω, 100 kΩ
  • Dải LED 5V (≤ 1 m)
  • Nguồn 5V 2A

Các bước

  1. Nối cảm biến PIR HC-SR501: VCC → 5V, GND → GND, OUT → chân D2.
  2. Nối quang trở với điện trở 10 kΩ thành cầu chia áp vào chân A0.
  3. Nối dải LED 5V qua MOSFET kênh N mức logic (vd IRLZ44N): cực G → D9 qua điện trở 220 Ω, thêm điện trở 100 kΩ từ G xuống GND.
  4. Nạp mã nguồn, đo giá trị A0 lúc tắt đèn phòng rồi chỉnh NGUONG_TOI cho hợp.
  5. Cho vào hộp, đặt cảm biến hướng lối đi, cách sàn khoảng 30–50 cm.

Mã nguồn

// Đèn ngủ tự bật khi có người trong bóng tối — OctaX.vn (CC BY 4.0)
// Bo: Arduino Nano. PIR → D2, quang trở (cầu chia áp với 10 kΩ) → A0, MOSFET điều khiển dải LED → D9 (PWM).
const int PIN_PIR = 2;
const int PIN_LDR = A0;
const int PIN_LED = 9;
const int NGUONG_TOI = 600;              // A0 lớn hơn ngưỡng này coi là tối (đo thực tế rồi chỉnh)
const unsigned long GIU_SANG = 60000UL;  // giữ đèn sáng 60 giây sau lần cuối thấy người
const int DO_SANG = 140;                 // 0–255: đèn ngủ không cần sáng tối đa

unsigned long lanCuoiCoNguoi = 0;
int doSangHienTai = 0;

void setup() {
  pinMode(PIN_PIR, INPUT);
  pinMode(PIN_LED, OUTPUT);
}

void loop() {
  bool coNguoi = digitalRead(PIN_PIR) == HIGH;
  bool troiToi = analogRead(PIN_LDR) > NGUONG_TOI;

  // Chỉ "ghi nhận có người" khi trời tối, để ban ngày đèn không bật
  if (coNguoi && troiToi) lanCuoiCoNguoi = millis();

  int mucTieu = (lanCuoiCoNguoi && millis() - lanCuoiCoNguoi < GIU_SANG) ? DO_SANG : 0;

  // Sáng/tắt dần cho dịu mắt: mỗi vòng thay đổi 1 nấc
  if (doSangHienTai < mucTieu) doSangHienTai++;
  else if (doSangHienTai > mucTieu) doSangHienTai--;
  analogWrite(PIN_LED, doSangHienTai);
  delay(8);
}

Mẫu cùng lĩnh vực