Arduino İle Bilgisayarınızı Uzaktan Çalıştırın
by İbrahim Kaya · 03 Kasım 2023
Bilgisayarlarımız artık hayatımızın ayrılmaz bir parçası haline geldi ve bu cihazlar sayesinde dünya ile iletişim kurmak ve verileri paylaşmak için internetin gücünden faydalanıyoruz. Bu nedenle bilgisayarlarımıza veya içindeki verilere bilgisayarın yanında olmadığımız zamanlarda da ihtiyaç duyabiliyoruz. Böyle durumlarda imdadımıza AnyDesk veya Teamviewer gibi uzaktan kontrol yazılımları koşabiliyor. Fakat ya bilgisayarımız kapalıysa?
Bilgisayarlarımızı daha da akıllı hale getirmek için IoT (Nesnelerin İnterneti) teknolojileri sayesinde, onları fiziksel dünyayla etkileşime girebilen ve kontrol edilebilen cihazlara dönüştürme imkanı buluyoruz. Bu yazımda sizlere bilgisayarınızı nasıl uzaktan (web siteniz veya mobil uygulamanız üzerinden) çalıştırabileceğinizi anlatacağım. Bu yöntemle bilgisayarınızı herhangi bir modem portu açmaya gerek kalmadan, ana kartınızın wake-on LAN desteği olmasına gerek kalmadan veya aynı ağda bulunma zorunluluğunuz olmadan internet üzerinden çalıştırabilirsiniz.
Öncelikle belirtmem gerekir ki bu benim ilk arduino projem. Dolayısıyla bazı amatörce kısımlar olabilir. Belki sizlere bir nebze fikir verebilir veya ihtiyaç duyan birilerine faydalı olabilir diyerek paylaşıyorum.
Nasıl Çalışıyor?
Öncelikle kasa nasıl çalışır bunun mantığından bahsedeyim;
Anakartımız üzerinde kasanın power tuşunun kablolarını bağladığımız 2 adet uç var. Bunlardan birisi pozitif (yani üzerinde düşük bir gerilim var) diğeri negatif (yani herhangi bir gerilim yok). Siz kasanın power tuşuna bastığınız zaman bu iki uç kısa devre oluyor ve pozitif uçtan negatif uca doğru bir elektrik akımı meydana geliyor. Bu sinyali alan anakart ise güç akışını serbest bırakıyor ve kasamız çalışmaya başlıyor.
Bizim sistemimizin ise çalışma mantığı çok basit. Bir Firebase veritabanı kuruyoruz. İçine de bir adet değişken belirliyoruz. Modül sürekli o değişkeni kontrol ediyor. Eğer değişkenin değeri 1 ise bağladığımız 5v Röleye sinyal gönderiyor. Röle anahtarı kapanıyor sonra tekrar açılıyor. Böylece anakartın power uçlarını kısa devre yapıyoruz ve kasa çalışıyor. Daha sonra o değişkenin değerini 0 yapıyor ve böyle devam ediyor.
Farklı bir şekilde kullanılabilir miydi? Tabii ki evet. Fakat ben kendi ihtiyacımdan dolayı bu sistemi kurdum. Vakit kısıtından dolayı da çok detaylı uğraşamadım. O yüzden pratik olması açısından bir Firebase veritabanı ve cihazın firebase bağlantısı ile kısa bir çözüm ürettim. NodeMCU modülü çok geniş kapsamlı bir modül. Dolayısıyla çok farklı yöntemler de kullanılabilir. Fakat benim bundan önce arduino kartlara karşı çok aşinalığım yoktu. Bundan ötürü biraz acemice bir çalışma oldu. Fakat burda da yazılımın temel prensibini devreye alıyoruz: çalışıyorsa dokunma :)
1- İhtiyacımız olan şeyler;
- 1 adet V3 NodeMcu Ch-340 (ESP8266) Wifi Geliştirme Modülü,
- 1 adet 1 Kanal 5V Röle Kartı,
- En az 3 adet dişi-dişi, 2 adet erkek-erkek ve bir kaç adet yedek jumper kablolar,
- NodeMcu modülünü beslemek için micro USB kablo. (Gücü nereden alacağınıza karar vermeniz gerekli)
- Opsiyonel: Ben kısa bir micro-USB kabloyu kesmeden bağlamak için dişi USB-A kablo bulup onu kestim. Siz de o şekilde kullanmak isterseniz bir dişi USB-A kullanabilirsiniz. Veya direk güç kaynağından micro USB kablo çıkıp bağlayabilirsiniz.
2- NodeMCU Kartı Programlama
Ben Arduino IDE üzerinden programladım. Firebase bağlantısı için de Mobitz'in "Firebase ESP8266 Client" isimli kütüphanesini kullandım. Kodlar şu şekilde;
#include <Arduino.h>
#include <FirebaseESP8266.h>
#include <ESP8266WiFi.h>
// Firebase bağlantı bilgileri
#define FIREBASE_HOST "https://firenase-proje-url.europe-west1.firebasedatabase.app/"
#define FIREBASE_AUTH "buraya-token-gelecek"
#define WIFI_SSID "WifiAdi"
#define WIFI_PASSWORD "wifi-sifresi"
#define POWER_PIN D1 // NodeMCU üzerinde kullanacağınız GPIO pini
// Bağlantı nesnesi oluşturma
FirebaseData firebaseData;
void setup()
{
Serial.begin(115200);
pinMode(POWER_PIN, OUTPUT);
digitalWrite(POWER_PIN, HIGH); // Cihaz başlatıldığı zaman röleyi kapalı konuma (yani anahtarı açık konuma) getiriyoruz.
// Normalde pin gücünün low, yani kapalı konumda olması gerekli. Fakat benim bağlantımda tam tersi oldu. High yapınca röle kapalı konuma geliyordu.
// Muhtemelen bağlantıda bir yanlışlık yaptım veya çalışma mantığı bu şekilde :)
// WiFi bağlantısı
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Bağlanılıyor");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("WiFi bağlantısı başarılı. IP adresi: ");
Serial.println(WiFi.localIP());
// Firebase bağlantısı
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.reconnectWiFi(true);
}
void loop()
{
// Firebase'deki "run" değişkenimizin hangi durumda olduğunu kontrol ediyoruz. true mu false mu?
if (Firebase.getBool(firebaseData, "/run"))
{
bool value = firebaseData.boolData();
if (value)
{
Serial.print("Çalıştırma komutu algılandı!");
Serial.print("Bilgisayar çalıştırılıyor...");
// "run" değeri "true" olarak güncellenmiş yani bilgisayarı çalıştırmamız gerekiyor.
// Kısadevre yaparak bilgisayarı çalıştırma kodumuzu çalıştırıyoruz.
// Gücü açmak için POWER_PIN'e sinyal gönderin
digitalWrite(POWER_PIN, LOW); // D1 pini üzerinden güç kablosuna düşük sinyal gönderiyoruz. (Aslında yüksek olması gerekiyor diye düşünüyorum ama yukarıda bahsettiğim sebepten dolayı tam tersi durumda çalışıyor.)
delay(500); // Gücü yarım saniye boyunca açık tutuyoruz.
digitalWrite(POWER_PIN, HIGH); // D1 pini üzerinden güç kablosuna yüksek sinyal gönderip röle anahtarını açık hale getiriyoruz.
// "run" değerini "false" yapıyoruz
Firebase.setBool(firebaseData, "/run", false);
String currentTime = String(millis()); // Şu anın süresini elde etmek için yazdım bunu, farklı bir yöntem kullanabilirsiniz.
// Aslında süre almanın bir amacı yok sadece ben çalışıp çalışmadığını kontrol etmek için çalıştığı anın zaman damgasını almaya çalıştım.
// Ama zaman damgasını vermiyormuş bu fonksiyon sanırım. Ama farketmiyor ben amacıma ulaşmıştım. Çalıştığı zaman oradaki rakamlar değişiyor sonuç olarak.
// Siz de çalışıp çalışmadığını test etmek için bu değişkeni kullanabilirsiniz.
Firebase.setString(firebaseData, "/last_run", currentTime);
Serial.print("Bilgisayar çalıştırıldı!");
}
}
delay(100); // her 100 ms'de bir yukarıdaki döngü devam edecek. Bu kod geciktirmek için. Yoksa çok seri istek atıyor. Bunu en azından bir nebze geciktiriyoruz.
}
3- Bağlantılar
- NodeMCU modülümüzün D1, G ve 3V bacaklarına birer dişi-dişi jumper bağlıyoruz.
- NodeMCU modülümüzün D1 bacağından çıkan jumper kabloyu Röle kartımızın IN bacağına, G bacağından çıkan kabloyu GND bacağına ve 3V bacağından çıkan kabloyu da VCC bacağına bağlıyoruz.
- Bu aşamada bilgisayarımızın kendi power tuşunu devre dışı bırakmamak adına paralel bağlantı yapacağız.
- Bunun için kasanın power switch girişine 2 adet erkek-erkek jumper kablo bağlayıp bunları rölemizin NC ve C çıkışlarına bağlıyoruz.
- Daha sonra anakartın power uçlarına 2 adet dişi-erkek jumper kablo bağlayıp erkek uçlarını aynı şekilde rölemizin NC ve C çıkışlarına bağlıyoruz.
- Son olarak da NodeMCU kartımıza güç vermek kalıyor. Ben burda anakartımın boşta olan bir USB çıkışına eski kasamdan çıkardığım USB kablosunu bağladım. Daha sonra o uca bir micro USB kablo bağlayarak NodeMcu kartıma güç verdim. Tabi burada anakartın kapalıyken bile USB çıkışlarına güç verme özelliğinin olması gerekli. Yoksa bilgisayarı kapattığınızda USB'lerin de gücü kesileceği için kart kapanacaktır. O yüzden burada karta nasıl güç vereceğinize karar vermeniz gerekli.
- Bağlantıları yaptıktan sonra kısa devlerlerden kaçınmak için güzelce yalıtmayı unutmayınız.
4- Tetikleme
Tetikleme için sayısız alternatifiniz bulunmakta. Benim kullandığım yöntem Laravel (PHP) ile bir script kullanarak tetiklemek oldu. Yapmanız gereken tek şey Firebase'deki değişkeninizin değerini 1 olarak değiştirmek. Bunu istediğiniz dili veya yazılımı kullanarak yapabilirsiniz. Yüzlerce alternatifiniz var. Örneğin websitenize girip oradan bilgisayarı çalıştırabilir veya bir mobil uygulama yapıp uygulama üzerinden bilgisayarınızı çalıştırabilirsiniz. Benim kullandığım Laravel kodları şu şekilde:
Öncelikle Firebase bağlantısı kurabilmek için ben kreait/laravel-firebase paketini kullandım. Bu paketin kurulumu ve ayarları şu şekilde:
Paketi composer ile kuruyoruz:
composer require kreait/laravel-firebase
Daha sonra .env ayarlarımızı yapıyoruz. .env dosyasına şu satırı eklememiz gerekiyor:
FIREBASE_CREDENTIALS=firebase_credentials.json
FIREBASE_DATABASE_URL=https://<your-project>.firebaseio.com
FIREBASE_CREDENTIALS kısmı sizin projenize erişmek için kullanılacak yetkilendirme bilgileridir. Buna erişmek için şu adımları izleyebilirsiniz:
- Öncelikle Firebase panelimize girip projemizi seçiyoruz.
- Daha sonra soldaki menüde "Project Overview" seçeneğinin karşısındaki çark simgesine tıklayıp "Project settings"e tıklıyoruz.
- Yukarıdaki sekmelerden "Service Account" kısmına gelip "Generate new private key"e tıklıyoruz.
- İndirdiğiniz dosyanın adını değiştirip .env dosyanızın bulunduğu dizine atın.
- Daha sonra bu dosyanın adını .env dosyanıza eklediğiniz FIREBASE_CREDENTIALS tanımlamasının karşısına yazın.
Buraya koyacağınız URL'i öğrenmek için ise Firebase panelinize girin, oluşturduğunuz projeyi seçin, sol menüden "Realtime Database"i seçin. Açılan sayfada proje linkiniz görüntülenecektir. Bu linki buraya yapıştırabilirsiniz.
Firebase veritabanındaki değişkenimizin değerini değiştirmek için kullanacağımız kodlar ise şu şekilde. Ben örnek olarak bir Controller içerisinde kullandım. Siz kendi senaryonuza göre istediğiniz yerde kullanabilirsiniz.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Kreait\Firebase\Factory;
class PCController extends Controller
{
public function runComputer(Request $request)
{
$fb_db = (new Factory())
->withServiceAccount(base_path(env('FIREBASE_CREDENTIALS')))
->withDatabaseUri(env("FIREBASE_DATABASE_URL"));
$firebase = $fb_db->createDatabase();
$firebase->getReference('/run')->set(true); // Firebase'deki "run" değişkenimizin değerini "true" yapıyoruz.
return response()->json(['status' => 'success', 'message' => 'Komut gönderildi!'], 200);
}
public function checkCompleted(Request $request)
{
// Bu fonksiyon ise modülümüz "run" değişkeninin değerini tekrar 0 (false) yapmış mı diye kontrol etmek için.
// Amacı ise modülün devreye girip girmediğini kontrol etmek.
// Zorunlu değil ben kontrol amaçlı eklemiştim. Siz eklemeyebilirsiniz.
$fb_db = (new Factory())
->withServiceAccount(base_path(env('FIREBASE_CREDENTIALS')))
->withDatabaseUri(env("FIREBASE_DATABASE_URL"));
$firebase = $fb_db->createDatabase();
$run = $firebase->getReference('/run')->getSnapshot()->getValue();
if(!$run) return response()->json(['status' => 'success', 'message' => 'Bilgisayar çalıştırıldı!'], 200);
else return response()->json(['status' => 'error', 'message' => 'Bilgisayar çalıştırılamadı! Modül devre dışı kalmış olabilir.'], 400);
}
}
Modülümüzü programlayıp bağlantıları doğru şekilde yaptıktan sonra modüle güç verdiğiniz an çalışmaya başlaması gerekiyor. Firebase'deki değişkeni değiştirerek deneyebilirsiniz. İyi çalışmalar!
Genel Değerlendirme
0.0
/
5
0 değerlendirme üzerinden.
Değerlendir
Değerlendirmeler
Henüz bir değerlendirme yapılmamış.