Bu adım adım öğreticide, Wio Terminal’inizle kendi Arduino Akıllı Zil’inizi nasıl oluşturacağınızı öğrenin! Bu proje, hareket varlığını otomatik olarak tespit eden ve sizi mobil telefonunuzda nerede olursanız olun bilgilendiren bir kapı zili inşa eder. Ayrıca, herhangi bir Arduino uyumlu geliştirme kartıyla da takip edebilirsiniz.

Akıllı Zil Projesine Giriş
Geleneksel bir zil yerine akıllı bir zil istemeniz için birçok neden olabilir. Örneğin, evinizde bir bebek varsa ve her ziyaretçi geldiğinde köpeğinizin havlamasını istemiyorsanız. Ya da evde olmadığınızda ziyaretçilerin geldiğini bilmek isteyebilirsiniz!
Her ne olursa olsun, Arduino akıllı zilimizin iki ana şeyi yapabilmesini istiyoruz:
- Otomatik olarak insan varlığını tespit etmek
- Kullanıcıyı bu varlıktan haberdar etmek
Bunu başarmak için, hareketi tespit etmek üzere pasif kızılötesi sensörlerden yararlanacağız. IoT tarafında, Microsoft Azure IoT ve Google Cloud Platform gibi kullanabileceğimiz birçok platform var. Ancak bazı denemelerden sonra, bu proje için Blynk’i kullanmaya karar verdim çünkü kurulumu kolay ve ayrıca hemen özelleştirilebilir bir mobil uygulama arayüzü sağlıyor!
Pasif Kızılötesi (PIR) Hareket Sensörleri
PIR sensörleri bu projenin merkezinde olduğu için, nasıl çalıştıklarını anlamak için biraz zaman ayırmakta fayda var.

Kızılötesi Işık
Öncelikle, kızılötesi ışık, insan gözüne görünmeyen bir ışık türüdür. IR, etrafımızda, ısı yayan tüm canlılar tarafından yayılan bir ışık türüdür. Ayrıca, iletişim sinyalleri göndermek ve termal görüntüleme gibi birçok elektronik uygulamada da kullanılır.
PIR Sensor: Çalışma Prensibi
Bir PIR sensörü, her biri IR hassas malzeme içeren iki yarıktan oluşur.
Kızılötesi yayan bir cisim, örneğin bir insan, geçtiğinde, önce IR yarıklarından birini keser, bu da diğer IR yarığına göre pozitif bir diferansiyel oluşturur. İnsan daha sonra tespit alanından ayrıldığında, tersine bir durum oluşur ve negatif bir diferansiyel yaratılır. Ortaya çıkan sinyal, “YÜKSEK” bir çıkış üretmek için topluca tespit edilir.
PIR sensörümüzde pozitif bir çıkış üreten şeyin değişim olduğunu anlamak önemlidir. Eğer bir kızılötesi yayan cisim tespit alanında sabit kalırsa, PIR sensörümüz sonunda “DÜŞÜK” bir çıkış verir!
Genellikle, PIR sensörleri Fresnel lens olarak bilinen bir lensle kaplanır. Bu lens, çevreden gelen IR dalgalarını sensöre odaklar. Artık, iki blokluk bir tespit alanı yerine çok daha geniş bir alanı kapsayabiliriz!
Wio Terminal’i Blynk ile Çevrimiçi Hale Getirmek
Wio Terminal’imiz PIR Sensörü aracılığıyla hareket tespit ettiğinde, bunun için uzaktan bir bildirim almak istiyoruz. Bunu yapmak için Blynk’i kullanacağız.
Blynk, hangi donanımı kullandığımızdan bağımsız olarak IoT uygulamaları hızlı bir şekilde oluşturmamıza olanak tanıyan bir IoT platformudur. Ayrıca, cihaz yönetimi, veri analitiği ve makine öğrenimi için de kullanılabilir, ancak bugün sadece Wio Terminal’imizden mesaj almak ve bazı ayarları uzaktan değiştirmek için kullanacağız.

