این پروژه چیست؟
هدف این پروژه ساخت یک دزدگیر کوچک و قابل توسعه است که داخل قاب چراغ توکار یا یک محفظه مشابه قرار میگیرد. سنسور PIR حرکت را تشخیص میدهد، D1 Mini بر اساس تنظیمات تصمیم میگیرد و DY-SV17F فایل صوتی موردنظر را از اسپیکر پخش میکند.
قسمت دوم: مونتاژ، سیمکشی، برنامهنویسی و راهاندازی.
قطعات مورد نیاز
سیمکشی پروژه
۱) سنسور PIR به D1 Mini
| سنسور PIR | D1 Mini | وظیفه |
|---|---|---|
| VCC | 5V | تغذیه سنسور |
| GND | G | منفی مشترک |
| OUT | D5 / GPIO14 | سیگنال تشخیص حرکت |
۲) DY-SV17F به D1 Mini در حالت UART
| DY-SV17F | D1 Mini | وظیفه |
|---|---|---|
| V5 | 5V | تغذیه ماژول صوتی |
| GND | G | منفی مشترک |
| RX / IO1 | D7 / GPIO13 | دریافت فرمان از ESP8266 |
| TX / IO0 | D6 / GPIO12 | ارسال وضعیت از پلیر به ESP8266 |
۳) تنظیم پایههای CON
برای استفاده از UART، در پیکربندی رایج این ماژول، حالت UART با
CON3=1، CON2=0 و
CON1=0 انتخاب میشود. در برخی بردها این حالت با
مقاومتهای 10kΩ تنظیم میشود؛ دقیقاً طبق نسخه برد خودتان عمل کنید.
| پایه | سطح | تنظیم |
|---|---|---|
| CON1 | LOW | اتصال به GND از طریق 10kΩ |
| CON2 | LOW | اتصال به GND از طریق 10kΩ |
| CON3 | HIGH | اتصال به 3.3V از طریق 10kΩ |
۴) اسپیکر
| اسپیکر | DY-SV17F |
|---|---|
| + | SPK+ |
| − | SPK− |
آمادهسازی فایلهای صوتی
فایلهای صوتی را با نامهای عددی پنجرقمی در حافظه ماژول قرار دهید. شماره ترک در فرمان UART بر اساس ترتیب ذخیره/شماره ترک ماژول استفاده میشود.
00001.mp3 میتواند پیام
«لطفاً از این قسمت دور شوید» باشد و با تشخیص حرکت پخش شود.
فایلهای 2 تا 10 را میتوان برای سناریوهای مختلف تعریف کرد.
منطق عملکرد دستگاه
سنسور PIR خروجی خود را HIGH میکند و D1 Mini این تغییر را روی D5 دریافت میکند.
ESP8266 بررسی میکند که دزدگیر از طریق Web Server فعال باشد.
D1 Mini فرمان پخش شماره ترک انتخابشده را با سرعت 9600bps به DY-SV17F میفرستد.
DY-SV17F فایل صوتی را از اسپیکر پخش میکند.
کاربر میتواند از صفحه وب دستگاه، سیستم را فعال/غیرفعال و شماره فایل هشدار را تغییر دهد.
کدنویسی D1 Mini
نمونه زیر یک وبسرور ساده روی ESP8266 ایجاد میکند. با فعال بودن سیستم، تشخیص حرکت روی D5 باعث پخش ترک انتخابشده میشود. از صفحه وب نیز میتوان سیستم را روشن/خاموش کرد، ترک را تغییر داد و به صورت دستی فرمان پخش یا توقف داد.
#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");
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;
}
قطعات این پروژه را از RAYAC تهیه کنید
پیشنهاد برای این بخش:با خرید پک کام ل قطعات میتونید از ارسال رایگان استفاده کنید. با ما تماس بگیرید -09330088778
ایدههای توسعه پروژه
- انتخاب فایل هشدار از طریق پنل وب
- تنظیم ولوم از طریق Web Server
- فعال و غیرفعال کردن دزدگیر از موبایل
- نمایش وضعیت PIR و وضعیت پخش روی صفحه
- افزودن چند سناریوی صوتی مختلف
- ذخیره تنظیمات در حافظه ESP8266
- قرار دادن مجموعه داخل قاب چراغ توکار برای ساخت یک محصول یکپارچه