Bugünkü makalede, Wio Terminal’ımızla bir Arduino kablosuz interkom inşa edeceğiz! Bu proje, Wio Terminal’ınızı bir masa saati olarak ayarlamanızı sağlarken, aynı zamanda MQTT protokolü aracılığıyla diğer cihazlara mesaj göndermenizi ve almanızı da mümkün kılıyor.

Kablosuz Interkom Arka Plan ve Genel Bakış
Lunar Yeni Yılı tatilinde bir arkadaşımın evinde akşam yemeği yedim ve herkesin masaya çağrılmasında zorluk yaşadılar. O sırada birinin, bir tür interkomun çok faydalı olacağını söylemesi oldukça yerindeydi! Ne yazık ki, hızlı bir çevrimiçi arama, modern interkom sistemlerinin donanım ve kurulum için 1500 ila 6000 USD arasında bir maliyeti olduğunu ortaya koydu – bu gerçekten büyük!
Ayrıca, birçok kişi için çalışırken dikkat dağınıklığından uzak kalmak mutlak bir gereklilik. Bu, mobil telefonlarımızın bildirimleri kapalı bir şekilde bir kenara konulması gerektiği anlamına geliyor, bu da bizi ulaşılmaz hale getiriyor. Dünyanın birçok yerinde WFH (evden çalışma) durumu devam ederken, temel ev iletişimlerini sürdürmenin kolay ama rahatsız etmeyen bir yoluna ihtiyacımız olacak.
Tüm bunları göz önünde bulundurarak, neden Wio Terminal ve Arduino ile kendi kablosuz interkom sistemimizi inşa etmiyoruz? Böylece, sadece bir kısmı maliyetle benzer kolaylıklara sahip olacağız!
Öncelikle, bu proje için yaptığım kısa demo videosuna bir göz atalım.

Özetle, bu projede Wio Terminal’ımızda üç şeyi başarmak istiyoruz:
- Tarihi ve saati gerçek zamanlı olarak görüntülemek
- WiFi üzerinden mesaj alıp gönderebilmek
- Kullanıcı navigasyonu için bir GUI oluşturmak
Bir Interkom Nedir?
Interkom, karşılıklı iletişim cihazının kısaltmasıdır. Geleneksel olarak, bir interkom, tek yönlü veya iki yönlü iletişime olanak tanıyan herhangi bir elektrikli cihazdır. Interkomların yaygın bir kullanımı, konut sitelerinde, ev sahiplerinin misafirleri içeri almasına olanak tanıyan sistemlerdir. Bazı evler veya ofisler de pratik iletişim sağlamak için interkom sistemlerine sahip olabilir.

