ผู้เริ่มต้น
สร้างระบบเตือนระยะห่าง เซ็นเซอร์ ระบบอัตโนมัติ
เซ็นเซอร์อัลตราโซนิกจริงและเสียงบี๊บ - ชี้ไปที่บางสิ่งและรับการเตือนด้วยเสียงเมื่อเข้าใกล้มากขึ้น
รวมชิ้นส่วนจริง 6 รายการ
ราคารวมชุดนี้: 1,575.00 ฿
เพิ่มอุปกรณ์ทั้งหมดลงตะกร้า ยังไม่รวมส่วนลดคำสั่งซื้อที่คุณอาจได้รับตอนชำระเงิน
รวมอยู่ในชุดคิท: สร้างโปรเจกต์นี้และอีกหลายโปรเจกต์
โปรเจกต์นี้รวมอยู่ใน ชุด ESP32 ระดับ Starter — 5 โปรเจกต์จริง ราคา 2,210.00 ฿ ชุดเดียวมีชิ้นส่วนสำหรับหลายโปรเจกต์ ไม่ต้องจ่ายทีละโปรเจกต์
ดู ชุด ESP32 ระดับ Starter — 5 โปรเจกต์จริง
สิ่งที่คุณต้องใช้
เป้าหมายของโครงการ โครงการนี้จับคู่เซ็นเซอร์วัดระยะทางแบบอัลตราโซนิกกับออดเพื่อสร้างสัญญาณเตือนความใกล้เคียงแบบง่ายๆ เพียงแค่เล็งไปที่วัตถุแล้วคุณจะได้รับการเตือนด้วยเสียงที่เร่งด่วนขึ้นเมื่อวัตถุเข้ามาใกล้ขึ้น นี่เป็นโครงการเซ็นเซอร์ที่ดีสำหรับผู้เริ่มต้น เพราะทั้งเซ็นเซอร์และเอาต์พุตเป็นแบบดิจิทัลและง่ายต่อการทำความเข้าใจ
ตัวควบคุมทำอะไร ตัวควบคุมจะกระตุ้นการวัดระยะทางซ้ำๆ อ่านผลลัพธ์ เปรียบเทียบกับเกณฑ์ และตัดสินใจว่าจะส่งเสียงออดหรือไม่ ซึ่งเป็นวงจรการอ่าน-ตัดสินใจ-ดำเนินการแบบเดียวกับที่โครงการที่ใช้เซ็นเซอร์ส่วนใหญ่ใช้ เพียงแต่มีเซ็นเซอร์เดียวและเอาต์พุตเดียว
เซ็นเซอร์อัลตราโซนิกทำอะไร 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
}
ไม่แน่ใจขั้นตอนไหน?
ถามเรา