Bluetooth ile Elektrikli Aletleri Açıp Kapatma Projesi
Tez başlığı gibi uzun bir başlık attım ama korkmayın yazı o kadar uzun değil.
Eskiden evde sıklıkla yaptığım en büyük unutkanlık elektrikli aletleri açık bırakmaktı. Havyayı açık bırakıp bütün gün bisiklete bindiğim bir gün şans eseri evde yangın çıkmamıştı ve ben o günden sonra akıllandım mı? Hayır. Daha da fenası oldu. Kafamda sürekli “onu açık mı bıraktım, bunu kapadım mı? Kapıyı kilitledim mi?” diye tilkiler dolanmaya başladı. O dönem böyle bir proje yapmayı aklımdan geçirmiş ama sonra üşenip yapmamıştım. Şimdi malum işsizim. O yüzden böyle üşenip yapmadığım ufak projeleri bir bir yapmaya başladım. Basit bir röle kontrol uygulamasıyla başlayalım.
Tasarım Kriterleri
Uzaktan havya aç kapa (Durumunu gözle)
Sade arayüz
Sistemin durumunu belirten gösterge (led)
Malzemeler
Dişi/Erkek Fiş
Kablo
Arduino Uno
HC-05 Bluetooth Modülü
Röle Modülü
Jumper Kablo
1k ohm ve 2k ohm direnç
Dişi/Erkek Pin Header
Delikli Pertinaks
Breadboard
Android Telefon
Tedarik
Arduino, HC-05, delikli pertinaks, breadboard, jumper ve röle modülünü Robotistan’dan Dişi/erkek fişi Tekzen’den aldım. Tekzen’den almamın özel bir sebebi yok bu arada. Eve en yakın yer orasıydı. Bir de tabi şu an Bodrum’a yeni yerleştik. Düzgün dükkan bulana kadar zincir mağazalardan alışveriş yapmak daha güvenilir geliyor.
Tasarım
Bu projede klasik kuru kontak röle yerine fırın projesinde kullandığım katı hal rölesi de kullanılabilir. Ben biraz değişiklik olsun diye klasik röle kullanacağım.
Telefonda sade arayüz meselesi için ufak bir android uygulaması hazırlamak gerekiyor. Henüz bu konuda çok az bilgim olduğu için hazır uygulamalardan birini kullanacağım. Play Store üzerinden birkaç uygulama denedim en kapsamlısı Ardudroid. Bunun haricinde MIT’nin android uygulama geliştirmek için App Inventor adlı açık kaynak bir ortamı var. Burada bir uygulama hazırlanabilir. O da başka bir yazının konusu olsun. Şimdi Ardudroid ile devam edelim.
Ardudroid: https://play.google.com/store/apps/details?id=com.techbitar.android.Andruino
Ardudroid iki taraflı haberleşme sağlayan bir android uygulaması. Yani hem arduino uygulamamıza veri gönderebilir (aç/kapa vs.) hem de veri alabiliriz (açık mı/kapalı mı vs.)
Kullanması kolay ama yapacağımız iş için kullanıcı dostu bir arayüzü var mı derseniz hayır. Arduino’nun dijital pinlerine buton, analog pinlerine potansiyometre bağlamışız gibi davranan bir program. Ha bu arada seri port üzerinden basit bir haberleşme arayüzü de var. Şimdilik bunlarla işimiz yok. Biz sadece rölemizi bağladığımız Arduino’nun bir tane dijital pinin durumunu uzaktan değiştirmeye çalışıyoruz.
Durumu değiştirmek nedir? O dijital pinin gerilim seviyesini 5V veya 0V olarak ayarlamak diyebiliriz. 5V yaptığımızda rölemiz enerjilenecek ve havyamızın (veya fişe bağlamak istediğiniz herhangi bir şeyin) çalışmaya başlamasını sağlayacak. 0V yaptığımızda ise rölemizin enerjisini kesecek, dolayısıyla havyamızın da enerjisi kesilecek.
Aslına bakarsanız hem Arduino hem de Android tarafında yazılım işini kendim halletmek isterdim ama fazla vaktim ve bluetooth haberleşme ile ilgili fazla deneyimim yok. O yüzden her iki kulvarda da hazır kod ile devam ediyoruz. Arduino’ya yüklenecek yazılım aşağıda. Ardudroid’i yazan kişi tarafından hazırlanmış:
Ardudroid Kodu
/* PROJECT: ArduDroid PROGRAMMER: Hazim Bitar (techbitar at gmail dot com) DATE: Oct 31, 2013 FILE: ardudroid.ino LICENSE: Public domain */ #define START_CMD_CHAR '*' #define END_CMD_CHAR '#' #define DIV_CMD_CHAR '|' #define CMD_DIGITALWRITE 10 #define CMD_ANALOGWRITE 11 #define CMD_TEXT 12 #define CMD_READ_ARDUDROID 13 #define MAX_COMMAND 20 // max command number code. used for error checking. #define MIN_COMMAND 10 // minimum command number code. used for error checking. #define IN_STRING_LENGHT 40 #define MAX_ANALOGWRITE 255 #define PIN_HIGH 3 #define PIN_LOW 2 String inText; void setup() { Serial.begin(9600); Serial.println("ArduDroid 0.12 Alpha by TechBitar (2013)"); Serial.flush(); } void loop() { Serial.flush(); int ard_command = 0; int pin_num = 0; int pin_value = 0; char get_char = ' '; //read serial // wait for incoming data if (Serial.available() < 1) return; // if serial empty, return to loop(). // parse incoming command start flag get_char = Serial.read(); if (get_char != START_CMD_CHAR) return; // if no command start flag, return to loop(). // parse incoming command type ard_command = Serial.parseInt(); // read the command // parse incoming pin# and value pin_num = Serial.parseInt(); // read the pin pin_value = Serial.parseInt(); // read the value // 1) GET TEXT COMMAND FROM ARDUDROID if (ard_command == CMD_TEXT){ inText =""; //clears variable for new input while (Serial.available()) { char c = Serial.read(); //gets one byte from serial buffer delay(5); if (c == END_CMD_CHAR) { // if we the complete string has been read // add your code here break; } else { if (c != DIV_CMD_CHAR) { inText += c; delay(5); } } } } // 2) GET digitalWrite DATA FROM ARDUDROID if (ard_command == CMD_DIGITALWRITE){ if (pin_value == PIN_LOW) pin_value = LOW; else if (pin_value == PIN_HIGH) pin_value = HIGH; else return; // error in pin value. return. set_digitalwrite( pin_num, pin_value); // Uncomment this function if you wish to use return; // return from start of loop() } // 3) GET analogWrite DATA FROM ARDUDROID if (ard_command == CMD_ANALOGWRITE) { analogWrite( pin_num, pin_value ); // add your code here return; // Done. return to loop(); } // 4) SEND DATA TO ARDUDROID if (ard_command == CMD_READ_ARDUDROID) { // char send_to_android[] = "Place your text here." ; // Serial.println(send_to_android); // Example: Sending text Serial.print(" Analog 0 = "); Serial.println(analogRead(A0)); // Example: Read and send Analog pin value to Arduino return; // Done. return to loop(); } } // 2a) select the requested pin# for DigitalWrite action void set_digitalwrite(int pin_num, int pin_value) { switch (pin_num) { case 13: pinMode(13, OUTPUT); digitalWrite(13, pin_value); // add your code here break; case 12: pinMode(12, OUTPUT); digitalWrite(12, pin_value); // add your code here break; case 11: pinMode(11, OUTPUT); digitalWrite(11, pin_value); // add your code here break; case 10: pinMode(10, OUTPUT); digitalWrite(10, pin_value); // add your code here break; case 9: pinMode(9, OUTPUT); digitalWrite(9, pin_value); // add your code here break; case 8: pinMode(8, OUTPUT); digitalWrite(8, pin_value); // add your code here break; case 7: pinMode(7, OUTPUT); digitalWrite(7, pin_value); // add your code here break; case 6: pinMode(6, OUTPUT); digitalWrite(6, pin_value); // add your code here break; case 5: pinMode(5, OUTPUT); digitalWrite(5, pin_value); // add your code here break; case 4: pinMode(4, OUTPUT); digitalWrite(4, pin_value); // add your code here break; case 3: pinMode(3, OUTPUT); digitalWrite(3, pin_value); // add your code here break; case 2: pinMode(2, OUTPUT); digitalWrite(2, pin_value); // add your code here break; // default: // if nothing else matches, do the default // default is optional } }
E yazılımı ardudroid halletti. Donanım zaten hazır. Röle hazır, Arduino hazır, bluetooth modülü hazır. Tek yapmamız gereken bunları birleştirmek.
Aslında sorun biraz burada başlıyor. Bizim bluetooth modülümüz 3.3V gerilim seviyesinde çalışıyor fakat arduino 5V seviyesinde. 1,7V nşa hiçbir şeye hiçbir şey yapmaz ama konu bu entegreler olduğu zaman ne yazık ki işin rengi değişiyor. Ben üniversiteye başladığımda tek tük 3.3V seviyesinde entegreler vardı ama şimdi (düşük güç harcama konusunda daha iyi olduğu için) oldukça yaygın. Eğer 3.3V ile çalışması gereken bir entegreye 5V uygularsanız, çok ekstra bir önlem alınmamışsa o entegre yanar/bozulur.
Arduino modülümüz neyse ki 3.3V besleme gerilimi sunuyor. fakat seri haberleşme pinleri (Rx ve Tx) 5V gerilim seviyesinde. Yani biz modülleri birbirine bağlayıp haberleşin dediğimiz anda HC-05 bluetooth modülümüzün haberleşme bölümü yanar:(
Bu projede yapacağımız en afili iş olduğu için uzattıkça uzatıyorum. Yapmamız gereken ya bir entegre kullanarak bu 5V seviyesini 3.3V’a düşürmek ya da basit bir gerilim bölücü devresi yaparak bu 5V seviyesini 3.3V’a düşürmek. Ucuz olduğu için ikincisini yapacağız. Devre şeması aşağıdaki gibi.
Bu gerilim bölücüyü ve bluetooth modülünü küçük bir kartta birleştirirsek daha derli toplu bir devremiz olur diye düşündüm. O yüzden yukarıdaki devre şemasını delikli pertinaks üzerine aşağıdaki gibi birleştirdim. Biraz aşağıda nasıl birleştirdiğimin videosu da var.
Arduino üzerinden Rx Tx pinlerine en yakın olduğu için 2 numaralı pini rölemizi kontrol eden dijital pin olarak seçtim. Yukarıdaki kartın daha küçük olmasını sağladı bu iş.
Eğer yeni yeni bu işlere girdiyseniz daha büyük ve kullanılmamış bir delikli pertinaks üzerine geniş geniş çalışmanızı tavsiye ederim. Yoksa videoda görebileceğiniz üzere kötü işçiliğinize yok derinlik algısıydı vay efendim kart eskiydi/kullanılmıştı diye bahaneler uydurursunuz.
Malzeme listesinde vermeyi unuttuğum ve devreyi yaptıktan her şeyin çalıştığını kontrol ettikten sonra farkettiğim bir olay. Kart tutucu almayı/yapmayı unutmuşum. Sistem hazır ama açıkta mı tutacağız? Mezarcı olduğum için (ve yaşadığım yerde böyle şeyler satılmadığı için) hazır kutu almak yerine bunu da kendim yapayım dedim. Sonra fark ettim ki bunu yapacak malzemem de (kontrplak vs.) yok. Evde malzeme aranırken iki sene önce motosikletim için aldığım kilidin plastik kutusunu (nedenini inanın bilmiyorum) sakladığım aklıma geldi. Bir şehir içi bir şehirler arası taşınma görecek kadar sahiplendiğim kutuyu kart tutucu yapmaya karar verdim. Cuk oturdu:) Tabi içindeki kartlar oynamasın diye silikonla sabitledim.
Bütün bunlardan sonra yapmamız gereken bir iş daha var. Bir dişi bir de erkek fiş yardımıyla bu sistemi sadece havya için değil, yüksek güç istemeyen diğer elektrikli cihazlar için de kullanılmasını sağlamak. Kabul etmem lazım bu proje çok özensiz oldu. Yine de iş görecektir. Kahverengi kabloyu bir karış kadar paylı bırakıp kesiyoruz. kestiğimiz kablonun bir ucunu rölenin COM klemensine, fişin de bağlı olduğu ikinci kahverengi kablonun ucunu da rölenin NO klemensine bağlayacağız. Bu bağlantı şekliyle röle enerjili değilken (kontrol pini 0V ise) şebekemiz kesimde, röle enerjiliyken (kontrol pini 5V ise) şebekemiz iletimde olacaktır.
Bu proje aslında sıfırdan bir tasarım yapmaktan ziyade var olan yazılımı ve donanımı birleştirip kullanmak üzerine kurulu. Yazılıma sistemin o anki durumunu telefondan gözetleme gibi bazı özellikler eklenebilir. Tez meselesi yüzünden şimdilik burada bırakıyorum. Tez işi bitince hem android yazılımı işini hem de arduino yazılımı işini oturup kendim yaparım (diye umuyorum). Kolay gelsin.
İlk Test Videosu