MQTT İletişimi Hakkında Kısa Bilgi
WiFi üzerinden mesaj göndermek için hafif MQTT (ya da Mesaj Kuyruğu Telemetri Taşıma) protokolünü kullanacağız. MQTT, mevcut internet bağlantımızın üzerinde çalışan bir yayın/abone mesajlaşma protokolüdür (TCP/IP).
Pub/sub yapısı, farklı cihazları abone oldukları veya yayın yaptıkları konular temelinde bağlayarak çalışır. Aşağıdaki grafikte, Sıcaklık Sensörü sıcaklık konusuna yayın yapar ve Mobil cihaz ile Arka uç sistemi bu konuya abone olmuştur. Böylece, her ikisi de “24 oC” mesajını alacaktır.
Belirli bir konunun yayıncılarını ve abonelerini koordine eden cihaza MQTT broker denir. Broker’ı, bağlı tüm cihazlarımız arasındaki iletişimi koordine eden IoT ağımızın “beyni” olarak düşünebilirsiniz – onun olmadan iletişim karmaşık ve imkansız olurdu!
Gerekli Araçlar
Bu projeyi takip etmek veya kendi kullanımınız için uygulamak için aşağıdakilere ihtiyacınız olacak:
- Wio Terminal x2 (veya kullanım durumunuza bağlı olarak istediğiniz kadar)
- Raspberry Pi 4B 4GB x1 (MQTT Broker’ımız için)
- Çalışan bir yerel internet bağlantısı
Bir Raspberry Pi 3 veya bir Raspberry Pi Zero W da MQTT broker olarak iş görebilir, ancak gelecekteki projeleriniz için daha fazla işlem gücü sağlayacak en son Pi 4B’yi almanızı şiddetle tavsiye ederim!
Elbette, Wio Terminal yerine LCD ekranlı herhangi bir Arduino uyumlu kart da kullanabilirsiniz. Ancak, bugünkü Arduino kablosuz interkom projesinden tam olarak yararlanmak için kablolamayı yapmanız ve ek butonlar eklemeniz gerekecek, ayrıca kodu donanım pinlerinizle çalışacak şekilde yeniden yapılandırmalısınız!
Raspberry Pi MQTT Broker’ı Kurma
Öncelikle, Raspberry Pi’mizi MQTT broker’ı olarak ayarlamamız gerekiyor; bu, cihazlarımız arasındaki konuları ve mesajları yönetip yönlendirecektir. Eğer daha önce Raspberry Pi’nizde bir internet bağlantısı kurmadıysanız, lütfen önce Raspberry Pi WiFi’yi Yapılandırmanın 3 Yöntemi makalemizi ziyaret edin.
Mosquitto MQTT platformunu kurmak için Raspberry Pi komut satırında aşağıdaki iki komutu çalıştırın.
sudo apt update
sudo apt install -y mosquitto mosquitto-clients
Sonra, mosquitto hizmetini etkinleştirmek için aşağıdakini çalıştırın. Bu, MQTT hizmetinin Pi’nizde açılışta çalışmasını sağlayacak, böylece her açıldığında ve internete bağlandığında otomatik olarak broker olarak hizmet verecektir.
sudo systemctl enable mosquitto.service
Son olarak, çeşitli konulara nasıl yayın yapacağımızı ve abone olacağımızı öğrenmeden önce, aşağıdakini çalıştırın:
ifconfig wlan0
“inet” kelimesinin yanındaki çıktıya bakın. Bu, Raspberry Pi’nizin IP adresidir. Daha sonra kullanmak üzere bunu not edin, çünkü Wio Terminal’ımızın Arduino kodu için buna ihtiyacımız olacak.
MQTT: Yayınlama ve Abone Olma
Wio Terminal’ımızı programlamaya geçmeden önce, Raspberry Pi MQTT broker’ımızın beklendiği gibi çalıştığını kontrol etmek iyi bir fikirdir. Öncelikle, aşağıdaki komutla bir konuya dinleyici kuracağız.
mosquitto_sub -t "testtopic"
Muhtemelen tahmin edebileceğiniz gibi, -t parametresi abone olduğumuz konuyu belirtir. Bu durumda, bu basitçe testtopic‘dir.
Şimdi, terminalinizde yeni bir pencere açın ve aynı konuya bir test mesajı yayınlamak için aşağıdaki komutu çalıştırın.
mosquitto_pub -t "topic" -m "test message"
“test message” kelimeleri artık ilk terminal penceresinde görünmelidir.
Tebrikler! İlk MQTT mesajınızı göndermiş oldunuz.
Wildcard Abonelikleri
MQTT konuları, bilgisayarlarımızın dosya dizin sistemlerine benzer bir yapıya sahiptir. Örneğin, tek bir cihaz konusu altında durum ve mesaj gibi iki alt konuya sahip olabiliriz.
“`html
device1/status
device1/message
Wildcard aboneliği kullanmak istediğimizde bilmek faydalıdır. Örneğin, “+/status” konusuna abone olmak, mevcut tüm cihazların status konularına abone olmamızı sağlar. Bunu daha sonra ağımızdaki tüm cihazlara tek bir yayınla ulaşmak için kullanacağız.
MQTT iletişiminde wildcard’lar hakkında daha fazla bilgi edinmek için, HiveMQ üzerindeki bu makale iyi bir okumadır.
Wio Terminal: Gerekli Kütüphanelerin Kurulumu
- Wio Terminal ile çalışıyorsanız, başlamanız için gerekli temel kütüphaneleri kurmak üzere bu sayfayı ziyaret etmeniz şiddetle tavsiye edilir.
- Sonra, Wio Terminal’iniz üzerindeki 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 kurmayı içerecektir.
- Bunun ardından, Seeed RTC Kütüphanesini bu bağlantıdan ZIP olarak indirin ve Arduino IDE’nizle kurun.
- Son olarak, PubSubClient’ı Araçlar > Kütüphaneleri Yönet altında Arduino Kütüphane Yöneticisi aracılığıyla kurun.
Arduino Kodunu Uygulama
Öncelikle, bu Github deposundan kodu indirin ve WioTerminal_Intercom.ino dosyasını Arduino IDE’nizle açın.
Arduino kodu çoğunlukla kullanıma hazır olsa da, flaşlamadan önce kendi kullanım durumunuza göre ayarlamanız gereken birkaç şey var. Öncelikle, aşağıdaki iki satırı bulun ve SSID ile şifreyi WiFi bilgilerinizle değiştirin. Bunun, Raspberry Pi’nizin bağlı olduğu aynı ağ olması gerektiğini unutmayın.
const char *ssid = "YourWiFiSSID";
const char *password = "YourWiFiPassword";
Sonra, broker IP adresini, önceki adımlarda Raspberry Pi’nizden aldığınız IP adresi ile değiştirin. Bu girdi için IP adresinizdeki “.” (nokta) karakterlerini “,” (virgül) ile değiştirin.
IPAddress broker(192,168,1,111); // Broker IP'niz 192.168.1.111 ise
Bir sonraki adım, istenen şekilde önceden tanımlı mesajları güncellemektir. Bunlar, Wio Terminal’inizden gönderebileceğiniz mesajlardır. Ayrıca, num_messages değişkenindeki mesaj sayısını buna göre güncellemeniz gerekecektir.
int num_messages = 4;
const char *messages[] = {
"Yardım lazım!",
"Yemek hazır!",
"Bana 5 dakika ver!",
"Biraz zaman alacak."
};
Son olarak, bu taslağı flaşladığınız her Wio Terminal için, MQTT broker’ın cihazı tanıyabilmesi için o cihaza benzersiz bir cihaz kimliği atamak isteyeceksiniz. Ayrıca PUBTOPIC’i “<ID>/messages” olarak güncelleyin. Bunu, GUI’de aldığımız mesajların göndericisini belirtmek için kullanacağız.
const char *ID = "<MyID>"; // Benzersiz olmalıdır
const char *PUBTOPIC = "<MyID>/messages";
Kablosuz Interkom Arduino Kodu: Dikkat Edilmesi Gerekenler
Bu bölümde, Wio Terminal Arduino Kablosuz Interkom’un işlevlerini etkinleştirmek için önemli olan Arduino kodunun bazı kısımlarını kısaca ele alacağım.
Pub/Sub Yapısı
Arduino taslağı, ağdaki tüm cihazların bireysel “<ID>/messages” konularına yayın yapacak şekilde tasarlanmıştır ve tüm cihazlar tarafından yayınlanan mesajlara “+/messages” konusuyla abone olmaktadır.
Bu, broker üzerinden gönderilen tüm mesajların tek bir akışta toplanmasını sağlar ve tüm cihazlar tarafından erişilebilir hale getirir.
Gelen Mesajların Ayrıştırılması
setup() fonksiyonunda, PubSubClient’ımız için bir geri çağırma ayarlıyorum:
client.setCallback(callback)
Bu, her yayın yaptığımızda veya client.loop() çağrıldığında çalıştırılacak bir geri çağırma fonksiyonu tanımlar. Bugünkü Arduino kodumuzda, geri çağırma fonksiyonu şu şekilde tanımlanmıştır:
void callback(char* topic, byte* payload, unsigned int length) {
String response, identity;
if (payload && strcmp(topic,PUBTOPIC) != 0) {
for (int i = 0; i < length; i++) {
response += (char)payload[i];
}
for (int i = 0; i < (strlen(topic)-9) ; i++) {
identity += (char)topic[i];
}
fadetxt(identity + ":", FSS9, 40, 250, 160, TC_DATUM);
fadetxt(response, FSS9, 40, 280, 240, TC_DATUM);
alarm();
}
}
Wio Terminal’imiz tüm “/messages” konularına abone olduğu için, kendi konusuna da abone olmuştur. Kendi mesajlarımızı almamak için, alınan yük yalnızca gelen konu ile Wio Terminal’in kendi konusu aynı değilse ayrıştırılıp görüntülenir.
Ayrıca, gelen mesajın gönderildiği cihazın kimliği, gelen konunun “/messages” sonunu kaldırarak ayrıştırılır. Örneğin, “WioTerminal2/messages” basitçe “WioTerminal2” haline gelir.
Zamanı Tutma: RTC & NTP
Aranızdaki zeki olanlar, demo videomda gösterilen zamanın tamamen gün ışığıyla çelişkili olduğunu fark etmiş olmalısınız!
Tarih ve saat, derleme zamanında Wio Terminal’e iletilir ve cihaz üzerindeki RTC (gerçek zamanlı saat) modülü tarafından korunur. Bu nedenle, standart delay() fonksiyonunun kullanılmaması kritik öneme sahiptir, çünkü bu bloklama yapar ve zamanın doğru tutulmasında hatalara yol açar. Bunun yerine, tüm gecikmeleri bloklama yapmayan ve zaman tutmayı etkilemeyen millisDelay() fonksiyonu ile değiştirdiğimi göreceksiniz.
void millisDelay(int duration) {
long timestart = millis();
while ((millis()-timestart) < duration) {};
}
Yine de, yalnızca derleme zamanı ve RTC modülüne güvenmek bir sınırlamadır, çünkü modül, Wio Terminal flaşlandıktan sonra kapatıldığında durur. Bu nedenle, Arduino’muzun kurulumunda NTP sunucusundan internet üzerinden NTP zamanını almak ideal olacaktır. Bu, Wio Terminal’de görüntülenen zamanın doğru olmasını sağlar, daha önce kapatılmış olsa bile.
Bu işlevselliği kodunuza eklemek istiyorsanız buraya göz atın.
Akıcı Grafikler: Fade In & Out
Bu projede, görüntülenen metnin akıcı bir grafik kullanıcı arayüzü ile fade in ve fade out etkisiyle gösterilmesini istedim. Bu, basit bir for döngüsü ile şöyle yapılabilir:
sp.setTextColor(TFT_BLACK);
int r = 0; int g = 0; int b = 0;
for (int j = 0; j < 127; j++) {
int color = sp.color565(r += 2, g += 2, b += 2);
sp.setTextColor(color);
if (datum == TL_DATUM) sp.drawString(text, 0, 0);
if (datum == TC_DATUM) sp.drawString(text, 80, 0);
sp.pushSprite(x,y);
}
Temelde, metin rengini arka plan rengi olan siyaha başlatıyoruz ve metni beyaz RGB değerlerine doğru artan renklerle sürekli itiyoruz. Bu, bir fade in etkisi yaratır. Tersi olarak, fade out elde etmek için metni beyaz olarak başlatabilir ve yeni renkleri siyah RGB değerlerine doğru artan şekilde itebiliriz.
Özet
Ve bu, Wio Terminal’inizle bir Arduino kablosuz interkom nasıl inşa edilir konusundaki bugünkü eğitimin sonuna geldi. Bu cihazla hangi tür mesajlar göndereceğinizi veya ilginç şeyler yapacağınızı bana bildirin!
Diğer Wio Terminal projelerini denemekle ilgileniyorsanız, lütfen kontrol edin:
“`
