RAYAC.IR
پروژه آموزشی الکترونیک و اینترنت اشیا

ساخت دزدگیر سخنگو با چند قطعه ساده

در این پروژه با استفاده از D1 Mini، سنسور PIR و ماژول صوتی DY-SV17F یک دزدگیر سخنگو می‌سازیم که با تشخیص حرکت فایل صوتی را پخش می‌کند و از طریق وب‌سرور ESP8266 قابل کنترل و تنظیم است.

این پروژه چیست؟

هدف این پروژه ساخت یک دزدگیر کوچک و قابل توسعه است که داخل قاب چراغ توکار یا یک محفظه مشابه قرار می‌گیرد. سنسور PIR حرکت را تشخیص می‌دهد، D1 Mini بر اساس تنظیمات تصمیم می‌گیرد و DY-SV17F فایل صوتی موردنظر را از اسپیکر پخش می‌کند.

قسمت اول: معرفی قطعات و قیمت‌ها.
قسمت دوم: مونتاژ، سیم‌کشی، برنامه‌نویسی و راه‌اندازی.

قطعات مورد نیاز

D1 Mini ESP8266

D1 Mini ESP8266

کنترلر اصلی و میزبان وب‌سرور پروژه

590.000 تومان خرید D1 Mini
سنسور حرکتی PIR

سنسور حرکتی PIR

تشخیص حرکت انسان در محدوده سنسور

190.000 تومان خرید سنسور
اسپیکر 8 اهم نیم وات

اسپیکر 8Ω / 0.5W

خروجی صوتی داخلی برای پخش هشدار

110.000 تومان خرید اسپیکر

سیم‌کشی پروژه

توجه: این جدول برای پیکربندی پیشنهادی این پروژه است. در نسخه‌های مختلف DY-SV17F ممکن است نام‌گذاری یا پیکربندی پایه‌های حالت کاری متفاوت باشد؛ قبل از اتصال تغذیه، نوشته‌های روی برد خودتان را با این راهنما تطبیق دهید.

۱) سنسور PIR به D1 Mini

سنسور PIRD1 Miniوظیفه
VCC5Vتغذیه سنسور
GNDGمنفی مشترک
OUTD5 / GPIO14سیگنال تشخیص حرکت

۲) DY-SV17F به D1 Mini در حالت UART

DY-SV17FD1 Miniوظیفه
V55Vتغذیه ماژول صوتی
GNDGمنفی مشترک
RX / IO1D7 / GPIO13دریافت فرمان از ESP8266
TX / IO0D6 / GPIO12ارسال وضعیت از پلیر به ESP8266

۳) تنظیم پایه‌های CON

برای استفاده از UART، در پیکربندی رایج این ماژول، حالت UART با CON3=1، CON2=0 و CON1=0 انتخاب می‌شود. در برخی بردها این حالت با مقاومت‌های 10kΩ تنظیم می‌شود؛ دقیقاً طبق نسخه برد خودتان عمل کنید.

پایهسطحتنظیم
CON1LOWاتصال به GND از طریق 10kΩ
CON2LOWاتصال به GND از طریق 10kΩ
CON3HIGHاتصال به 3.3V از طریق 10kΩ

۴) اسپیکر

اسپیکرDY-SV17F
+SPK+
−SPK−
PIRتشخیص حرکت
D1 MiniESP8266 + Web Server
DY-SV17Fپخش فایل صوتی
هشدار: خروجی SPK+ و SPK− خروجی تقویت‌شده هستند؛ آن‌ها را به GND یا ورودی آمپلی‌فایر بدون بررسی مشخصات وصل نکنید. برای این پروژه اسپیکر را مستقیماً به SPK+ و SPK− متصل کنید.

آماده‌سازی فایل‌های صوتی

فایل‌های صوتی را با نام‌های عددی پنج‌رقمی در حافظه ماژول قرار دهید. شماره ترک در فرمان UART بر اساس ترتیب ذخیره/شماره ترک ماژول استفاده می‌شود.

00001.mp3
00002.mp3
00003.mp3
00004.mp3
00005.mp3
00006.mp3
00007.mp3
00008.mp3
00009.mp3
00010.mp3
مثال: فایل 00001.mp3 می‌تواند پیام «لطفاً از این قسمت دور شوید» باشد و با تشخیص حرکت پخش شود. فایل‌های 2 تا 10 را می‌توان برای سناریوهای مختلف تعریف کرد.

منطق عملکرد دستگاه

۱
تشخیص حرکت
سنسور PIR خروجی خود را HIGH می‌کند و D1 Mini این تغییر را روی D5 دریافت می‌کند.
۲
بررسی وضعیت سیستم
ESP8266 بررسی می‌کند که دزدگیر از طریق Web Server فعال باشد.
۳
ارسال فرمان UART
D1 Mini فرمان پخش شماره ترک انتخاب‌شده را با سرعت 9600bps به DY-SV17F می‌فرستد.
۴
پخش هشدار
DY-SV17F فایل صوتی را از اسپیکر پخش می‌کند.
۵
کنترل از طریق Wi‑Fi
کاربر می‌تواند از صفحه وب دستگاه، سیستم را فعال/غیرفعال و شماره فایل هشدار را تغییر دهد.

کدنویسی D1 Mini

