arduino projeleri etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

DHT11 VE NOKIA 5110 EKRAN UYGULAMASI 


Merhaba arkadaşlar.Bugün elimden geldigince arduıno ile DHT11 sıcaklık ve nem sensörünü tanıtıp bunu 5110 ekranı ile kullanarak basit bir uygulama yapacagız.Öncelikle DHT11 ve 5110 ekranı biraz tanıyalım.


DHT11:Nem degerini ±%5  hassasiyetle ve sıcaklık degerini ±2°C  ölçen bir devre elemanıdır.Bu sensörü kullanmak için sadece 1 adet 10k dirence ihtiyaç duyarız.

1.bacagı :+5V
2.bacagı: arduıno da herhangi bir pine ve 10k lık direnç ile +5v baglıyoruz
3.bacagı: boş bırakıyoruz
4.bacagı:GND yanı topraga baglıyoruz.








NOKIA 5110 EKRANI:


1.RST:pin 11
2.CE: pin 12
3.DC: pin 10
4.Din: pin 9
5.Clc: pin 8
6.Vcc: 3.3 V
7.BL: pin 7
8.Gnd: Toprak

Not:Yazılım kısmında bu pinler degiştirilebilir.






5110 ekranı 16*2 lcd den daha kullanışlıdır.Şöyle açıklayayım 5110 ekranı ile resim çizimi yaparken lcd ile bunu yapmak zordur.Lcd ile yapmak istenirse bunun için graphics lcd ye ihtiyaç vardır.

Pinler arasında bilmemiz gereken tek yer bence BL pinidir.5110 ekranında yan tarafta 4 adet mavi ışık var.Bunlar sayesınde ekranı aydınlatmaya yarar.



Gelelim Kod Kısmına :


#include <dht11.h>  //Dht11 kutuphanesı
#include <LCD5110_Basic.h> //5110 kutuphanesı
LCD5110 lcd(8,9,10,11,12);   //5110 baglantı kısımları
extern uint8_t SmallFont[];  //Küçük boy yazı için
extern uint8_t MediumNumbers[]; //Orta boy rakam için
extern uint8_t BigNumbers[];  // Büyük boy rakam için
dht11 DHT11; //DHT11 adı altında degişken tanımladık
#define DHT11PIN 2 //2 nolu pin DHT11PIN ismini verdik
void setup() {

lcd.InitLCD();  //5110 ekranını hazırladık.Bu kod olmazsa olmaz kodlarımızdan bir tanesıdır.
//Ve her 5110 ekranı ugularken yazılmak zorundadır
lcd.setContrast(60); //5110 ekranı kontrastını ayarladık
digitalWrite(7,HIGH); //7 nolu pini +5 v ver
}

void loop() {

int veri=DHT11.read(DHT11PIN); //DHT11PIN deki veri degerinin oku
float x=DHT11.humidity; // Sensorden nem degerını oku ve x degişkenıne ata
float y=DHT11.temperature;//Sensorden sıcaklık degerını oku ve y degişkenıne at
lcd.setFont(SmallFont);//5110 ekranına küçük harf yazılacagını belirten kod
lcd.print("NEM",60,0);//Yatay 60,dikey 0 yerine NEM yaz
lcd.setFont(MediumNumbers);//Orta boy rakam yazılacagını belirten kod
lcd.printNumI(x,RIGHT,10);//x degişkenını dikey 10 ve saga dayalı olarak yaz
lcd.setFont(SmallFont);//5110 ekranına küçük harf yazılacagını belirten kod
lcd.print("SICAKLIK",0,0);//Yatay 0,dikey 0 yerine SICAKLIK yaz
lcd.setFont(MediumNumbers);//Orta boy rakam yazılacagını belirten kod
lcd.printNumI(y,LEFT,10);//x degişkenını dikey 10 ve sola dayalı olarak yaz


delay(3000);
}

Arduino Tanıtım

Arduino Nedir?



Bildiğiniz üzere İtalyan elektronikciler'in 
ürettiği Arduino elektronik dünyasına
 farklı bir tat getirdi.

Elektronik sektöründe büyük 
yankı getiren bu elektronik
 kart şimdiden elektronik ile ilgilenenlerin ve hobi tutkunlarının ilgisini çekmişe benziyor.







Peki Nedir Bu Arduino ?

