Arduino projects etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster


Rfid yani radyo dalgaları ile kimlikleme yöntemi günlük hayatımızda belkide farkında olmadan sıkça kullandığımız bir yöntem.



Bir alışveriş merkezine gittiğinizde ürünün üzerindeki tag yani rfid etiket çıkarılmadan mağazadan çıkmaya çalıştığınızda ne olur :) Alarmlar ötmeye başlar bunun nedeni rfid etiketinin çıkışta okunarak ücretinin ödenmediği bilgisini göndermesidir.

Gelelim inceleyeceğimiz projeye.Projede 125khz rfid etiketler kullanılmış.Yine bunun yanında rfid okuyucu ve 1 adet arduino bulunmakta.

Rfid okuyucu rfid taglerden gelen verileri Rx ve Tx pinleri üzerinden arduino tarafına çekmemize olanak sağlayacak.







Gelelim devremizdeki mantığa.Sistem önceden arduino kodları içerisinde tanımlamış olduğumuz rfid kartlarına izin verecek ve tanımlanmamış olan rfid kartlarına ise red yanıtı verecek.Sistem tasarlanırken software serial yani sanal rx tx pinleri tanımlanmış.Bunun nedeni eğer ki siz arduinonun fiziksel Rx ve Tx pinlerini kullanırsanız, her program güncellemesi sırasında rfid okuyucunuzun rx ve tx bağlantılarını sökmek zorunda kalırsınız aksi halde arduino üzerinde bir güncelleme gerçekleştiremezsiniz.

Gelelim kodları açıklamaya

#include <SoftwareSerial.h> // sofware serial kutuphanesi
SoftwareSerial RFID(2, 3); // RX ve TX pinlerimiz

int data1 = 0;
int ok = -1;
int yes = 13;//kabul kodumuz
int no = 12;//red kodumuz

//kabul edilecek olan 2 adet rfid tag tanımlanmış
int tag1[14] = {2,52,48,48,48,56,54,66,49,52,70,51,56,3};
int tag2[14] = {2,52,48,48,48,56,54,67,54,54,66,54,66,3};
int newtag[14] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //okunacak yeni rfid tag

void setup()
{
  RFID.begin(9600);    //software serial başladı
  Serial.begin(9600);  // seri ekran başlatıldı
  pinMode(yes, OUTPUT); // bilgi ledleri ayarlandı
  pinMode(no, OUTPUT);
}

boolean comparetag(int aa[14], int bb[14])
{
// 14 haneli rakamlardan oluşan tagleri karşılaştırma fonksiyonu
//fonksiyon kayıtlı taglarle ile okunan tagi karşılaşırıyor
  boolean ff = false; // karşılaştırma sonucu önce false olarak belirleniyor
  int fg = 0;
  for (int cc = 0 ; cc < 14 ; cc++)
  {
//for içerisinde 2 kartında her bir hanesi karşılaştırılıyor
    if (aa[cc] == bb[cc])
    {
      fg++;
    }
  }
  if (fg == 14)
  {
    ff = true;
 //tüm haneler eşit ise karşılaştırma sonucu true olarak dönüyor
  }
  return ff;
// değilse zaten false olarak belirlemiştik onu döndürüyoruz
}

void checkmytags()
{
// okunan yeni tagleri kayıtlı 2 tagimiz ile karşılaştırıyoruz
// okuan tag bizimkilerdense ok değişkenini 1 artırıyoruz
  ok = 0;
  if (comparetag(newtag, tag1) == true)
  {
    ok++;
  }
  if (comparetag(newtag, tag2) == true)
  {
    ok++;
  }
}

