WS2812B LED strip glowing warm on a desk edge, wired to PIR sensor and ESP32-C3 on a breadboard

ผู้เริ่มต้น

สร้างไฟส่องโต๊ะทำงานแบบตรวจจับการเคลื่อนไหว

เซ็นเซอร์ระบบอัตโนมัติจอแสดงผล

ใช้เซ็นเซอร์ตรวจจับความเคลื่อนไหวและตัวควบคุมเพื่อเปิดปิดไฟแรงดันต่ำโดยอัตโนมัติ โดยจะแนะนำอินพุตดิจิทัล การจับเวลา และตรรกะระบบอัตโนมัติแบบง่ายๆ

รวมชิ้นส่วนจริง 7 รายการ

ราคารวมชุดนี้: 1,640.00 ฿

ยังไม่รวมส่วนลดคำสั่งซื้อที่คุณอาจได้รับตอนชำระเงิน

สิ่งที่คุณต้องใช้

เป้าหมายของโครงการ

โครงการนี้นำเสนอหลักการทำงานอัตโนมัติโดยใช้การกระทำทางกายภาพที่ง่ายที่สุดเท่าที่จะเป็นไปได้: ไฟที่จะเปิดเมื่อตรวจพบการเคลื่อนไหวและปิดอีกครั้งในเวลาอันสั้น โครงการนี้เป็นโครงการที่สองที่เหมาะสมหลังจากสร้างอุปกรณ์ที่อ่านค่าเซ็นเซอร์ เนื่องจากมีการเพิ่มอินพุตดิจิทัลและการตัดสินใจ (ตอนนี้ควรเปิดไฟหรือไม่?) แทนที่จะแสดงเพียงแค่ค่าเท่านั้น

การตรวจจับการเคลื่อนไหว

เซ็นเซอร์ตรวจจับการเคลื่อนไหวทั่วไปสำหรับโครงการประเภทนี้จะตรวจจับการเปลี่ยนแปลงของรังสีอินฟราเรดในขอบเขตการมองเห็นและส่งสัญญาณดิจิทัลแบบง่ายๆ -- สูงเมื่อตรวจพบการเคลื่อนไหว ต่ำเมื่อไม่มีการเคลื่อนไหว ไม่มีข้อมูลที่ซับซ้อนให้ตีความ ซึ่งทำให้เป็นเซ็นเซอร์เริ่มต้นที่ดีสำหรับการเรียนรู้อินพุตดิจิทัลโดยเฉพาะ

พื้นฐานอินพุตดิจิทัล

ต่างจากเซ็นเซอร์อนาล็อก อินพุตดิจิทัลจะรายงานเพียงสถานะใดสถานะหนึ่งจากสองสถานะเสมอ ตัวควบคุมของคุณจะอ่านพินนั้นในแต่ละรอบและตรวจสอบง่ายๆ ว่า: ตอนนี้เป็นสถานะสูงหรือต่ำ? การตัดสินใจทุกอย่างในโครงการนี้สร้างขึ้นจากการตรวจสอบเพียงครั้งเดียวนั้น

การสลับแรงดันต่ำอย่างปลอดภัย

โครงการนี้ตั้งใจที่จะใช้กับระบบไฟส่องสว่างแรงดันต่ำเท่านั้น -- ไฟที่จ่ายไฟในลักษณะเดียวกับตัวควบคุมของคุณ โดยสลับผ่านวงจรขับหรือทรานซิสเตอร์ที่มีพิกัดแรงดันต่ำที่เหมาะสมกับไฟเฉพาะนั้น อย่าพยายามปรับโครงการนี้เพื่อสลับไฟส่องสว่างในบ้านที่ใช้แรงดันไฟหลัก เนื่องจากต้องใช้อุปกรณ์ที่แตกต่างกัน ความรู้ด้านความปลอดภัยที่แตกต่างกัน และอยู่นอกเหนือขอบเขตของคู่มือนี้ทั้งหมด