Blynk, büyük ölçekli IoT uygulamaları uygulamak isteyen işletmelere maliyet getirecek olsa da, bireysel kullanım için kişisel projeler oluşturmak amacıyla geliştirici planı ücretsizdir ve bugünün amacı için yeterlidir.
Platform Tanıtımı: Wio Terminal
Bugünkü öğretici, bir Wio Terminal ve Grove Mini PIR Hareket Sensörü ile gerçekleştirilecektir!
Wio Terminal, Arduino ve MicroPython’ı destekleyen tamamen entegre bir mikrodenetleyici geliştirme platformudur. Bluetooth, Wi-Fi bağlantısı taşır ve LCD ekran, yerleşik IMU, mikrofon, buzzer, ışık sensörü ve kızılötesi verici ile birlikte gelir. Wio Terminal ayrıca, tak ve çalıştır Grove modülleri ile kolayca arayüz oluşturmak için kullanılabilecek iki çok işlevli Grove portuna sahiptir.
Wio Terminal, bugünkü proje için harika bir tek durak çözümüdür. Yerleşik WiFi’yi kullanarak PIR sensörümüzü Grove aracılığıyla bağlayabileceğimiz için, lehimleme veya karmaşık kablolarla uğraşma ihtiyacını ortadan kaldırdık. Ayrıca, kapı zilimizi mobil ve pratik bir şekilde duvara monte edilebilir bir çözüm haline getirmek için özel pil şasisini de birleştirebiliriz!
Elbette, bu öğreticiyi başka bir Arduino kartı ve PIR Sensörü ile de takip edebilirsiniz, ancak kabloları bağlamak için biraz daha fazla çalışmanız gerekecek!
Bir Wio Terminal’i Seeed Online Store‘dan alabilirsiniz.
Not: Grove Mini PIR Hareket Sensörü’nü kompakt boyutu ve düşük maliyeti nedeniyle seçmiş olsam da, aşağıdaki Grove PIR Hareket Sensörü modüllerinden birini seçmekte özgürsünüz. Bazıları mesafe ölçümü ve ayarlanabilir bekleme süreleri gibi ek işlevsellik sunacaktır.
- PIR Hareket Sensörü
- Ayarlanabilir PIR Hareket Sensörü
- Mini PIR Hareket Sensörü
- Dijital PIR Hareket Sensörü
Şimdi, öğreticiye geçelim!
Kütüphaneleri Yükleyin
Öncelikle, Wio Terminal’inizle ilk kez çalışıyorsanız, gerekli temel kütüphaneleri yüklemek ve başlamanız için bu sayfayı ziyaret etmenizi şiddetle tavsiye ederim.
Sonra, Wio Terminal’inizde WiFi yeteneklerini ayarlamak için bu bağlantıdaki talimatları izleyin. Bu, Wio Terminal’inizin yazılımını güncellemeyi ve birkaç Arduino kütüphanesini yüklemeyi içerecektir.
Son olarak, Blynk Kütüphanesini yüklememiz gerekecek. Kütüphaneyi bu GitHub deposundan ZIP olarak indirin ve önceki kütüphaneler gibi yükleyin.
“`html
Donanım Kurulumu
Grove PIR Sensör modülünüzü aşağıda gösterildiği gibi Wio Terminal’e takın. Hepsi bu kadar!

Blynk Kurulumu
Başlamak için, Wio Terminal’inizle arayüz oluşturmak için bağlı bir gösterge paneli kurmak üzere Seeed Wiki‘deki talimatları izleyin. Aşağıda gösterildiği gibi bir değer görüntüleme, stilize edilmiş bir düğme ve bir bildirim ile gösterge panelimi kurdum.

Bildirimler yerine e-posta uyarıları almak istiyorsanız, bunu da yapabilirsiniz. Bunu nasıl yapacağınızı öğrenmek için belgelere göz atın.
Akıllı Kapı Zili Arduino Kodu
Şimdi, Wio Terminal’imizi PIR sensörümüzden veri almak ve toplanan verileri Blynk sunucularına yüklemek için programlamamız gerekiyor.
Öncelikle, aşağıdaki koda bir göz atın. Ayrıca, aşağıdaki konumdan Free_Fonts.h dosyasını kopyalamanız gerekecek:
~/Arduino/libraries/Seeed_LCD_master/examples/320 x 240/All_Free_Fonts_Demo
Bu başlık dosyasını, taslağınızı derlemek için taslak konumunuza ekleyin.
Alternatif olarak, kodla birlikte bu bağlantıdan indirebilirsiniz.
// Wio Terminal: Arduino Akıllı Kapı Zili
// Yazar: Jonathan Tan
// Şubat 2021
// Seeed Wio Terminal için yazılmıştır
#define BLYNK_PRINT Serial
#include <TFT_eSPI.h>
#include <rpcWiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleWioTerminal.h>
#include "Free_Fonts.h"
// PIN'leri Tanımlayın
#define PIR PIN_WIRE_SCL
#define LCD_BACKLIGHT (72Ul)
// Zaman Aşımını Tanımlayın
#define LCDTimeout 20000
#define notifyTimeout 20000
TFT_eSPI tft;
BlynkTimer timer;
// Blynk Uygulamasında Auth Token almalısınız.
// Proje Ayarlarına gidin (fındık simgesi).
char auth[] = "YOURAUTHKEY";
// WiFi kimlik bilgilerinizi girin.
// Açık ağlar için şifreyi "" olarak ayarlayın.
char ssid[] = "YOURWIFISSID";
char pass[] = "YOURWIFIPASSWORD";
// Standart Çıktılar
String person = "Hareket Tespit Edildi.";
String absent = "Her şey temiz.";
// Değişkenler
int person_state;
int notify_me;
long LCDmillis;
long notifyMillis;
long millisMarkerDebug;
BLYNK_WRITE(V1) {
int pinValue = param.asInt();
// Hata Ayıklama: Giriş Değerlerini Kontrol Et
Serial.print("Giriş Değeri: ");
Serial.println(pinValue);
// Pin Değerine Göre Değiştir
if (pinValue == 1) {
notify_me = 1;
} else {
notify_me = 0;
}
}
void sendPIRDetect() {
if(digitalRead(PIR)) {
person_state = 1;
Blynk.virtualWrite(V0, person);
if (notify_me == 1 && millis() - notifyMillis > notifyTimeout) {
Blynk.notify("Hareket tespit edildi.");
notifyMillis = millis();
}
} else {
person_state = 0;
Blynk.virtualWrite(V0, absent);
}
}
void eraseLCD() {
tft.fillRect(0, 0, TFT_HEIGHT, TFT_WIDTH, TFT_BLACK);
}
void setup() {
// Hata ayıklama konsolu
Serial.begin(9600);
// Gerçek Kurulum
pinMode(PIR, INPUT);
tft.begin();
tft.setRotation(3);
tft.fillScreen(TFT_BLACK);
tft.println("Başlatılıyor...");
Blynk.begin(auth, ssid, pass);
timer.setInterval(5000L, sendPIRDetect);
tft.println("Bağlandı!");
delay(2000);
tft.fillScreen(TFT_BLACK);
}
void loop() {
Blynk.run();
timer.run();
// LCD'yi kapat
if ( person_state == 0 && (millis() - LCDmillis) > LCDTimeout) {
eraseLCD();
digitalWrite(LCD_BACKLIGHT, LOW);
}
if (person_state == 1 && (millis() - LCDmillis) > LCDTimeout) {
digitalWrite(LCD_BACKLIGHT, HIGH);
LCDmillis = millis();
tft.setTextDatum(MC_DATUM);
tft.setFreeFont(FSSB18);
tft.drawString("Merhaba!", 160, 100);
tft.setFreeFont(FSS9);
tft.drawString("Bir kapı zili bildirimi", 160, 135);
tft.drawString("gönderilecektir.", 160, 155);
}
// Seri Terminalde Hata Ayıklama
if ( (millis() - millisMarkerDebug) > 1000) {
millisMarkerDebug = millis();
if (digitalRead(PIR)) {
Serial.println("Hareket Tespit Edildi.");
} else {
Serial.println("Her şey Temiz.");
}
}
}
Parametreleri Ayarlama
Kodu doğrudan kullanmak istiyorsanız, kendi proje kimlik doğrulama anahtarınızı ve WiFi ayarlarınızı içerecek şekilde aşağıdaki alanları ayarlamanız gerekir.
// Blynk Uygulamasında Auth Token almalısınız.
// Proje Ayarlarına gidin (fındık simgesi).
char auth[] = "YOURAUTHKEY";
// WiFi kimlik bilgilerinizi girin.
// Açık ağlar için şifreyi "" olarak ayarlayın.
char ssid[] = "YOURWIFISSID";
char pass[] = "YOURWIFIPASSWORD";
Ayrıca aşağıdaki parametreleri de değiştirebilirsiniz. LCDTimeout, LCD ekranın kapatılmadan önce bekleyeceği milisaniye sayısını belirlerken, notifyTimeout, bildirimlerin cep telefonunuza gönderilmeden önce bekleyeceği milisaniye süresini belirler.
// Zaman Aşımını Tanımlayın
#define LCDTimeout 20000
#define notifyTimeout 20000
Blynk ile Programlama Üzerine Kısa Bilgi
Kurulum fonksiyonunda, önce PIR sensörümüzün giriş pinini, LCD ekranı ve Blynk sunucusuna bağlantımızı başlatıyoruz.
void setup() {
// Hata ayıklama konsolu
Serial.begin(9600);
// Gerçek Kurulum
pinMode(PIR, INPUT);
tft.begin();
tft.setRotation(3);
tft.fillScreen(TFT_BLACK);
tft.println("Başlatılıyor...");
Blynk.begin(auth, ssid, pass);
timer.setInterval(5000L, sendPIRDetect);
tft.println("Bağlandı!");
delay(2000);
tft.fillScreen(TFT_BLACK);
}
timer.setInterval() fonksiyon çağrısının, sendPIRDetect() fonksiyonumuzu her 5 saniyede bir çağırmak için kullanıldığını göreceksiniz.
timer.setInterval(5000L, sendPIRDetect);
Timer, Blynk’in özel sözdizimidir ve görevleri periyodik olarak yerine getirmek için delay() yerine kullanılır. Bunun nedeni, delay() fonksiyon çağrılarının programı tamamen durdurması ve Wio Terminal’imizin Blynk sunucularıyla bağlantısını kaybetmesine neden olmasıdır.
Timer aralıklarıyla oynarken dikkatli olun. Hata ayıklama için aralıkları kısa ayarlamak isteyebilirsiniz, ancak bu, cihazınızın Blynk sunucularından otomatik olarak bağlantısını kesmesine neden olabilir!
Sensör Verilerini Gönderme
Wio Terminal’imizden veri almak için, Blynk yazabileceğimiz sanal pinler kullanır. Daha sonra bu sanal pinleri, Blynk uygulamasındaki gösterge panelimizde verileri görüntülemek için kullanabiliriz. Ayrıca, hareket tespit edildiğinde uygulamamıza bir bildirim göndermek için Blynk.notify() fonksiyonunu da kullanacağız.
void sendPIRDetect() {
if(digitalRead(PIR)) {
person_state = 1;
Blynk.virtualWrite(V0, person);
if (notify_me == 1 && millis() - notifyMillis > notifyTimeout) {
Blynk.notify("Hareket tespit edildi.");
notifyMillis = millis();
}
} else {
person_state = 0;
Blynk.virtualWrite(V0, absent);
}
}
Burada, hareketin varlığını kaydetmek için person_state değişkenini de kullanıyoruz, böylece programımızın diğer bölümleri buna göre yanıt verebilir. Bu değişkeni daha sonra LCD karşılama ekranımızı kontrol etmek için kullanacağız.
Doğruyu söylemek gerekirse, kodu test ederken bu bildirimlerin, bir tür sınır koymadığımız takdirde oldukça rahatsız edici olabileceğini fark ettim. Bu nedenle, bildirimlerin varsayılan olarak sadece 20 saniyede bir gönderilmesini sağlayan bir zaman aşımı koşulu ekledim. Ayrıca, bildirimlerin gönderilip gönderilmeyeceğini ayarlamamıza olanak tanıyan bir geçiş düğmesi de ekledim.
Bu geçiş düğmesini uygulamak için, sanal pinleri tekrar kullanmamız gerekiyor.
“`
BLYNK_WRITE(V1) {
int pinValue = param.asInt();
// Hata Ayıklama: Giriş Değerlerini Kontrol Et
Serial.print("Giriş Değeri: ");
Serial.println(pinValue);
// Pin Değerine Göre Değiştir
if (pinValue == 1) {
notify_me = 1;
} else {
notify_me = 0;
}
}
Bu basit kod parçası, cep telefonumuzdaki düğmeyi her değiştirdiğimizde çalıştırılan bir geri çağırmadır. Bu durumda, notify_me durum değişkenini pinin değerine göre 0 ve 1 arasında değiştiriyoruz. Bu değişken, bildirim gönderilip gönderilmeyeceğini belirlemek için sendPIRDetect() fonksiyonunda kullanılır.
LCD Ekran ile Misafirlerimizi Karşılama