void readTags()
{
// tag okuma fonksiyonumuz
  ok = -1;
// okuyamadığımız zaman karşılaştırma değişkenimiz -1
//-1 bizim hata kodumuz
  if (RFID.available() > 0) //rfid okuyucudan veri geliyorsa
  {
 
    delay(100); // seri  olarak haberleşmede 100ms gecikme uyguluyoruz

    for (int z = 0 ; z < 14 ; z++) // 14 haneli tag numarasını alıyoruz
    {
      data1 = RFID.read();
      newtag[z] = data1;
    }
    RFID.flush(); // birden fazla okumayı engellemek adına
//frid registerını bosaltıyoruz

 
    checkmytags();// kayıtlı taglerle karsılastırma fonsiyonuna gonderiyoruz
  }

  if (ok > 0) // kayıtlı taglerle eşitlik var ise
  {
    Serial.println("Accepted");
// seri ekrana kabul edildi yazdırdık
    digitalWrite(yes, HIGH);
//kabul ledini yaktık
    delay(1000);
//1 sn bekledik
    digitalWrite(yes, LOW);
//kabul ledini söndürdük

    ok = -1;
//eşleşmeyi sıfırladık
  }
  else if (ok == 0)
// veri okuduk ama bizim kayıltlılarla eşleşmiyorsa
  {
    Serial.println("Rejected");
//seri ekrana reddedildi yazdık
    digitalWrite(no, HIGH);
//reddedildi ledini yaktık
    delay(1000);
//1 sn bekledik
    digitalWrite(no, LOW);
//reddedildi ledini söndürdük

    ok = -1;
//karşılaştırma değişkeninin sıfırladık
  }
}

void loop()
{
// sonsuz döngümüz içerisinde sürekli olarak okuma fonsiyonunu çağırıyoruz
  readTags();
}

Özetlemek gerekirse Arduino ile güzel bir kapı geçiş sistemi olan bu projede,ledleri kullanabileceğiniz gibi bir röle kartı vasıtası ile elektronik kapı kilitlerini de kontrol edebilirsiniz.Daha büyük bir rfid okuma sistemi ile birlike ürünlerin kontrolünü yapabilir, bir veritabanı oluşturarak ürün takip sistemi oluşturabilirsiniz.
Elimizde arduino var.Ethernet shieldımız da bulunuyor. Webserver olarak kullanıyoruz ancak bir görsellik katamıyoruz.

Çoğu zaman arduino ile webserver olarak uğraşan arkadaşlar ya sd kart üzerinden image dosyalarına ulaşmakta sıkıntı yaşıyorlar ya da ulaşabilseler bile webserverlarının cevap verme sürelerinden yakınıyorlar.Bu yazımızda tamamen CSS3 ve HTML5 kullanılarak SD karta ihtiyaç duymadan arduino da nasıl görsel bir webserver üzerinden röle kontrolü sağlanır onu açıklamaya çalışacağız.


Neler gerekli ?

1 adet Arduino 
1 ade 8li röle kartı 
1 adet ethernet kablosu
1 adet ethernet shield

Görseldeki ledler tamamen css3 kodları ile oluşturulmuş.Butonlar ise form içerisine oturtulmuş ve yine css3 ile şekilleri verilmiş.

Ufak bir uyarı : Bazı browserler CSS3 stilini tam olarak kabul etmeyebilir.Firefox,opera,safari ve IE üzerinde denendiği iddia ediliyor.Ancak en iyi sonuş safari ile alınmış.

Gelilim kod kısmımıza :



#include <Ethernet.h>

#include <SPI.h>


byte ip[] = { 192, 168, 1, 177 }; //ethernet shield için ip miz

byte gateway[] = { 192, 168, 1, 254 }; //alt ağ geçidimiz

byte subnet[] = { 255, 255, 255, 0 }; //alt ağ maskemiz


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }//mac adresi tanımlandı


EthernetServer server = EthernetServer(80); //80 portu üzerinden çıkış yapılacak


int outputQuantity = 8; //toplam röle çıkış adedi belirlenmiş


int outputLowest = 2;// en düşük röle pinimiz 2 oldu röle çıkışlarımız 2 nolu pinden başlayacak


int outp = 0; // çıkış verme değişkenimiz tanımlandı

boolean printLastCommandOnce = false;

boolean printButtonMenuOnce = false;

boolean initialPrint = true;

String allOn = “”;// tüm röleleri çektirme değişkenimiz

String allOff = “”;//tüm röleleri bıraktırma değişkenimiz

