#define BLYNK_TEMPLATE_ID "TMPL6-iE1Qn2X"
#define BLYNK_TEMPLATE_NAME "ESP32 Smart Alarm"
#define BLYNK_AUTH_TOKEN "kjlVOMv5E5KVqAFErFmFDjfwmlGi8cA-"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// Pin untuk Wokwi-ESP32
const int pirPin = 4; // Pin sensor PIR
const int ledPin = 2; // Pin LED
const int buzzerPin = 15; // Pin Buzzer
// Nada Pirates of the Caribbean
int piratesMelody[] = {
330, 392, 440, 440, 0, 440, 494, 523, 523, 0, 523, 587, 494, 494, 440, 392, 440,
330, 392, 440, 440, 0, 440, 494, 523, 523, 0, 523, 587, 494, 494, 440, 392, 440,
330, 392, 440, 440, 0, 440, 523, 587, 587, 0, 587, 659, 698, 698, 659, 587, 659, 440,
440, 494, 523, 523, 587, 659, 440, 0, 440, 440, 494, 494, 523, 494,
330, 392, 440, 440, 0, 440, 494, 523, 523, 0, 523, 587, 494, 494, 440, 392, 440,
330, 392, 440, 440, 0, 440, 494, 523, 523, 0, 523, 587, 494, 494, 440, 392, 440,
330, 392, 440, 440, 0, 440, 523, 587, 587, 0, 587, 659, 698, 698, 659, 587, 659, 440,
440, 494, 523, 523, 587, 659, 440, 0, 440, 494, 523, 523, 587, 659,
440, 494, 523, 523, 523, 587, 659, 494, 392, 330
};
int noteDurations[] = {
8, 8, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 8, 8, 4, 4, 4,
8, 8, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 8, 8, 4, 4, 4,
8, 8, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 8, 8, 4, 4, 4,
8, 8, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 8, 8,
8, 8, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 8, 8, 4, 4, 4,
8, 8, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 8, 8, 4, 4, 4,
8, 8, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 8, 8, 4, 4, 4,
8, 8, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 8, 8,
8, 8, 4, 4, 4, 4, 8, 4, 4, 4
};
// Blynk Auth Token dan WiFi Credentials
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = ""; // Kosongkan password untuk jaringan Wokwi
// Blynk Virtual Pins
const int virtualMotionDetectedPin = V0; // Virtual pin untuk menampilkan status di Blynk
const int virtualAlarmSwitchPin = V1; // Virtual pin untuk switch alarm
// Variabel global untuk status alarm
bool alarmEnabled = true;
bool melodyPlaying = false; // Status apakah melodi sedang dimainkan
void setup() {
Serial.begin(115200);
pinMode(pirPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// Menghubungkan ke WiFi
WiFi.begin(ssid, pass);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Connected to WiFi!");
// Menghubungkan ke Blynk
Blynk.config(auth);
while (!Blynk.connected()) {
Blynk.run();
delay(100);
}
Serial.println(" Connected to Blynk!");
Blynk.syncVirtual(virtualAlarmSwitchPin); // Sync status alarm switch
}
void playPiratesMelody() {
melodyPlaying = true;
for (int thisNote = 0; thisNote < sizeof(piratesMelody) / sizeof(piratesMelody[0]); thisNote++) {
int noteDuration = 300 / noteDurations[thisNote];
tone(buzzerPin, piratesMelody[thisNote], noteDuration);
digitalWrite(ledPin, HIGH);
delay(noteDuration);
digitalWrite(ledPin, LOW);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
}
melodyPlaying = false; // Setelah melodi selesai, matikan status
}
void loop() {
Blynk.run();
int pirValue = digitalRead(pirPin);
if (pirValue == HIGH && alarmEnabled && !melodyPlaying) {
Serial.println("Motion Detected! Alarm Triggered.");
playPiratesMelody();
Blynk.virtualWrite(virtualMotionDetectedPin, "Motion Detected! Alarm ON");
Blynk.virtualWrite(virtualAlarmSwitchPin, 1); // Set alarm switch to ON
} else if (pirValue == LOW && alarmEnabled && !melodyPlaying) {
Serial.println("No Motion Detected.");
Blynk.virtualWrite(virtualMotionDetectedPin, "No Motion");
}
// Memastikan alarm berhenti setelah melodi selesai
if (!melodyPlaying) {
digitalWrite(ledPin, LOW); // Matikan LED setelah melodi selesai
noTone(buzzerPin); // Matikan buzzer setelah melodi selesai
Blynk.virtualWrite(virtualMotionDetectedPin, "No Motion");
Blynk.virtualWrite(virtualAlarmSwitchPin, 0); // Set alarm switch to OFF
}
delay(200);
}
// Fungsi BLYNK_WRITE untuk menerima data dari Blynk
BLYNK_WRITE(V1) {
alarmEnabled = param.asInt(); // Mengatur status alarm berdasarkan nilai switch
if (alarmEnabled) {
Serial.println("Alarm Enabled");
} else {
Serial.println("Alarm Disabled");
}
}