Breadboard with HC-SR04 ultrasonic sensor, buzzer and ESP32-C3 mounted near a doorway

ผู้เริ่มต้น

สร้างระบบเตือนระยะห่าง

เซ็นเซอร์ระบบอัตโนมัติ

เซ็นเซอร์อัลตราโซนิกจริงและเสียงบี๊บ - ชี้ไปที่บางสิ่งและรับการเตือนด้วยเสียงเมื่อเข้าใกล้มากขึ้น

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

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

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

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

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

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

ตัวควบคุมทำอะไร

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

เซ็นเซอร์อัลตราโซนิกทำอะไร

HC-SR04 วัดระยะทางโดยการส่งพัลส์อัลตราโซนิกสั้นๆ บนขา Trigger และจับเวลาว่าขา Echo คงสถานะ High นานแค่ไหนในขณะที่พัลส์เดินทางออกไปและสะท้อนกลับ เมื่อรวมกับความเร็วเสียงที่ทราบแล้ว การจับเวลานั้นจะแปลงเป็นระยะทางได้โดยตรง โดยตัวเซ็นเซอร์เองไม่ได้รายงานค่าระยะทาง แต่ตัวควบคุมจะคำนวณจากเวลาที่จับได้

ออดทำอะไร

ออดแบบ Active เป็นเอาต์พุตที่ง่ายที่สุดในที่นี้: มันจะส่งเสียงตราบเท่าที่ตัวควบคุมรักษาขาควบคุมไว้ที่สถานะ High และจะเงียบเมื่อไม่มีการควบคุม ตรรกะการเตือนทั้งหมด (ควรกำลังส่งเสียงอยู่หรือไม่?) อยู่ในโค้ดของตัวควบคุมทั้งหมด

ความเข้ากันได้ของแรงดันไฟฟ้าของเซ็นเซอร์

ก่อนที่จะทำการเดินสายใดๆ ให้ยืนยันแรงดันไฟฟ้าลอจิกของเซ็นเซอร์เทียบกับสิ่งที่ตัวควบคุมของคุณจัดหาให้ นี่เป็นปัญหาเฉพาะที่เกิดขึ้นจริงกับบอร์ด HC-SR04: บางตัวออกแบบมาสำหรับลอจิก 5V และการใช้งานโดยตรงกับขาควบคุม 3.3V โดยไม่มีตัวแปลงระดับ (level shifter) หรือตัวแบ่งแรงดัน (voltage divider) อาจทำให้การอ่านค่าไม่น่าเชื่อถือ หรือในบางกรณี อาจทำให้ขาอินพุตของตัวควบคุมเสียหายได้ ตรวจสอบเอกสารประกอบของบอร์ดของคุณโดยเฉพาะแทนที่จะคาดเดาเอาเอง

แนวคิดซอฟต์แวร์และไลบรารี

ไลบรารี HC-SR04 ส่วนใหญ่จัดการการจับเวลา Trigger/Echo ให้คุณ และส่งค่าระยะทางกลับมาโดยตรง ดังนั้นคุณไม่จำเป็นต้องเขียนการคำนวณการจับเวลาพัลส์ด้วยตัวเอง ยืนยันว่าคุณได้รับการอ่านค่าที่ถูกต้องและทำซ้ำได้ด้วยตัวเอง ก่อนที่จะเพิ่มตรรกะเกณฑ์ของออดเข้าไป

การทดสอบและการแก้ไขปัญหา

  • ไม่มีการอ่านค่าระยะทางเลย — ตรวจสอบการเดินสาย Trigger และ Echo ก่อน และยืนยันว่าแรงดันไฟฟ้าลอจิกของเซ็นเซอร์ตรงกับสิ่งที่ตัวควบคุมของคุณให้มาที่ขานั้น
  • ระยะทางอ่านได้ใกล้ศูนย์เสมอ — เซ็นเซอร์น่าจะหันหน้าเข้าหาสิ่งที่อยู่ใกล้เกินไป หรือมีสิ่งกีดขวางอยู่หน้าเซ็นเซอร์ที่ขวางพัลส์
  • ออดไม่ทำงานเลยแม้ว่าจะมีการอ่านค่าที่ถูกต้อง — ตรวจสอบค่าเกณฑ์และตรรกะการเปรียบเทียบในโค้ดของคุณก่อนที่จะคิดว่าเป็นปัญหาการเดินสาย หากตั้งค่าเกณฑ์ต่ำกว่าระยะทางที่คุณกำลังทดสอบจริง มันก็จะไม่ทำงานเลย
  • การอ่านค่ากระโดดไปมาโดยไม่คาดคิด — พื้นผิวที่อ่อนนุ่มหรือทำมุมอาจทำให้พัลส์อัลตราโซนิกกระจายและสร้างเสียงสะท้อนที่ไม่สอดคล้องกัน ให้ทดสอบกับพื้นผิวที่เรียบและแข็งก่อนเพื่อยืนยันว่าตัวเซ็นเซอร์ทำงานได้ถูกต้อง