نمونه زیر یک وب‌سرور ساده روی ESP8266 ایجاد می‌کند. با فعال بودن سیستم، تشخیص حرکت روی D5 باعث پخش ترک انتخاب‌شده می‌شود. از صفحه وب نیز می‌توان سیستم را روشن/خاموش کرد، ترک را تغییر داد و به صورت دستی فرمان پخش یا توقف داد.

کتابخانه‌های مورد نیاز Arduino IDE: ESP8266WiFi، ESP8266WebServer و SoftwareSerial. در Arduino IDE برد LOLIN(WEMOS) D1 & mini را انتخاب کنید.
alarm_d1_mini.ino
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <SoftwareSerial.h>

// ---------- Wi-Fi ----------
const char* WIFI_SSID = "YOUR_WIFI_NAME";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";

// ---------- Pins ----------
#define PIR_PIN D5

// D6 = RX of ESP8266  <-- TX/IO0 of DY-SV17F
// D7 = TX of ESP8266  --> RX/IO1 of DY-SV17F
#define PLAYER_RX D6
#define PLAYER_TX D7

SoftwareSerial playerSerial(PLAYER_RX, PLAYER_TX);
ESP8266WebServer server(80);

// ---------- Settings ----------
bool alarmEnabled = true;
uint16_t selectedTrack = 1;

bool lastPirState = LOW;
unsigned long lastTrigger = 0;
const unsigned long triggerLockout = 5000;

// ---------- DY-SV17F UART ----------
void sendPlayerCommand(uint8_t command) {
  uint8_t packet[] = {0xAA, command, 0x00, 0x00};

  // For commands without data:
  // checksum = sum of AA + CMD + LEN
  uint8_t checksum = 0xAA + command + 0x00;

  playerSerial.write(0xAA);
  playerSerial.write(command);
  playerSerial.write(0x00);
  playerSerial.write(checksum);
  playerSerial.flush();
}

void playTrack(uint16_t track) {
  if (track == 0) track = 1;

  uint8_t highByte = (track >> 8) & 0xFF;
  uint8_t lowByte  = track & 0xFF;

  uint8_t checksum =
      0xAA + 0x07 + 0x02 + highByte + lowByte;

  playerSerial.write(0xAA);
  playerSerial.write(0x07);
  playerSerial.write(0x02);
  playerSerial.write(highByte);
  playerSerial.write(lowByte);
  playerSerial.write(checksum);
  playerSerial.flush();
}

void stopPlayer() {
  // DY-SV17F STOP command: AA 04 00 AE
  playerSerial.write(0xAA);
  playerSerial.write(0x04);
  playerSerial.write(0x00);
  playerSerial.write(0xAE);
  playerSerial.flush();
}

// ---------- Web page ----------
String makePage() {
  String html;
  html.reserve(5000);

  html += F(R"rawliteral(





RAYAC Voice Alarm



دزدگیر سخنگو

وضعیت: )rawliteral"); html += alarmEnabled ? F("فعال") : F("غیرفعال"); html += F(R"rawliteral(
)rawliteral"); return html; } // ---------- Web handlers ---------- void handleRoot() { server.send(200, "text/html; charset=utf-8", makePage()); } void handleAlarm() { if (server.hasArg("state")) { alarmEnabled = server.arg("state") == "on"; } server.sendHeader("Location", "/"); server.send(303); } void handleTrack() { if (server.hasArg("n")) { int n = server.arg("n").toInt(); if (n >= 1 && n <= 10) selectedTrack = n; } server.sendHeader("Location", "/"); server.send(303); } void handlePlay() { playTrack(selectedTrack); server.sendHeader("Location", "/"); server.send(303); } void handleStop() { stopPlayer(); server.sendHeader("Location", "/"); server.send(303); } // ---------- Setup ---------- void setup() { pinMode(PIR_PIN, INPUT); Serial.begin(115200); playerSerial.begin(9600); delay(300); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASS); while (WiFi.status() != WL_CONNECTED) { delay(300); } server.on("/", handleRoot); server.on("/alarm", handleAlarm); server.on("/track", handleTrack); server.on("/play", handlePlay); server.on("/stop", handleStop); server.begin(); Serial.println(); Serial.print("Web Server: http://"); Serial.println(WiFi.localIP()); } // ---------- Loop ---------- void loop() { server.handleClient(); bool pirState = digitalRead(PIR_PIN); // Rising edge: LOW -> HIGH if (alarmEnabled && pirState == HIGH && lastPirState == LOW && millis() - lastTrigger > triggerLockout) { playTrack(selectedTrack); lastTrigger = millis(); } lastPirState = pirState; }
نکته فنی مهم: این کد نمونه اولیه است. قبل از استفاده نهایی، شماره ترک‌ها، حالت CON1/CON2/CON3 و ترتیب فایل‌های حافظه DY-SV17F را روی همان بردی که در اختیار دارید تست کنید.

قطعات این پروژه را از RAYAC تهیه کنید

پیشنهاد برای این بخش:با خرید پک کام ل قطعات میتونید از ارسال رایگان استفاده کنید. با ما تماس بگیرید -09330088778

ایده‌های توسعه پروژه

  • انتخاب فایل هشدار از طریق پنل وب
  • تنظیم ولوم از طریق Web Server
  • فعال و غیرفعال کردن دزدگیر از موبایل
  • نمایش وضعیت PIR و وضعیت پخش روی صفحه
  • افزودن چند سناریوی صوتی مختلف
  • ذخیره تنظیمات در حافظه ESP8266
  • قرار دادن مجموعه داخل قاب چراغ توکار برای ساخت یک محصول یکپارچه