ตรรกะการจับเวลา

แทนที่จะปิดไฟทันทีที่ตรวจไม่พบการเคลื่อนไหว เวอร์ชันที่ใช้งานได้จริงจะเปิดไฟทิ้งไว้เป็นระยะเวลาสั้นๆ ที่กำหนดหลังจากตรวจพบการเคลื่อนไหวครั้งล่าสุด โดยจะรีเฟรชตัวจับเวลานั้นทุกครั้งที่ตรวจพบการเคลื่อนไหวใหม่ นี่คือสิ่งที่ทำให้ไฟรู้สึกเหมือนกำลังเปิดอยู่สำหรับคนที่เคลื่อนไหวไปมา แทนที่จะกะพริบปิดทันทีที่พวกเขาหยุดนิ่งชั่วขณะ

การหลีกเลี่ยงการกระตุ้นซ้ำๆ

หากไม่มีตรรกะการจับเวลาเลย เซ็นเซอร์ตรวจจับการเคลื่อนไหวที่ทำงานอย่างรวดเร็วสามารถทำให้ไฟกะพริบเปิดและปิดหลายครั้งต่อวินาที หน้าต่างเปิดค้างแบบตั้งเวลาที่อธิบายข้างต้นเป็นวิธีแก้ไขที่ง่ายที่สุด และคุ้มค่าที่จะนำไปใช้ก่อนที่จะทำสิ่งที่ซับซ้อนกว่านี้

การแก้ไขข้อบกพร่องเบื้องต้น

  • ไฟไม่เคยเปิด -- ยืนยันสถานะพินเอาต์พุตของเซ็นเซอร์โดยตรง (การอ่านค่าอย่างง่าย ก่อนเพิ่มตรรกะไฟใดๆ) เพื่อแยกแยะว่าเซ็นเซอร์หรือด้านการสลับไฟเป็นสาเหตุ
  • ไฟเปิดค้างตลอดเวลา -- ตรวจสอบว่าเซ็นเซอร์ของคุณมีการปรับความไว/หน่วงเวลาภายในตัวที่อาจรบกวนตรรกะการจับเวลาของคุณเองหรือไม่
  • ไฟกะพริบอย่างรวดเร็ว -- นี่คือปัญหาการกระตุ้นซ้ำๆ ข้างต้น; เพิ่มหรือขยายตัวจับเวลาเปิดค้าง

การอัปเกรดเสริม: ความสว่างของแสงโดยรอบ

เมื่อการสลับการเคลื่อนไหวพื้นฐานทำงานได้อย่างน่าเชื่อถือ การขยายที่เป็นธรรมชาติคือการเพิ่มเซ็นเซอร์ระดับแสงอย่างง่าย เพื่อให้ไฟทำงานเมื่อห้องมืดจริงเท่านั้น -- หลีกเลี่ยงการกระตุ้นที่ไม่จำเป็นในเวลากลางวัน

การเดินสายไฟ

  • โมดูล PIR VCC → ESP32-C3 SuperMini 5V (VBUS) — โมดูล PIR ส่วนใหญ่ต้องการ 5V; ตรวจสอบช่วงพิกัดของโมดูลเฉพาะของคุณ
  • โมดูล PIR GND → ESP32-C3 SuperMini GND
  • โมดูล PIR OUT → ESP32-C3 SuperMini GPIO4 — อินพุตดิจิทัล, เป็น HIGH เมื่อมีการเคลื่อนไหว
  • แหล่งจ่ายไฟ DC ภายนอก (เช่น 9–12V) → LM2596 IN+ / IN− (ข้ามส่วนนี้หากจ่ายไฟทุกอย่างจาก 5V อยู่แล้ว — ดูหมายเหตุ)
  • LM2596 OUT+ → WS2812B strip 5V input
  • LM2596 OUT− → WS2812B strip GND, ต่อเข้ากับ ESP32-C3 GND (กราวด์ร่วมกันสำหรับแหล่งจ่ายไฟทั้งหมด)
  • WS2812B DIN → ESP32-C3 SuperMini GPIO5, ผ่านตัวต้านทานอนุกรม ~330–470Ω — ลดการสะท้อน/ป้องกัน LED ตัวแรก
  • (ตัวเลือก) ตัวเก็บประจุอิเล็กโทรไลต์ขนาดใหญ่ (≥100–1000µF) ต่อคร่อม strip 5V/GND ที่ปลาย strip — ดูดซับกระแสไฟกระชากขณะเปิดเครื่องของ strip