การอัปเกรดเสริมในอนาคต: สัญญาณเตือนระยะทางหลายโซน

เมื่อเซ็นเซอร์และออดตัวเดียวทำงานได้อย่างน่าเชื่อถือแล้ว การขยายที่เป็นธรรมชาติคือการเพิ่ม HC-SR04 ตัวที่สองที่ชี้ไปในทิศทางที่แตกต่างกัน และให้แต่ละโซนมีเสียงเตือนหรือรูปแบบเฉพาะของตัวเอง ซึ่งจะเปลี่ยนสัญญาณเตือนทิศทางเดียวให้กลายเป็นความตระหนักรู้เชิงพื้นที่พื้นฐาน

การเดินสาย

  • HC-SR04 VCC → ESP32-C3 SuperMini 5V — เซ็นเซอร์ต้องการ 5V ไม่ใช่ 3.3V เพื่อขับเคลื่อนตัวแปลงสัญญาณอัลตราโซนิก
  • HC-SR04 GND → ESP32-C3 SuperMini GND
  • HC-SR04 TRIG → GPIO4 (`TRIG_PIN`) — เอาต์พุตดิจิทัล การเชื่อมต่อโดยตรงนั้นใช้ได้ (Trigger 3.3V อยู่เหนือเกณฑ์ลอจิกของเซ็นเซอร์มาก)
  • HC-SR04 ECHO → ตัวต้านทาน 1kΩ → GPIO5 (`ECHO_PIN`) โดยมีตัวต้านทาน 2kΩ จากจุดเชื่อมต่อเดียวกันนั้นไปยัง GND — ECHO เป็นสัญญาณ 5V และขา ESP32 ทนได้เพียง 3.3V เท่านั้น ดังนั้นจึงต้องใช้ตัวแบ่งนี้เพื่อหลีกเลี่ยงความเสียหายต่อขา
  • สัญญาณออดแบบ Active/+ → GPIO6 (`BUZZER_PIN`)
  • ออดแบบ Active GND → ESP32-C3 SuperMini GND

สร้างตัวแบ่งแรงดันบนเบรดบอร์ดก่อนที่จะเชื่อมต่อ ECHO กับ ESP32 — ห้ามเดินสาย ECHO ตรงไปยัง GPIO จ่ายไฟให้ HC-SR04 จาก 5V (USB VBUS) ในขณะที่ส่วนอื่นๆ สามารถใช้ราง 3.3V ของ ESP32-C3 และ GND ทั่วไปได้ ทดสอบด้วย `Serial.println` ก่อนเพื่อยืนยันการอ่านค่าระยะทางที่ถูกต้องก่อนที่จะเชื่อถือการจับเวลาของออด

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

VCC → 5V GND TRIG → GPIO4 ECHO GPIO5 signal/+ → GPIO6 GND ESP32-C3 SuperMini HC-SR04 1kΩ resistor Active Buzzer

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

#include <Arduino.h>

#define TRIG_PIN 4     // HC-SR04 TRIG - any digital output GPIO, adjust to match your wiring
#define ECHO_PIN 5     // HC-SR04 ECHO (via voltage divider) - any digital input GPIO
#define BUZZER_PIN 6   // Active buzzer signal - any digital output GPIO

const int MIN_DISTANCE_CM = 3;         // closer than this = fastest beep rate
const int MAX_DISTANCE_CM = 100;       // farther than this = no beeping
const int MIN_BEEP_INTERVAL_MS = 60;   // fastest beep rate (object very close)
const int MAX_BEEP_INTERVAL_MS = 800;  // slowest beep rate (object far away)

unsigned long lastToggle = 0;
bool buzzerOn = false;
int currentInterval = -1; // -1 = silent (nothing in range)

long readDistanceCm() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  long duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30ms timeout, ~5m max range
  if (duration == 0) return -1; // no echo received (out of range / no object)

  return duration / 58; // speed-of-sound conversion: microseconds -> cm
}

void setup() {
  Serial.begin(115200);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW);
}

void loop() {
  long distance = readDistanceCm();

  if (distance > 0 && distance <= MAX_DISTANCE_CM) {
    long clamped = constrain(distance, MIN_DISTANCE_CM, MAX_DISTANCE_CM);
    currentInterval = map(clamped, MIN_DISTANCE_CM, MAX_DISTANCE_CM, MIN_BEEP_INTERVAL_MS, MAX_BEEP_INTERVAL_MS);
    Serial.printf("Distance: %ld cm | Beep interval: %d ms\n", distance, currentInterval);
  } else {
    currentInterval = -1; // no object in range, stay silent
  }

  unsigned long now = millis();
  if (currentInterval < 0) {
    digitalWrite(BUZZER_PIN, LOW);
    buzzerOn = false;
  } else if (now - lastToggle >= (unsigned long)currentInterval) {
    buzzerOn = !buzzerOn;
    digitalWrite(BUZZER_PIN, buzzerOn ? HIGH : LOW);
    lastToggle = now;
  }

  delay(20); // small pacing delay between HC-SR04 pings
}

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