Wemos d1 Mini ile Bisiklet Alarmı Yapımı

Bisikletinizi park ettiğinizde çalınmasından endişe ediyor musunuz? Artık bu endişelere son!
Bu yazıda, ESP8266 (Wemos D1 Mini) kullanarak geliştirdiğimiz, titreşim sensörü ve RF uzaktan kumanda ile kontrol edilen akıllı bir bisiklet alarm sistemi nasıl yapıldığını anlatıyoruz.
Üstelik, düşük enerji tüketimi için derin uyku (Deep Sleep) özelliği sayesinde pil ömrü de çok uzun!
Projenin Amacı
Geliştirdiğimiz bu sistem, bisikletinize yapılan en ufak bir titreşimi bile algılayarak alarmı devreye sokuyor.
Alarm aktifken:
-
3 kez titreşim algılanırsa, güçlü bir siren devreye giriyor.
-
RF uzaktan kumanda ile alarmı açıp kapatabiliyorsunuz.
-
Sistem, uzun süre kullanılmadığında otomatik olarak derin uyku moduna geçiyor ve pil tasarrufu sağlıyor.
Bu sayede bisikletinizi hırsızlara karşı etkin bir şekilde koruyabiliyor ve pil değişimi derdi yaşamıyorsunuz.
Kullanılan Donanım
-
ESP8266 Wemos D1 Mini (veya benzeri bir ESP8266 kartı)
-
Titreşim Sensörü (Vibration switch)
-
RF 433 MHz Alıcı ve Uzaktan Kumanda
-
Buzzer veya Mini Siren
-
LED’ler (Alarm açık/kapalı durumu için)
-
Güç kaynağı (Pil, Powerbank veya USB)
Sistem Nasıl Çalışıyor?
-
Alarm Açıkken:
Bisiklete yapılan her küçük sarsıntı, titreşim sensörü tarafından algılanır ve sayılır.
Eğer titreşim sayısı 3’e ulaşırsa, sistem sireni devreye sokar ve güçlü bir şekilde alarm verir. -
Alarmı Açma/Kapama:
RF uzaktan kumandadaki ON/OFF tuşları ile alarmı istediğiniz zaman açıp kapatabilirsiniz.
Her işlemde LED’ler üzerinden durum bildirimi yapılır. -
Pil Tasarrufu (Deep Sleep):
Alarm kapatıldıktan sonra 10 saniye boyunca yeni bir hareket algılanmazsa, ESP8266 otomatik olarak derin uyku moduna geçer.
Uyandırmak için RST (Reset) hattı kullanılır.
Teknik Ayrıntılar
-
Wi-Fi Kullanımı Kapatıldı:
Projede Wi-Fi kullanılmadığı için cihaz açılır açılmaz Wi-Fi tamamen kapatılır. Böylece gereksiz enerji tüketimi engellenir. -
EEPROM Kullanımı:
Alarm açık/kapalı durumu ve titreşim sayısı, ESP8266’nın EEPROM hafızasına kaydedilir.
Böylece cihaz beklenmedik bir şekilde yeniden başlasa bile (örneğin reset butonuna basıldığında), alarm kaldığı durumdan devam eder. -
Derin Uykuya Geçiş:
10 saniye boyunca alarm kapalı kaldıysa, ESP8266 derin uyku moduna geçer ve neredeyse sıfıra yakın enerji tüketir. -
Güvenlik ve Stabilite:
Derin uyku sonrası ESP8266’nın donması veya hata vermesi gibi problemleri engellemek için gerekli optimizasyonlar yapılmıştır.
Özel olarak seri haberleşme hızı (74880 baud) seçilmiştir.
Ayrıca hızlı reset durumlarına karşı koruma kodları eklenmiştir.
Neden Bu Sistemi Kullanmalısınız?
-
Düşük enerji tüketimi: Tek şarjla haftalarca kullanım!
-
Yüksek güvenlik: Titreşimi anında algılayarak hırsızlık girişimlerine karşı güçlü koruma.
-
Kolay kullanım: Tek tuşla alarmı açıp kapatma.
-
Basit kurulum: Birkaç temel bileşenle kolayca montaj yapılabilir.
-
Uygun maliyet: Piyasadaki hazır alarm sistemlerinden çok daha ekonomik.
Sonuç
Bu akıllı bisiklet alarmı projesi, hem yeni başlayanlar hem de ileri seviye kullanıcılar için harika bir güvenlik çözümüdür.
ESP8266’nın esnekliği sayesinde ileride bu sisteme GPS, IoT bağlantısı veya mobil bildirim gibi özellikler de eklemek mümkün!
Unutmayın, küçük önlemler büyük hırsızlıkların önüne geçebilir.
Siz de kendi bisikletinizi koruma altına almak istiyorsanız, bu projeyi mutlaka deneyin!
#include <Arduino.h>
#include <RCSwitch.h>
#include <EEPROM.h>
#include <ESP8266WiFi.h> // WiFi'yi devre dışı bırakmak için
// Sabit Pin Tanımlamaları
const int closeLed = 15; // D8 - Alarm kapalı LED
const int openLed = 13; // D7 - Alarm açık LED
const int vibration_Sensor = 4; // D2 - Titreşim sensörü
const int Alarm = 5; // D1 - Buzzer ve siren (aynı pin)
const int rfPin = 2; // D4 - RF alıcı pini
// RC Switch nesnesi (RF sinyalleri için)
RCSwitch mySwitch = RCSwitch();
// Sabit Tanımlar
#define ON HIGH
#define OFF LOW
// RF sinyalleri için değerler
const long rfAlarmOn = 14244580; // RF "ON" sinyali
const long rfAlarmOff = 14244577; // RF "OFF" sinyali
// Değişkenler
int alarm_active = 0; // Alarm açık mı kapalı mı (0/1)
int vibrationCount = 0; // Titreşim sayacı
unsigned long offTime = 0; // Alarm kapatma zamanı
bool goingToSleep = false; // Uykuya geçiş durumu
unsigned long previousMillis = 0; // Zamanlayıcı için değişken
const long interval = 10000; // 10 saniye süreyi geçince uykuya geç
void setup() {
delay(500); // Seri portun doğru açılması için bekleme
Serial.begin(74880); // Seri port hızı (deep sleep sonrası uyandırıldığında doğru okuma)
// WiFi'yi kapatıyoruz
WiFi.mode(WIFI_OFF); // WiFi tamamen kapatılıyor
WiFi.forceSleepBegin(); // WiFi radyosu uyutuluyor
EEPROM.begin(4); // Küçük EEPROM alanı başlatılıyor
// Pin modlarını ayarla
pinMode(vibration_Sensor, INPUT); // Titreşim sensörü giriş pini
pinMode(Alarm, OUTPUT); // Buzzer ve siren çıkış pini
pinMode(closeLed, OUTPUT); // Kapalı LED çıkış pini
pinMode(openLed, OUTPUT); // Açık LED çıkış pini
// Başlangıç durumu (LED'ler ve alarm)
digitalWrite(closeLed, HIGH); // Kapalı LED başta açık
digitalWrite(openLed, LOW); // Açık LED başta kapalı
digitalWrite(Alarm, OFF); // Buzzer kapalı
mySwitch.enableReceive(rfPin); // RF alıcı başlatılıyor
// EEPROM'dan alarm ve titreşim sayısını oku
alarm_active = EEPROM.read(0); // Alarm aktif mi?
vibrationCount = EEPROM.read(1); // Son titreşim sayısı
if (alarm_active == 1) { // Eğer alarm aktifse
Alarm_Ac(); // Alarm açılıyor
if (vibrationCount >= 3) { // Eğer titreşim sayısı 3 veya daha fazla ise
buzzer_on(); // Alarm (siren) sesi çalsın
} else {
buzzer_open_sound(); // Açılış sesi
}
} else {
Alarm_Kapat(); // Alarm kapalı
}
}
void loop() {
rfControl(); // RF kumanda kontrolünü yap
if (alarm_active == 1) { // Eğer alarm aktifse
if (digitalRead(vibration_Sensor) == HIGH) { // Titreşim algılandı mı?
vibrationCount++; // Titreşim sayısını arttır
Serial.print("Titreşim algılandı. Sayı: ");
Serial.println(vibrationCount);
if (vibrationCount == 1 || vibrationCount == 2) {
buzzer_open_sound(); // 1 veya 2 titreşimde kısa bip sesi
} else if (vibrationCount == 3) {
buzzer_on(); // 3. titreşimde siren sesi
updateVibrationCountInEEPROM();
}
delay(500); // Gereksiz tetiklemeleri önlemek için kısa bekleme
}
}
// Alarm kapalıysa ve uykuya geçiş için hazırlanıyorsa
if (!alarm_active && !goingToSleep) {
unsigned long currentMillis = millis();
if (offTime == 0) {
offTime = currentMillis; // Alarm kapatıldıktan sonra zamanı başlat
} else if (currentMillis - offTime >= interval) { // 10 saniye geçti mi?
goingToSleep = true;
Serial.println("Uykuya geçiliyor...");
sleepNow(); // Uykuya geçiş
}
}
}
// RF kumanda kontrolü (ON/OFF tuşları)
void rfControl() {
if (mySwitch.available()) { // Yeni RF sinyali var mı?
long value = mySwitch.getReceivedValue(); // Sinyali al
if (value == rfAlarmOn) { // "ON" tuşu
Serial.println("Alarm Açıldı");
alarm_active = 1; // Alarmı aktif yap
EEPROM.write(0, alarm_active);
EEPROM.commit(); // EEPROM'a kaydet
Alarm_Ac();
if (vibrationCount >= 3) {
buzzer_on(); // 3. titreşimde siren çalsın
} else {
buzzer_open_sound(); // Diğer durumlar için açılış sesi
}
}
else if (value == rfAlarmOff) { // "OFF" tuşu
Serial.println("Alarm Kapatıldı");
alarm_active = 0; // Alarmı kapat
EEPROM.write(0, alarm_active);
EEPROM.write(1, 0); // Titreşim sayacını sıfırla
EEPROM.commit();
Alarm_Kapat();
offTime = millis(); // Alarm kapatıldığında zamanı başlat
goingToSleep = false;
}
mySwitch.resetAvailable(); // RF verisi alındı, buffer'ı temizle
}
}
// Alarm açıldığında yapılan işlemler
void Alarm_Ac() {
digitalWrite(closeLed, LOW); // Kapalı LED söner
digitalWrite(openLed, HIGH); // Açık LED yanar
digitalWrite(Alarm, OFF); // Buzzer kapalı başlar
offTime = 0; // Uyku zamanını sıfırla
}
// Alarm kapatıldığında yapılan işlemler
void Alarm_Kapat() {
digitalWrite(openLed, LOW); // Açık LED söner
digitalWrite(closeLed, HIGH); // Kapalı LED yanar
digitalWrite(Alarm, OFF); // Buzzer kapalı
buzzer_close_sound(); // Alarm kapanış sesi
}
// Buzzer kısa bip sesi
void buzzer_open_sound() {
for (int i = 0; i < 2; i++) {
digitalWrite(Alarm, ON);
delay(100);
digitalWrite(Alarm, OFF);
delay(50);
}
}
// Buzzer sürekli açık (siren sesi)
void buzzer_on() {
digitalWrite(Alarm, ON);
}
// Buzzer uzun kapanış sesi
void buzzer_close_sound() {
digitalWrite(Alarm, ON);
delay(300);
digitalWrite(Alarm, OFF);
}
// Derin uyku moduna geçiş
void sleepNow() {
Serial.println("Deep Sleep Başladı");
delay(100); // Küçük bir gecikme ekleyin
ESP.deepSleep(0); // Sonsuz uyku (RST pin ile uyanır)
}
// EEPROM'dan titreşim sayacını güncelle
void updateVibrationCountInEEPROM() {
EEPROM.write(1, vibrationCount);
EEPROM.commit(); // EEPROM'a kaydet
}