boolean reading = false;//arduino internet sayfamızdan okuma yapsınmı yapmasınmı değişkeni

boolean readInput[10]; //Form üzerinden alacağımız bilgi adeti

void setup(){

Serial.begin(9600);


//Pin 10,11,12 & 13 ethernet shield tarafından kullanılıyor

//for döngüsü içerisinde en düşük pinimiz 2 den başlayarak röle adetimiz kadar pini output yapıyoruz

for (int var = outputLowest; var < outputLowest + outputQuantity; var++) {

pinMode(var, OUTPUT);

}


Ethernet.begin(mac, ip, gateway, subnet); //ethernet bağlantımızı yukarıdaki ayarlarımız ile başlatıyoruz


server.begin();//serverımızı başlatıyoruz

Serial.println(Ethernet.localIP());//seri monitor üzerine mevcut arduino ipmizi yazdırıyoruz

}


void loop(){


//Gelen client varmı ? kontrol ediyoruz

checkForClient();

}


void checkForClient(){// client kontrol fonksiyonu tanımlanmış


EthernetClient client = server.available();//server olduğu sürece client adı altında gelen clientları kabul ediyoruz


if (client) {


// http isteği boş bir satır ile sonlanır bu değişkenlerimizi tanımlıyoruz

boolean currentLineIsBlank = true;

boolean sentHeader = false; // sitemizin header kısmını daha göndermiyoruz


while (client.connected()) { // clientımız serverımıza bağlı kaldığı sürece

if (client.available()) { // client hala var mı ?


if(!sentHeader){ // sitenin header kısmı daha gönderilmedi ise

//sitenin header kısımlarını gönderiyoruz.

client.println(“HTTP/1.1 200 OK”);

client.println(“Content-Type: text/html”);

client.println(“Connnection: close”);

client.println();

client.println(“<!DOCTYPE HTML>”);

client.println(“<head>”); // header kısmını sonlandırdık


// sitemizin başlığı yazdırıyoruz

client.println(“<title>Ethernet Switching</title>”);

client.println(“<meta name=\”description\” content=\”Ethernet Switching\”/>”);


// 5 saniyede bir clientın görüntülediği websitemizi yenileyerek bilgilerimizi alacağız

client.println(“<meta http-equiv=\”refresh\” content=\”10; url=/\”>”);


// diğer browserlar için destek verme kısımları bir nevi browserın desteğine göre özellik kısıtlama

client.println(“<meta name=\”apple-mobile-web-app-capable\” content=\”yes\”>”);

client.println(“<meta name=\”apple-mobile-web-app-status-bar-style\” content=\”default\”>”);

client.println(“<meta name=\”viewport\” content=\”width=device-width, user-scalable=no\”/>”);


//Css kodlarımızı yerleştirmeye başlıyoruz

client.println(“<style type=\”text/css\”>”);

client.println(“”);


//Sitenin genel olarak görünümü ayarlanıyor

client.println(“html { height:100%; }”);


client.println(“ body {“);

client.println(“ height: 100%;”);

client.println(“ margin: 0;”);

client.println(“ font-family: helvetica, sans-serif;”); // yazıların font ayarı

client.println(“ -webkit-text-size-adjust: none;”);

client.println(“ }”);

client.println(“”);

client.println(“body {“);

client.println(“ -webkit-background-size: 100% 21px;”); // arka plan ebat yüzdesi

client.println(“ background-color: #c5ccd3;”);/arka plan rengi

client.println(“ background-image:”);//arka plan resmi

client.println(“ -webkit-gradient(linear, left top, right top,”);//gradient tanımlama yapılmış

client.println(“ color-stop(.75, transparent),”);//gradient nerede bitecek

client.println(“ color-stop(.75, rgba(255,255,255,.1)) );”);

client.println(“ -webkit-background-size: 7px;”);//arka plan ebatları

client.println(“ }”);

client.println(“”);

client.println(“.view {“);

client.println(“ min-height: 100%;”);

client.println(“ overflow: auto;”);

client.println(“ }”);

client.println(“”);

client.println(“.header-wrapper {“);// ethernet switching yazdırdığımız kuşak olan kısım

client.println(“ height: 44px;”);

client.println(“ font-weight: bold;”);

client.println(“ text-shadow: rgba(0,0,0,0.7) 0 -1px 0;”);

client.println(“ border-top: solid 1px rgba(255,255,255,0.6);”);

client.println(“ border-bottom: solid 1px rgba(0,0,0,0.6);”);

client.println(“ color: #fff;”);

client.println(“ background-color: #8195af;”);

client.println(“ background-image:”);

client.println(“ -webkit-gradient(linear, left top, left bottom,”);

client.println(“ from(rgba(255,255,255,.4)),”);

client.println(“ to(rgba(255,255,255,.05)) ),”);

client.println(“ -webkit-gradient(linear, left top, left bottom,”);

client.println(“ from(transparent),”);

client.println(“ to(rgba(0,0,64,.1)) );”);

client.println(“ background-repeat: no-repeat;”);

client.println(“ background-position: top left, bottom left;”);

client.println(“ -webkit-background-size: 100% 21px, 100% 22px;”);

client.println(“ -webkit-box-sizing: border-box;”);

client.println(“ }”);

client.println(“”);

client.println(“.header-wrapper h1 {“);//ethernet switching başlık stilimiz

client.println(“ text-align: center;”);

client.println(“ font-size: 20px;”);

client.println(“ line-height: 44px;”);

client.println(“ margin: 0;”);

client.println(“ }”);

client.println(“”);

client.println(“.group-wrapper {“);// butonlarımızın içerisinde yer alacağı beyaz grup alanı

client.println(“ margin: 9px;”);

client.println(“ }”);

client.println(“”);

client.println(“.group-wrapper h2 {“);

client.println(“ color: #4c566c;”);

client.println(“ font-size: 17px;”);

client.println(“ line-height: 0.8;”);

client.println(“ font-weight: bold;”);

client.println(“ text-shadow: #fff 0 1px 0;”);

client.println(“ margin: 20px 10px 12px;”);

client.println(“ }”);

client.println(“”);

client.println(“.group-wrapper h3 {“);

client.println(“ color: #4c566c;”);

client.println(“ font-size: 12px;”);

client.println(“ line-height: 1;”);

client.println(“ font-weight: bold;”);

client.println(“ text-shadow: #fff 0 1px 0;”);

client.println(“ margin: 20px 10px 12px;”);

client.println(“ }”);

client.println(“”);

client.println(“.group-wrapper table {“);

client.println(“ background-color: #fff;”);

client.println(“ -webkit-border-radius: 10px;”);


client.println(“ -moz-border-radius: 10px;”);

client.println(“ -khtml-border-radius: 10px;”);

client.println(“ border-radius: 10px;”);


client.println(“ font-size: 17px;”);

client.println(“ line-height: 20px;”);

client.println(“ margin: 9px 0 20px;”);

client.println(“ border: solid 1px #a9abae;”);

client.println(“ padding: 11px 3px 12px 3px;”);

client.println(“ margin-left:auto;”);

client.println(“ margin-right:auto;”);


client.println(“ -moz-transform :scale(1);”); // Mozilla Firefox desteği

client.println(“ -moz-transform-origin: 0 0;”);


client.println(“ }”);

client.println(“”);


//ledimizin on yani yeşil yuvarlak görünümünü ayarlıyoruz

client.println(“.green-circle {“);// yeşil yuvarlak görünüm stili

client.println(“ display: block;”);

client.println(“ height: 23px;”);

client.println(“ width: 23px;”);

client.println(“ background-color: #0f0;”);

//client.println(“ background-color: rgba(60, 132, 198, 0.8);”);// yeşil rengimizi verdik

client.println(“ -moz-border-radius: 11px;”);

client.println(“ -webkit-border-radius: 11px;”);//radius veriyoruz yuvarlak hale getiriyoruz

client.println(“ -khtml-border-radius: 11px;”);

client.println(“ border-radius: 11px;”);

client.println(“ margin-left: 1px;”);


client.println(“ background-image: -webkit-gradient(linear, 0% 0%, 0% 90%, from(rgba(46, 184, 0, 0.8)), to(rgba(148, 255, 112, .9)));@”);

client.println(“ border: 2px solid #ccc;”);

client.println(“ -webkit-box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px;”);

client.println(“ -moz-box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px; /* FF 3.5+ */”);

client.println(“ box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px; /* FF 3.5+ */”);


client.println(“ }”);

client.println(“”);


//ledimizin röle çekmezken off halindeki kırmızı yuvarlak görünüm stili

client.println(“.black-circle {“);

client.println(“ display: block;”);

client.println(“ height: 23px;”);

client.println(“ width: 23px;”);

client.println(“ background-color: #040;”);

client.println(“ -moz-border-radius: 11px;”);

client.println(“ -webkit-border-radius: 11px;”);

client.println(“ -khtml-border-radius: 11px;”);

client.println(“ border-radius: 11px;”);

client.println(“ margin-left: 1px;”);

client.println(“ -webkit-box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px;”);

client.println(“ -moz-box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px; /* FF 3.5+ */”);

client.println(“ box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px; /* FF 3.5+ */”);

client.println(“ }”);

client.println(“”);


//kırmızı ve yeşil ledlerin her ikisinede parlaklık efekti katıyoruz

client.println(“ .glare {“);

client.println(“ position: relative;”);

client.println(“ top: 1;”);

client.println(“ left: 5px;”);

client.println(“ -webkit-border-radius: 10px;”);

client.println(“ -moz-border-radius: 10px;”);

client.println(“ -khtml-border-radius: 10px;”);

client.println(“ border-radius: 10px;”);

client.println(“ height: 1px;”);

client.println(“ width: 13px;”);

client.println(“ padding: 5px 0;”);

client.println(“ background-color: rgba(200, 200, 200, 0.25);”);

client.println(“ background-image: -webkit-gradient(linear, 0% 0%, 0% 95%, from(rgba(255, 255, 255, 0.7)), to(rgba(255, 255, 255, 0)));”);

client.println(“ }”);

client.println(“”);


//sitemizin header kısmını sonlandırıyoruz

client.println(“</style>”);

client.println(“</head>”);


// sitemizin body yani gövde kısmını oluşturuyoruz

client.println(“<body>”);

client.println(“<div class=\”view\”>”);

client.println(“ <div class=\”header-wrapper\”>”);

client.println(“ <h1>Ethernet Switching</h1>”);

client.println(“ </div>”);

client.println(“<div class=\”group-wrapper\”>”);

client.println(“ <h2>Switch the required output.</h2>”);

client.println();


sentHeader = true; //sitemizin header kısmını yukarıda yerleştirmiştik artık header kontrol değişkenimizi true yapabiliriz.

}


char c = client.read(); // client tarafından gelecek char değişkenimizi okuyoruz


if(reading && c == ‘ ‘){ // okuma ve gelen veri yok ise

reading = false; // okuma değişkenini false yaparak okuma yok bilgisi tanımlıyoruz

}


if(c == ‘?’) { // gelen veri ? ise yani hazırmısın bilgisi ise

reading = true; //okuma değişkenimizi true yani okuma var olarak değiştiriyoruz

}


if(reading){ okuma var mı ?

if(c == ‘H’) {outp = 1;} // gelen veri H (HIGH anlamında) çıkışlara yazdıcağımız veri 1

if(c == ‘L’) {outp = 0;}// gelen veri L(LOW anlamında) çıkışlara yazdıracağımız veri 0

Serial.print(c); //gelen veriyi seri monitore yazdır

//output değişkenini aldık sırada clienttan gelen veriye göre hangi pinlere outputu vereceğiz

switch (c) {

case ’2′://gelen veri 2 ise

//2 nolu pine outp değişkenini bas

triggerPin(2, client, outp);

break;

case ’3′:// gelen veri 3 ise

//3 nolu pine outp değişkenini bas

triggerPin(3, client, outp);

break;

case ’4′:

triggerPin(4, client, outp);

break;

case ’5′:

triggerPin(5, client, outp);

break;

case ’6′:

triggerPin(6, client, outp);

break;

case ’7′:

triggerPin(7, client, outp);

break;

case ’8′:

triggerPin(8, client, outp);

break;

case ’9′:

triggerPin(9, client, outp);

break;

}


}


if (c == ‘\n’ && currentLineIsBlank){ //cleinttan bilgi kesildi ise

printLastCommandOnce = true; // son komutları bir kez daha tekrarla

printButtonMenuOnce = true; // ekrana buton menusunu bir kez daha bastır

triggerPin(777, client, outp); //verileri tekrar oku ancak outputlara uygulama (777 outputlara veri gonderimi engellemek için kullanılmıi)

break; // döngüyü kır

}

}

}


//Çıkmadan önce değişkenlerimizi sıfırlıyoruz Bir sonraki bağlantı için

printLastCommandOnce = false;

printButtonMenuOnce = false;


allOn = “”;

allOff = “”;

client.println(“\n<h3 align=\”center\”>&copy; Author – Claudio Vella <br> Malta – October – 2012</h3>”);

client.println(“</div>\n</div>\n</body>\n</html>”);


delay(1); // webbrowser için gecikme tanımlanmış

client.stop(); // client kapatıldı.


}


}


void triggerPin(int pin, EthernetClient client, int outp){

//triggerPin fonksiyonumuz pin numarası,client ve outp değişkeni ile birlikte çağrılabilir


//çıkış ayarları

if (pin != 777){ // pin 777 değilse (daha önce hiçbir outputa bastırmamak için kullandık)

if(outp == 1) { // yazdırılmak istenen değer 1 ise

digitalWrite(pin, HIGH);// ilgili pini High yap

}

if(outp == 0){//yazdırılmak istenen veri 0 ise

digitalWrite(pin, LOW);//ilgili pini Low yap

}

}

//okunan deiğişkenleri refresh ediyoruz

readOutputStatuses();


//Butonları ekrana yazdırıyoruz

if (printButtonMenuOnce == true){ // butonlar websitesinde 1 kere mi yazdırılıyor?

printHtmlButtons(client); // evet ise site görüntüsüne butonları bastır

printButtonMenuOnce = false;// artık ile defa butonlar bastırılıyor değişkenimizi false yapıyoruz.

}


}


//ekrana butonlarımızı ve yesil kırmızı ledlerimizi bastırdığımız fonksiyonumuz

void printHtmlButtons(EthernetClient client){


//html tablo oluşturmaya başladık form olarak

client.println(“”);

//client.println(“<p>”);

client.println(“<FORM>”);

client.println(“<table border=\”0\” align=\”center\”>”);


//her bir butonu teker teker web sitesine bastırıyoruz

for (int var = outputLowest; var < outputLowest + outputQuantity; var++) {


//tümünü aç ya da tümünü kapa değişkenlerimizi tanımlıyoruz

allOn += “H”;

allOn += var;

allOff += “L”;

allOff += var;


//tablomuzun satır başlangıcını yazdırıyoruz

client.print(“<tr>\n”);


//on butonlarımız web sitesine yazdırılıyor

client.print(” <td><INPUT TYPE=\”button\” VALUE=\”Switch ON – Pin “);

client.print(var);

client.print(“\” onClick=\”parent.location=’/?H”);

client.print(var);

client.print(“‘\”></td>\n”);


//off görsellerimiz yerleştiriliyor

client.print(” <td><INPUT TYPE=\”button\” VALUE=\”Switch OFF – Pin “);

client.print(var);

client.print(“\” onClick=\”parent.location=’/?L”);

client.print(var);

client.print(“‘\”></td>\n”);


//ilk kırmızı ve yeşil ledlerimiz yerleştiriliyor

if (readInput[var] == true){

client.print(” <td><div class=’green-circle’><div class=’glare’></div></div></td>\n”);

}else

{

client.print(” <td><div class=’black-circle’><div class=’glare’></div></div></td>\n”);

}


//tablomuzun satırları sonlandırılıyor

client.print(“</tr>\n”);

}


//tümünü on yap butonu ekleniyor

client.print(“<tr>\n<td><INPUT TYPE=\”button\” VALUE=\”Switch ON All Pins”);

client.print(“\” onClick=\”parent.location=’/?”);

client.print(allOn);

client.print(“‘\”></td>\n”);


//tümünü off yap butonu ekleniyor

client.print(“<td><INPUT TYPE=\”button\” VALUE=\”Switch OFF All Pins”);

client.print(“\” onClick=\”parent.location=’/?”);

client.print(allOff);

client.print(“‘\”></td>\n<td></td>\n</tr>\n”);


//tablo ve formumuz sonlandırılıyor

client.println(“</table>”);

client.println(“</FORM>”);

//client.println(“</p>”);


}


//Çıkış değişken bilgileri clienttan alınıyor

void readOutputStatuses(){

for (int var = outputLowest; var < outputLowest + outputQuantity; var++) {

readInput[var] = digitalRead(var);

//Serial.print(readInput[var]);

}


}




Yaratıcı arduino projelerinden belkide en ilgi çekici olanı arduino ile ev otomasyonu yapımı.
Bu projede evin iklimlendirmesi, güvenliği ve aydınlatma kontrolü ele alınmış.Gelin genel olarak kullanılan ekipman listesine bir bakalım.














1 adet Arduino geliştirme kartı
1 adet  homeeasy controller - HE300
1 prototip board u - Vero board
10 adet direnç - 47 ohm
10 adet led
4 adet  opto izolatör - RS part 308-613


Genel olarak sistem nasıl işliyor ?

Uzaktan kumanda edilecek olan röleler opto kupler kullanılarak kontrol ediliyor.Neden opto kupler ile kontrol ediyoruz.Çünkü opto kupler bize geliştirme kartından bağımsız yüksek güçlerde röle çektirmemizi sağlıyor.Bunu nasıl yapıyor ?


Kontrol kartımızdan gelen 3.3 ya da 5V dijital bilgi opto kuplerimiz içerisinde bulunan ledi yakarak ışığa duyarlı olan transistörü tetikler ve bu durumda transistörün kollektöründen emitterine akım akmaya başlıyor.Emitter tarafıda 10k ohm gibi bir direnç bağlayarak buradan röle çektirme gücümüzü almış oluyoruz.


Yukarıdaki resimde görüleceği üzere 4 adet opto kupler her biri içerinde 2 şer adet kupler bulunan entegrelerle 8 kanallı bir sistem oluşturulmuş.Bu ne demek sekiz adet röleyi kontrol kartımızdan izole edilmiş halde çektirebiliriz anlamını taşıyor.


Uzaktan kumanda sisteme uygun hale getirilmiş.Kullanılacak olan her butonun ortak uçları ve tetikleme uçları alınarak arduinoya gönderilmiş.

Gelelim yazılım kısmını irdelemeye :)
Yazılım kısmında seri haberleşme ile kontrol ele alınmış.




char val; // seri haberleşme portundan gelecek olan komutu tutacak olan değişkenimiz







void setup()

{

pinMode(2, OUTPUT); // 2 den baslayarak 11 e kadar olan dijital noktalarımızı

pinMode(3, OUTPUT); // output olarak ayarlıyoruz

pinMode(4, OUTPUT); //

pinMode(3, OUTPUT); //

pinMode(6, OUTPUT); //

pinMode(7, OUTPUT); //

pinMode(8, OUTPUT); //

pinMode(9, OUTPUT); //

pinMode(10, OUTPUT); //

pinMode(11, OUTPUT); //




Serial.begin(9600); // 9600 baudrate ile seri haberleşmemizi başlatıyoruz.




}




void loop() {

if( Serial.available() ) //Seri haberleşme hazır mı?

{;}

val = Serial.read(); // hazırsa komutu val içine al




if( val == 'h' ) // val = h ise ısıtma sistemini durdur.




{

digitalWrite(2, HIGH); // 2 nolu çıkışa 1 yaz

delay(1000); // 1 saniye bekle

Serial.println("h = Heating off"); // seri monitöre ısıma kapalı yaz

digitalWrite(2, LOW); // 2 nolu çıkışı tekrar 0 yap




}

if( val == 'H' ) // Gelen komut H ise

{

digitalWrite(3, HIGH); //3 nolu çıkışı 1 yap

delay(1000); //

Serial.println("H = Heating on"); Seri Monitore ısıtma devrede yaz

digitalWrite(3, LOW); // 3 nolu çıkışı 0 yap

}

if( val == 's' ) //

{

digitalWrite(4, HIGH);

delay(1000); //

Serial.println("s = gate off"); elektronik kilit kapalı

digitalWrite(4, LOW); //

}

if( val == 'S' ) // if '5' was received

{

digitalWrite(5, HIGH); //

delay(1000); //

Serial.println("S = gate on"); elektronik kilit açık

digitalWrite(5, LOW); //

}

if( val == 'g' ) //

{

digitalWrite(6, HIGH); //

delay(1000); //

Serial.println("g = Garden lights off"); //bahçe ışıkları kapalı

digitalWrite(6, LOW); //

}

if( val == 'G' ) //

{

digitalWrite(7, HIGH); //

delay(1000); //

Serial.println("G = Garden lights on");// Bahçe ışıkları açık

digitalWrite(7, LOW); //

}

if( val == 'b' ) //

{

digitalWrite(8, HIGH); //

delay(1000); //

Serial.println("b = Bedroom light off");//yatak odası ışıkları kapalı

digitalWrite(8, LOW); //

}

if( val == 'B' ) //

{

digitalWrite(9, HIGH); //

delay(1000); //

Serial.println("B = Bedroom light on");// yatak odası ışıkları açık

digitalWrite(9, LOW); //

}







}




Sistemi özetlemek gerekirse:

komutlar :

H: ısıtma sistemini devreye al ve ısıtma açıldı ledini 1 saniye yak ve söndür

h:ısımta sistemini devre dışı bırak ve ısıtma kapatıldı ledini 1 saniye yak ve söndür

G:Bahçe ışıklandırmasını aç ve ışıklandırma açıldı ledini 1 saniye yak ve söndür.

g: Bahçe ışıklandırmasını kapa ve ışıkladırma ledini yak ve 1 saniye sonra söndür

B:Yatak odası ışıklarını aç ve ışıklar açıldı ledini 1 saniye yak ve söndür

b:Yatak odası ışıklarını kapa ve ışıklar kapandı ledini 1 saniye yak ve söndür

S:Elektronik kapı kilidini aç ve kilit açıldı ledini 1 saniye yak ve söndür

s:elektronik kapı kilidini kitle ve kilitlendi ledini 1 saniye yak ve söndür




Her bir durum kontrolü için atanmış çıkışlar üzerinden optokuplerler aracılığı ile rölelerin çektirilme mantığı ile birlikte sistem on / off olarak kontrol edilmiş.




Neler eklenebilir ?




1.PWM çıkışı ile birlikte gerek pulse göndererek ya da gerekse 0-10V gönderilmesi ile dimmer kontrolü sağlanabilir




2.Seri haberleşme olarak değilde bir Ethernet shiled ve sabit ip aracılığı ile birkaç basit php ve html bilgisi ile webbrowser üzerinden kontrol sağlanabilirdi (farklı kablosuz haberleşme metodları da kullanabilir :) )




3.Güvenlik kısmı azınlıkta kalmış.Sisteme duman sensörü,su baskını sensörü gibi farklı güvenlik kontrol sensörlerinin bağlantısı da sağlanabilir.




Şu anda aklıma gelenler bunlar :) Sizlerde yorumlarınızla aklınıza gelen eklemeleri paylaşabilirsiniz ve bunu gerek facebook grubumuzda gerekse sohbet bölümümüzde tartışabiliriz.




Bir sonraki yazımda görüşmek dileği ile ...




Yazar: Caner ÇAKAR

ELEKTRO BLOGGER A HOŞGELDINIZ

ARAMA YAP

EN COK OKUNANLAR

- Copyright © ELEKTRO-BLOGGER Blogger