ก่อนเชื่อมต่อแถบ LED ให้จ่ายไฟให้ LM2596 เพียงอย่างเดียวและปรับโพเทนชิออมิเตอร์บนบอร์ดในขณะที่วัดเอาต์พุตด้วยมัลติมิเตอร์จนกว่าจะได้ค่า 5.0V ที่สะอาดตา — การจ่ายแรงดันไฟฟ้าที่สูงขึ้นโดยไม่ได้ปรับให้กับแถบ LED จะทำให้แถบ LED เสียหายได้ ระวังงบประมาณกระแสไฟ: LED WS2812B จำนวน 30 ดวงที่สีขาวเต็มรูปแบบสามารถดึงกระแสไฟได้ถึง ~1.8A ซึ่งเกินกว่าที่พิน 5V/USB ของ ESP32-C3 จะจ่ายได้อย่างปลอดภัย ดังนั้นให้ใช้ LM2596 (หรือแหล่งจ่ายไฟ 5V ภายนอก) สำหรับแถบ LED และอย่าจ่ายไฟให้แถบ LED จากตัวควบคุมของ SuperMini สัญญาณข้อมูล 3.3V ของ ESP32 ที่ขับ WS2812B ลอจิก 5V ทำงานได้อย่างน่าเชื่อถือบนแถบสั้นๆ ในการสร้างส่วนใหญ่; หากคุณเห็นการกะพริบหรือสีผิดพลาดบนพิกเซลแรก ให้เพิ่ม 74HCT125/ตัวแปลงระดับระหว่าง GPIO5 และ DIN

แผนภาพการต่อสาย

VCC → 5V GND OUT → GPIO4 IN− OUT+ → input OUT− → GND DIN → GPIO5 ESP32-C3 SuperMini PIR module WS2812B LM2596 External DC supply

โค้ดเริ่มต้น

#include <Adafruit_NeoPixel.h>

#define PIR_PIN 4
#define LED_DATA_PIN 5
#define NUM_LEDS 30

// How long to keep the light on after the last motion pulse
const unsigned long HOLD_TIME_MS = 30000;

Adafruit_NeoPixel strip(NUM_LEDS, LED_DATA_PIN, NEO_GRB + NEO_KHZ800);

bool lightsOn = false;
unsigned long lastMotionTime = 0;

void setLights(bool on) {
  uint32_t color = on ? strip.Color(255, 214, 170) : strip.Color(0, 0, 0); // warm white / off
  for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, color);
  }
  strip.show();
  lightsOn = on;
}

void setup() {
  Serial.begin(115200);
  pinMode(PIR_PIN, INPUT);

  strip.begin();
  strip.setBrightness(180);
  setLights(false);

  // Many PIR modules need 30-60s to calibrate ambient IR after power-up
  Serial.println("Warming up PIR...");
  delay(30000);
  Serial.println("Ready.");
}

void loop() {
  if (digitalRead(PIR_PIN) == HIGH) {
    lastMotionTime = millis();
    if (!lightsOn) {
      Serial.println("Motion detected — lights on");
      setLights(true);
    }
  }

  if (lightsOn && (millis() - lastMotionTime > HOLD_TIME_MS)) {
    Serial.println("Timeout — lights off");
    setLights(false);
  }
}

ไม่แน่ใจขั้นตอนไหน? ถามเรา