// Đè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); }