Arduino; Bir giriş çıkış kartı ve Processing/Wiring dilinin
bir uygulamasını içeren geliştirme platformudur.Açık kaynak
kodlu olup,orta düzey bir C programlama dili ile programlanabilir
Atmega çipine sahiptir.Arduino ile interaktif projeler
yapmak kolay ve bir o kadar da eğlencelidir.
Arduino'nun kullanım amaçlarına göre çeşitleri vardır.
Örneğin;breakboard üzerinde kullanmak istiyorsanız
'Arduino Nano',biraz daha ileri seviye kullanıcılar için
'Arduino Pro' ,hobi amaçlı projeleriniz için
'Arduino Uno' tercih edilebilir.Bunların yanısıra


Arduino'nun daha bir çok çeşiti mevcuttur.

Arduino Nasıl Çalışır?

Arduino'nun çalışabilmesi için diğer mikrodenetleyiciler 
gibi uygun çalışma ortamını sağlamak gerekir.Bu koşullar için gerekli
 olan malzemeler şunlardır;

1- Arduino Kartınız (UNO, PRO Mini, Mega, Leonardo.. gibi)
2- Standart USB yazıcı kablosu
3- https://www.arduino.cc/ sitesinde açık kaynak olarak yaymlanan
 Arduino Geliştirme Programı
4- Bu özelliklere uyum sağlayacak bir bilgisayar.


Arduino Kurulumu

İndirmiş olduğunuz Arduino IDM programını
bilgisayarınıza kurdukdan 
sonra standart USB yazıcı kablosu ile
bilgisayarınıza bağlayın.
USB kablosunu bilgisayarınıza bağladıkdan
sonra bilgisayarda 
sürücü dosyalarını manuel olarak seçin
driver dosyaları 
otomatik olarak yüklenecektir.

Eğer bilgisayarınız Arduinoyu bilinmeyen
agıt olarak görüyorsa 
'Windows Aygıt Yöneticisi' nde
okuduğunuz "COM" numarası 
ile Arduino IDM geliştirme
ortamında ki "COM" 
numarasının aynı olduguna dikkat etmeliyiz.




Örneğin Windows Aygıt Yöneticisinde 
görüldüğü gibi COM5 
yazıyor ise Arduino IDM programında da 
COM5 seçili olmalıdır.

Arduino Geliştirme Ortamında COM 
değişikliği yapmak için ; "ARAÇLAR"menüsünden
 PORT ayarlarını değiştirebiliriz.







Arduino ile Yapabileceğimiz Bazı Projeler


Mesafe Park Sensörü Projesi

Ultrasonik Mesafe Park Sensörünü
geliştirme ortamı olan Arduino'da
kullandık.Bu proje otomotiv
sektöründe kullanılacağı gibi
günlük hayat da kısa mesafeleri
 ölçmek içinde kullanılabilir




Robot Kol Projesi

Arduino Robot Kol Projemiz
 3D printer teknolojisine 
dayanmaktadır. Çok esnek 
ve hızlı programlamaya 
uygundur. Arduino programlama 
konusunda bildiğiniz birçok yöntemin 
uygulama alanı olarak kullanabileceğiniz 
çok fonksiyonlu bir robottur.






Engel Algılayan Robot
Arduino Uno R3,
Adafruit Motor Shield
 ve Pololu QTR-8RC 
line sensör kullanarak 
yapılan Çizgi Takip Eden
 Robot yapabilirsiniz










Çizgi İzleyen Robot Projesi


Arduino Uno R3,
Adafruit Motor Shield ve 
Pololu QTR-8RC 
line sensör kullanarak 
yapılan Çizgi Takip 
Eden Robot yapabilirsniz.









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]);

}


}

Görünüşte oldukça basit ancak kullanışlı bir sistemden bahsedeceğiz.
Aduino ile oluşturulmuş olan bir otopark sistemi.Sistemde giriş ve çıkışa izin veren bir adet servo motora bağlanılmış kol bulunuyor.Yine sistemde araçların giriş çıkışının sağlanması ve giriş çıkış kolunun kontrolü açısından giriş ve çıkışlarda butonlar bulunmakta.Otoparkta kaç adet araçlık yer olduğunu belirtmek açısından da 7segment display kullanılmış.


Gelelim kodlama kısmına

#include <Servo.h>
Servo myservo;  // servo motor tanımlanmıs

#define ServoM    12        //servo motor kontrol pini
#define Bright    11        
#define Exit      9         //çıkış butonu tanımlanmış
#define In        8         //Giriş butonu tanımlanmış

