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 kodları açıklamaya
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.
ARDUINO WEBSERVER UZERINDEN GORSEL KULLANICI ARAYUZU ILE ROLE KONTROLU
5 Mart 2015 Perşembe
Posted by MC
Elimizde arduino var.Ethernet shieldımız da bulunuyor. Webserver olarak kullanıyoruz ancak bir görsellik katamıyoruz.
#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\”>© 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]);
}
}
Ç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\”>© 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
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ış.
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ş.
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