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.
Uzaktan havya aç kapa (Durumunu gözle)
Sistemin durumunu belirten gösterge (led)
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.
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ış:
/*
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.