#define BarLow    177       //Bariyerin en düşük pozisyonu ayarlanmış
#define BarUp     95        //Bariyerin en yüksek pozisyonu ayarlanmış
#define CAPACITY  8         //Otopark kapasitesi belirlenmiş
#define INTEN     80        

//7segment display bacakları tanımlanmış
#define  segA  0
#define  segB  1
#define  segC  2
#define  segD  3
#define  segE  4
#define  segF  5
#define  segG  6

//0-9 arasındaki rakamların 7 segmente gönderilmesi için bir dizi tanımlanmış
byte segments[10] = {

  B00111111, //  0
  B00000110, //  1
  B01011011, //  2
  B01001111, //  3
  B01100110, //  4
  B01101101, //  5
  B01111101, //  6
  B00000111, //  7
  B01111111, //  8
  B01101111  //  9
};

void setup(){
  myservo.attach(ServoM);// tanımlanan servo kontrol pini ile 
servo değişkeni birleşt 

  pinMode(Exit, INPUT); // çıkış butonu pini input olarak ayarlandı
  pinMode(In, INPUT);   // Giriş butonu input olarak ayarlandı
  digitalWrite(Exit, HIGH);// pull up direnci ile kullanılacak
  digitalWrite(In, HIGH);  // pull up direnci ile kullanılacak
  pinMode(segA,OUTPUT);   //her bir 7segment display bacagına gidecek 
pin output oldu
  pinMode(segB,OUTPUT);
  pinMode(segC,OUTPUT);
  pinMode(segD,OUTPUT);
  pinMode(segE,OUTPUT);
  pinMode(segF,OUTPUT);
  pinMode(segG,OUTPUT);
  pinMode(Bright,OUTPUT);
  analogWrite(Bright,255*INTEN/100);//parlaklık ayarı yapıldı
  myservo.write(BarLow);//servo motor bariyerin en dusuk pozisyonuna 
kadar hareket etti
//  delay(1000);
}

int  Available= 9;// Otoparktaki boş alan bilgisi integer
 olarak ayarlandı

//================================================================
void loop(){
Display(Available); // otoparktaki boş alan sayısı diplaye yazdırıldı
if(digitalRead(In)==0)//giriş butonuna basıldımı
{
  if(Available != 0){//otoparkta boş alan var mı ?
    Available--;// boş alan var ise boş alan sayısını 1 azalt
    myservo.write(BarUp);//bariyeri aç
    delay(3000);//3 sn gecikme
    myservo.write(BarLow);//bariyeri kapat
    }
  }
if(digitalRead(Exit)==0)// çıkış butonuna basıldı mı?
{
  if(Available != CAPACITY){//boş alan sayısı toplam kapasiteye eşit mi?
    Available++;//değilse boş alan sayısını 1 arttır
    myservo.write(BarUp);//bariyeri kaldır
    delay(3000);//3 sn bekle
    myservo.write(BarLow);// bariyeri kapat
    }
  }
}


void Display(int number){// 7segment displaye deger yazdırma fonksiyonumuz
byte segs =  ~segments[number];//"~" ortak anot için kullanıldı

digitalWrite(segA, bitRead(segs, 0) );
digitalWrite(segB, bitRead(segs, 1) );
digitalWrite(segC, bitRead(segs, 2) );
digitalWrite(segD, bitRead(segs, 3) );
digitalWrite(segE, bitRead(segs, 4) );
digitalWrite(segF, bitRead(segs, 5) );
digitalWrite(segG, bitRead(segs, 6) );
}


Sistemde birkaç değişiklik yapılabilir.

Örneğin giiş çıkış butonları yerine yaklaşım sensörleri kullanılabilir.Yine otomobilin bariyer altında olup olmadığı kontrol edilmelidir.Aracın üstüne bariyerin kapanmasını istemeyiz nihayetinde :)
Aslında oldukça sık kullanılan bir proje.Neredeyse ısınan her devrede bir sıcaklık sensörü ve bu sıcaklık sensörüne bağlı çalışan bir fan sistemi bulunmakta.Paylaşacağımız devreyi ise evinizdeki fanı oda sıcaklığına bağlı olarak hızlandırıp duruma göre yavaşlatabilirsiniz.


1 nolu analog pine bağlanmış olan lm35 sıcaklık sensöründen bilgi alınıyor.Sonrasında bu sıcaklık bilgisi bizim işleniyor ve sıcaklık durumuna göre DC fan hızlandırılıyor ya da yavaşlatılıyor.Nasıl mı ?

Arduninonun 11 nolu pwm çıkışı analog çıkış olarak kullanılmış.Daha önceki paylaşımlarımızda arduinonun pwm çıkışından nasıl analıg çıkış elde edilir paylaşmıştık.Burada kullanılan kapasitör ise fanın düzensiz çalışmasını engellemek amacı ile yani sarj ve desarj zamanları kullanılarak daha stabil bir base voltajı elde etmek için kullanılmış aynı zaman RC filtre devresi görmektedir.Burada esas husus siz pwm çıkışınızda ne kadar fazla cycle gönderir iseniz fanınız o kadar hızlı dönecektir.

Gelelim işin kod kısmına


#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);//lcd ekran noktaları belirlendi
int tempPin = A1; // lm35 sensörü okuma pini atandı
int fan = 11; // Fanın hız referans noktası
int led = 8; // led pin
int temp;
int tempMin = 30; // Fanın çalışması için min. sıcaklık seti
int tempMax = 70; // Fanın tam kapasitede çalışması için sıcaklık set değeri
int fanSpeed;// fan hızı için değişken tanımlanıyor
int fanLCD;
void setup() {
pinMode(fan, OUTPUT);// 11 nolu pwm çıkış olarak atandı
pinMode(led, OUTPUT);// fan devrede olup olmadıgını takip ledi çıkış atandı
pinMode(tempPin, INPUT);//sıcaklık degerini okuyacagımız 1 nolu analog pin giriş atandı
lcd.begin(16,2);// lcd başlatıldı
}
void loop() {
temp = readTemp(); // sıcaklık bilgisi okundu
if(temp < tempMin) { // sıcaklık bilgisi set degeri ile karsılastırıldı
fanSpeed = 0; // min set degerinden kucuk ise fan devrede degil ledi yakma
digitalWrite(fan, LOW);//fan cıkıs ucuna sıfır ver devreye sokma
}
if((temp >= tempMin) && (temp <= tempMax)) { // Sıcaklık min setten buyuk ise
fanSpeed = map(temp, tempMin, tempMax, 32, 255); // sıcaklık ile fan hızını map et
fanLCD = map(temp, tempMin, tempMax, 0, 100); // fan hızını lcd ye yaz
analogWrite(fan, fanSpeed); // 11 nolu pwm den fana hız ver
}

if(temp > tempMax) { // sıcaklıgımız maks. set degerinden fazla ise
digitalWrite(led, HIGH); // ledi yak
} else { // degilse
digitalWrite(led, LOW);//ledi sondur
}
lcd.print("TEMP: ");
lcd.print(temp); // lcd ye okdugumuz sıcaklık degerini yaz
lcd.print("C ");
lcd.setCursor(0,1); // lcd yazmayı bir alt satıra al
lcd.print("FANS: ");
lcd.print(fanLCD); // alt satıra fan hızını yaz
lcd.print("%");
delay(200);
lcd.clear();
}
int readTemp() { // int donuslu sıcaklık okuma fonksiyonumuz sıcaklıgı santigrata ceviriyor
temp = analogRead(tempPin);
return temp * 0.48828125;
}

Biraz daha bilgi verelim mesela nedir map() fonksiyonu.

Map fonksiyonu 2 fark limitlerdeki deişkenler arasında bir harita olusturur.Bu örnekte kullandığımız gibi fanımız 0 ile 255 (pwm çıkışında cycle kontrolü ile fan hızı kontrolü yapıldığından) ve sıcaklığımızın da min 30 ve maks 70 degerleri var.Map fonksiyonu bu degerler ve limitler arasındaki değişimler için karşılık oluşturur.30 sıcaklık için 10 0 cycle 40 için 50cycle 70 için 100cycle gibi.Bir nevi oransal bir kontrole sahip oluyoruz map fonksiyonu kullanarak.

Sistemin ise işleyişi gayet basit.Daha öncede bahsettiğimiz gibi her bir sıcaklık arasında bir fan hızı oluşturuluyor ve sıcaklıkla orantılı olarak fan kontrol ediliyor.Sıcaklığımız maks limit üzerine çıkarsa da uyarı ledimiz yakılıyor.






Yine yaratıcı bir fikir arduino ile birleşince karşımıza vücut bulmuş bir şekilde çıkıyor.Nedir bu?

Su seviye kontrollü pompa sürücü.

Şema
Su seviye kontrolünden başlayalım isterseniz.Dikkatinizi çektiyse su haznesinin üzerinden arduinonun 5 volt çıkışı suya daldırılmış vaziyette ve haznenin sağ tarafından ise 3 noktadan düşük seviye,orta seviye ve yüksek seviye olmak üzere 3 adet prop yerleştirilimiş.

Herbir su seviye switchi nasıl çalışır?

Yerleştirilmiş ilgili proba su teması olması halinde o prob ile 5 volt kaynağımız kısa devre olacağından transistörün base ine düşük bir miktar akım akar ve trasistörün emitter ve collector kısımları kısa devre olur ve arduinomuza o bolgeden dijital input olarak bilgi gider.

Peki sistemde su seviyesine nasıl karar verilir?

High,medium ve low olmak üzere 3 adet proba su teması halinde yüksek seviyede su var demek anlamını taşır ve su pompasını kapatırız.Medium ve low a teması halinde ise orta seviye bir su var anlamını taşıyacağından ya pompamıza düşük devirde çalışma bilgisi göndeririz ya da zamanlayıcı yardımı ile belirli süre çalıştırırız.Sadece düşük seviyesi görülmesi durumunda ise tam güç çalıştırır ve haznemizi doldururuz.

Motor nasıl sürülüyor?

Su seviye devrelerinde transistörün anahtarlama elamanı olarak kullanıldığı gibi arduinonun bir digital pini output olarak ayarlanmış ve pompayı aktif hale getirecek transistörün base ine bağlanmış.Çıkışımızın 1 olması durumunda base e bir miktar akım gidecek ve motorun çıkışı ile toprak kısa devre olacağından motorumuz çalışmaya başlayacak.

Sistemin görünüşü
Gelelim sistemin kodlarına :)


#include <LiquidCrystal.h> // lcd kütüphanesi eklenmiş
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // lcd bacakları kütüphaneye göre ayarlanmış
byte sensorPin[] = {8, 9, 10}; // su seviye sensör dijital adresleri 8-9-10 olarak ayarlandı
byte ledPin[] = {11, 12, 13}; // led pinleri ayarlandı
const byte sensors = 3;
int level = 0;
int motor = A4; // motor pini ayarlandı

void setup() {
for(int i = 0; i < sensors; i++) {
pinMode(sensorPin[i], INPUT); //sensör pinleri input haline geldi
pinMode(ledPin[i], OUTPUT); // led pinleri output haline geldi
}
pinMode(motor, OUTPUT); //motor pini output haline geldi
lcd.begin(16, 2);  //lcd başlatıldı
}

void loop() {
level = 0; // su seviyesi sıfırlandı
for(int i = 0; i < sensors; i++) {
if(digitalRead(sensorPin[i]) == LOW) { // düşük su seviyesi kontrolü
digitalWrite(ledPin[i], HIGH); // düşük ledi yakıldı
level = sensors - i; // su seviyesi dusuruldu
} else {
digitalWrite(ledPin[i], LOW); // normale döndüğünde söndürüldü
}
}
lcd.clear(); // lcd temizlendi
lcd.print("Water level");
lcd.setCursor(0,1);
switch(level) { // su seviyesi ekrana yazdırılıyor switch her seviye için kontrol ediyor.
case 1:
lcd.print("HIGH");
digitalWrite(motor, HIGH);
break;
case 2:
lcd.print("AVERAGE");
digitalWrite(motor, LOW);
break;
case 3:
lcd.print("LOW");
digitalWrite(motor, LOW);
break;
default:
lcd.print("NO WATER");
digitalWrite(motor, LOW);
break;
}
delay(50);
}


Gelilim sonuç cümlemize :)
Bu devre tabiiki profesyonel amaçlarla kullanılamaz.Gidip büyük bir su kuyusu otomasyonu yapmanız devrenin bu hali ile imkansız ancak aklıma ilk gelen :) otomatik bir kahve makinesinde su haznesi otomasyonu bu şekilde gayet rahatlıkla yapılabilir.

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

Caner ÇAKAR

ELEKTRO BLOGGER A HOŞGELDINIZ

ARAMA YAP

EN COK OKUNANLAR

- Copyright © ELEKTRO-BLOGGER Blogger