Wio Terminal’ımızda yerleşik bir LCD ekran bulunduğuna göre, misafirlerimize geldiklerini bildirmek için basit bir ekran yapmayı neden denemeyelim?
if ( person_state == 0 && (millis() - LCDmillis) > LCDTimeout) {
eraseLCD();
digitalWrite(LCD_BACKLIGHT, LOW);
}
if (person_state == 1 && (millis() - LCDmillis) > LCDTimeout) {
digitalWrite(LCD_BACKLIGHT, HIGH);
LCDmillis = millis();
tft.setTextDatum(MC_DATUM);
tft.setFreeFont(FSSB18);
tft.drawString("Merhaba!", 160, 100);
tft.setFreeFont(FSS9);
tft.drawString("Bir kapı zili bildirimi", 160, 135);
tft.drawString("gönderilecektir.", 160, 155);
}
Burada, ana döngümüze iki ek koşullu ifade ekledim. Bu ifadeler, daha önce değiştirdiğimiz person_state değişkenini sürekli kontrol eder, ancak düzensiz ekran titremelerini önlemek için yalnızca her 20 saniyede bir çalıştırılır.
PIR sensörü HIGH okursa, misafirlerimize geldiklerini bildirmek için bir mesaj göstereceğiz. Aksi takdirde, güç tasarrufu sağlamak için LCD arka ışığımızı kapatacağız.
digitalWrite(LCD_BACKLIGHT, LOW);
LCDmillis değişkeninin yalnızca açık durum kod bloğuyla ‘sıfırlandığını’ unutmayın. Bu, LCD’nin herhangi bir sonraki hareketle hemen tekrar açılmasını sağlar!
Kod Hatasını Giderme
IoT uygulamaları için WiFi ağlarında, mikrodenetleyicilerin bazen biraz zaman alabileceğini unutmayın. Takıldığınızda, aşağıdakilerden birini denemek yardımcı olabilir.
1. WiFi Bağlantısını Kontrol Edin
WiFi SSID ve Şifrenizin doğru olduğundan emin olun, ardından aşağıdaki kodu yükleyin ve bağlantıyı kontrol edin.
#include "rpcWiFi.h"
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
void setup() {
Serial.begin(115200);
while(!Serial); // Serial'in hazır olmasını bekle
// WiFi'yi istasyon moduna ayarla ve daha önce bağlıysa bir AP'den bağlantıyı kes
WiFi.mode(WIFI_STA);
WiFi.disconnect();
Serial.println("WiFi'ye bağlanılıyor..");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("WiFi'ye bağlanılıyor..");
WiFi.begin(ssid, password);
}
Serial.println("WiFi ağına bağlandı");
Serial.print("IP Adresi: ");
Serial.println (WiFi.localIP()); // cihazın IP adresini yazdırır
}
void loop() {
}
2. Wio Terminal’ınızı Sıfırlayın
Bunu güç düğmesine aşağı doğru basarak ve ardından bırakıp yapabilirsiniz. Ya da, Arduino IDE’de kodunuzu yeniden yükleyin.
3. Bekleyin…. Ve Yeniden Deneyin
Eğer her şey başarısız olursa, sadece bekleyin ve daha sonra tekrar deneyin. Bazen, harici sunuculara bağlantılar kurulması biraz zaman alabilir.
Son Ürün
İşte son ürün! Birinin varlığını hareketleriyle tespit eden otomatik bir kapı zili, telefonumuza gönderilen uzaktan mesajlar ile misafirlerimizin geldiğini bilmemizi sağlayan bir sistem ve onları karşılamak için bir LCD ekran!
Burada PIR sensörü ve LCD ekranın selamlaşmasını aksiyonda görüyoruz!

Bu arada, kontrol paneli bize bildirim almayı ve sensörü izlemeyi sağlıyor.

Özet
Ve bugünkü eğitimimiz burada sona eriyor. Umarım takip edebilmişsinizdir ve Wio Terminal’ınızla kendi Arduino akıllı kapı zilinizi yapabilmişsinizdir! Mevcut kodu, çeşitli durumlarda bildirim alacak şekilde kolayca değiştirebilir veya Wio Terminal’ınıza uzaktan çeşitli donanım komutları gönderebilirsiniz. Ayrıca, Wio Terminal gibi bir MCU ile bağladığımız sensörlere bağlı olarak birçok farklı IoT uygulaması oluşturabileceğinizi göreceksiniz.
Eğer Wio Terminal için diğer projeleri denemek isterseniz, lütfen aşağıdaki bağlantılara göz atın:
