Arduino(Ethernet Shield)’nun Web Server Olarak Kullanımı

Problem
Arduino ve Ethernet Shiled ile   web server elde etmek istiyoruz.  Örneğin,  web browser ?ımızda  Arduino analog pinlerine bağlı sensörlerimizden ölçtüğümüz değerleri görüntülemek istiyoruz.

Çözüm

     Önceki twitter yazımızdaki   gibi  ilk önce Ethernet ve IP ayarlarımızı yapacağız  ardından analog Pin?lerden okunulan değerleri,  program içerisinde girdiğimiz IP adresini  Web Browser?ımıza girerek görüntüleyeceğiz.

Gerekli Olan  Elemanlar

 Arduino Uno  veya benzeri?

Arduino Ethernet Shield 

-Kablo veya jumper kullanın daha pratik olur.

-Bir tane de kitabınız olsun başucunuzda. Arduino hakkında yazılmış tek Türkçe kitap olan Elektronik Mühendisi Coşkun Taşdemir?in kitabı burada kullandığımız analoglar hakkında detaylı bilgileri almanızı sağlayacaktır.

 

#include <SPI.h>

#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; /* Media Access control – ortam erişim kontrolü, 6 byte?tan oluşmakta ethernet donanım adresi diyebiliriz Ethernet modulleri üzerinde de yazılır. Robotistan Ethernet Module sayfasında alttan çekilen fotoğrafta yeralmakta – (Şekil-1) */

 

 

Şekil-1 Arduino Ethernet Shield alt kısım (MAC adress)

 

byte ip[] = { 192, 168, 1, 177}; // cihaz IP adresimiz.

EthernetServer server(80); /* PC?miz için varsayılan telnet portumuz hadi biz buna HTTP Kontrol Portu diyelim(port 80).*/

void setup()

{

Ethernet.begin(mac, ip); /* sadece mac ve ip başlatmak yeterli. Eğer yukarıda gateway ve subnet?te belirtseydik burada onlarıda eklerdik(mac,ip,gateway,subnet) şeklinde ve onları da başlatmış olurduk.*/

server.begin(); /*bu komut server?ımızı azarlar ve gelen bağlantıları dinlemesini emreder*/

}

void loop()

{

EthernetClient client = server.available(); /*  Eğer web browser’ın okumak için hiçbir data?sı yok ise bu nesne (aşağıda örnek kod içerisinde belirtildiği üzere) bir if ifadesi içerisinde false olarak değerlendirilecek. Hadi devam edelim şimdi istemciye şartlarımızı söyleyelim bilgilerimizi alacak bir sensör bilgisi bile bizim için önemli, ağırdan satalım onun için. */

if (client) {

boolean current_line_is_blank = true; /* bir http isteği boş bir satır ile biter*/

  while (client.connected()) {

if (client.available()) {

char c = client.read();

/*eğer satır sonuna gelindi ise ve bu satır boş ise http isteğimiz sona erdi demektir. Dolayısıyla bir cevap gönderebiliriz. */

if (c == ‘\n’ && current_line_is_blank) {

client.println(“HTTP/1.1 200 OK”); //  standart http yanıt başlığı gönderir

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

client.println();

for (int i = 0; i < 7; i++) { /*Döngümüzü yazıyoruz kaç tane sensör varsa o kadar değişken giriyoruz döngü içerisine o kadar input değeri vardır.

/*web browser?a analog input?lardan okunan değerlerimizi yazdırmak istiyoruz. */

client.print(“analog input “);

client.print(i); //hangi analog input olduğu yazılsın.

client.print(” is “);

client.print(analogRead(i));/* i. inci analog pine bağlı sensörden okunan değeri browser?a yazdırıyoruz.*/

client.println(“<br />”); /* browser?ımızda(?html?den hatırlarız.) bir satır atlatalımda veriler birbirine girmesin*/

/** Bu ?client.print? lardan sonra şu şekilde çıkışlar görüntüleyeceğiz.

?Analog input is 0.06

        Analog input is 0.7?

        Analog input is 0.7?

        Analog input is 0.7?

        Analog input is 0.7?

        Analog input is 0.7?

        Analog input is 0.7?

       ?

**/

 

}

break;

}

if (c == ‘\n’) {

current_line_is_blank = true;// Yeni bir satıra başlıyoruz.

} else if (c != ‘\r’) {

current_line_is_blank = false;

}

}

}

delay(1);// browser?ımıza verileri almak için biraz zaman verelim

client.stop();

}

}

 SONUÇ

Böylelikle arduino analog pinlerinden okuduğumuz değerleri Ethernet module aracılığı ile web browser?ımızda local IP adresimiz üzerinden görebileceğiz.  Daha ucuz Ethernet Shield’ler kullanarak bu işlemleri yapabilirsiniz.  Bunun için İsmail Buçgün‘ün yazmış olduğu yazıyı da okuyabilirsiniz . Yazı da belirtilen Arduino bağlantılarını kullanarak gayet ucuz bir web server elde edebilirsiniz.  Kolay gelsin.

Kaynaklar

http://arduino.cc/en/Reference/ServerAvailable

http://arduino.cc/en/Reference/ClientConnected

http://arduino.cc/it/Reference/ClientAvailable

http://arduino.cc/it/Reference/ClientRead

http://arduino.cc/en/Reference/Ethernet

Arduino cookbook**

 

Yücel Çetin

İstanbul Üniversitesi Elektrik-Elektronik Mühendisliği'nde öğrenci, Arduino sevdalısı, python meraklısı bir canlı...

46 comments

  1. 13.murat dedi ki:

    60 adet analog bilgiyi internet sayfasında yayınlamak istiyorum bunun için en az hangi donanımları kullanmalıyım ardunuoları her bir ardunu için bir internet eklentisimi almam gerekiyor tam olarak çözemedim

  2. Yalçın ARI dedi ki:

    Merhaba paylaşımınız önce çok teşekkür ederim. Elimde Ardiuno Mega ve Ardiuno Wifi Shield var. Ve sizin Arduino ve Ethernet Shiled ile yaptığınız web server’ı bunlarla yapmak istiyorum. Aynı şekilde Web Browser’da Arduino analog pinlerine bağlı sensörlerden ölçtüğüm değerleri görüntülemek istiyorum. Bu mümkün müdür? Yaptığım bazı araştırmalar sonrasında kod içerisinde belirlediğimiz IP adresini wifi Shield ile nasıl yapacağımı çözemedim.

    Şimdiden çok teşekkürler

  3. Ömer Koman dedi ki:

    2 tip wifi sield var biri sadece seralden calisir rx tx portuna baglanir tcp stack kendi icindedir kullanimi basittir. Digeri spi ile baglanir tcp stack arduinodadir. Her modulun yontemleri kendine goredir kutuphaneleride cok ayridir ethernetteki ornekler size uymaz. Wifide modul AP modunda calisirsa baskasekilde baglanmaniz gerekir modul mevcut wifi agina baglanip bu agdaki clientler wifi module baglanacaksa cok ayri isler yapmaniz lazim. Aldiginiz modulun orneklerini ve network ve authantication ve tcp socket programlamayi da calis gel. İyi gunleeer 🙂

  4. elektroS dedi ki:

    Hocam bende leonardo var.
    examples altında
    Webserver programını yükledim.
    Ama şöyle bir sorun oldu herhalde.
    Ethernet serverin başlaması için önce seri iletişimin başlamasımı gerek!
    bu satırı okurmusunuz? Programdan alıntıdır!


    void setup() {
    // Open serial communications and wait for port to open:
    Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
    }

    // start the Ethernet connection and the server:
    Ethernet.begin(mac, ip);

  5. Kürşad ALTAN dedi ki:

    Hocam merhaba yazınız için teşekkür ederim öncelikle.. Arduino bir arkadaşımda var ve o pratikliği görünce inanılmaz heves ettim. Bende başlamak istiyorum.. Arduino almak istiyorum mega alacağım büyük ihtimalle. Size sormak istediğim soru yazıda da belirttiğiniz gibi erhernet shield mı almalıyım bu iş için yoksa ENC28J60 Ethernet Modülü mü ? Farkları nelerdir ? Hangisinin kullanım alanı daha geniştir ?

  6. Ömer Koman dedi ki:

    arduinonun kendı resmı erhernet modulu farklı bir işlemci(w5100)kullanır fiyatı bıraz daha pahalı bütçe problemi varsa enj28j60 alırsın o daha ucuza gelir. kullanım olarak ikisi faklı kutuphaneler kullanır mesela enj28j60 ta dhcp den otomatik ip aldırma yoktur standart kutuphanesinde sonradan bazı kişiler eklemiştir bazen yamulabılır. arduinonun resmi kutuphanesi bıraz daha yetenekli. sen karar verirsin
    şu forumda karşılaştırmış http://forum.arduino.cc/index.php/topic,115464.0.html eğer tcp ip ve internet programcılığı biliyorsan hepsinin zorluk derecesi sana aynı gelir, w5100 un önü daha açık kullanımı daha kolay filan, enj ilede şunu da yapamadım diyen de görmedim ama… her ikisi içinde bol örnek var.

  7. Fatma Y. dedi ki:

    Hocam ethernet shilde yeni başlıyoruz. İlk önce DhcpAddressPrinter örnek kodları ile ip adresini buldum. WebServer örnek kodu üzerinde ip adresime bunu yazdım. Kodu Ardunioya yükledim. Aynı ip yi browsera yazdım. Ancak ulaşılamıyor. Neden olabilir hocam.

  8. semih y. dedi ki:

    byte mac[] kısmında bu örnekte ve arduino ide üzerindeki örnekte verilen mac adresinde herhangi bir değişiklik yapıldığında ‘Unable to connect’ veya zaman aşımı hatası alıyorum. Cihaz üzerindeki mac adresini girdğimde de aynı hatayı alıyorum. Örnekte verilen mac adresini kullanmak zorunda olmadığımızı düşünerek neden böyle bi hata verdiğini anlamadım.

    • semih y. dedi ki:

      kodu derledikten sonra ethernet kablosunu takıp çıkardım düzeldi ama mac adresine ne yazarsam yazayım böyle yaptığımda sayfa normal çalışıyor onu da anlamış değilim.

      • Ömer Koman dedi ki:

        arp network yapısı böyle çalışıyor ondan. herşey mac adres tablosundan yönetilir siz her mac değiştirdiğinizde rooter tabloda size yeni bir yer açıyor ve o ip paketlerini o mac adrese yönlendiriyor siz kabloyu her çıkarıp taktığınızda bu tablo yenilenip güncellenmiş oluyor ve paketler doğru adrese yönlendirilmiş oluyor. tcp ağlarını biraz daha çalışıp öğrenmeniz lazım.

  9. lokman dedi ki:

    merhaba hocam, sensörlerden aldığımız bilgileri bir webser’e atmak istiyorum ama bunu ethernet shilde ile değil de gms shield ile yapmak istiyorum nasıl yaparım bunu ?

  10. can erden dedi ki:

    hocam merhabalar, arduino ethernet shield ile ethernet üzerinden haberleşme yapmaya çalışıyorum. PC üzerinden gönderdiğim komutlara göre istediğim şekilde kontrol sağlıyorum ve arduinodan cevap da alabiliyorum. Fakat arduinoya bağladığım butona basınca veri gönderemiyorum. Butona basılı tutup, PC den komut gönderince, butona basılınca gitmesi gereken veri arduinodan gönderiliyor. Dışardan veri gelmedikçe arduino bir veri göndermiyor yani. Ne yapmam gerekiyor sizce?

    NOT: Arduinodaki program örneklerdeki chat server programının değiştirilmiş hali…

    Yardımınız bekliyorum.

    Teşekkürler.

  11. feyzullah dedi ki:

    Hocam iyi günler,
    Akıllı ev bitirmesi yapıcam pc ile ethernetshield vasıtasıyla arduino arasında baglantı yapıcam. Web serverde oluşturacagım arayüzü nasıl oluşturabilirim kolay bir şekilde. Yardımcı olursanız sevinirim…

    • Ömer Koman dedi ki:

      yukarıdaki örnekle başlayın. arduino içine koyacağınız sayfanın boyu bir kaç yuz bayttan fazla olmaması gerekiyor. butun sayfa goruntulerı sonuçta program hafızasında saklandığında detaylı bir arayuz yapmanız mumkun değil.

  12. robotcu dedi ki:

    Ömer hocam bir sorum olacakti. Ben ethernet ile master slave iletisim kullaniyorum. Hersey cok guzel calisiyor robotumu slave den kontrol ediyorum. Ama istedigim webserver calismadiginda yani iletisim koptugumda masterdan slave dur komutu yollamaliyim ama bir türlü programin icine entegre edemedim. dur komutunu yukarida programda nereye koymaliyim.Yardimci olabilirseniz sevinirim.

    • Ömer Koman dedi ki:

      yukarıdaki kod yerine size bir mantık önereyim onu yapmaya çalışın. anladığım kadarı ile robotunuza komur yolluyorsunuz ve bunu yapıyor veya harekete başlıyor bu arada komut geldikçe işlemlerini de yapıyor. burada sorununuz iletişim koptuğunda konrolden çkıyorsunuz. bunu en kolay çözme tekniği masterdan belirli aralıklarla bir hello mesajı atın, slave cihazlar belirli peryotlarda bu mesajı aldığında herşey yolunda diye düşünüp sıradaki işlemi yapması lazım. yada slave her komutu işlediğinde diğer komuta geçmeden önce masterden bir hello mesajı varmı yokmu kontrol edip diğer adıma geçmesi en mantıklı yol olacak. normal networklerdede master, slavelere veya bradcast adresten herkese bir sync mesajı atar bu mesajı alan slave normal işine devam eder durur. mesaj kesilirse yeni mesajı alana kadar durumunu koruyup ilk mesajı aldığında kaldığı yerden devam eder veya sıradaki komuta geçer vs vs.

  13. robotcu dedi ki:

    evet haklisiniz iletişim koptuğunda robot son sinyalde kaliyor.Hareket halinde ise devam gidiyor durmuyor.Aslinda Master dan slave e veri yollamak sorun degil, Master dan c# arasindaki webserver kontrolünün devamliligini kontrol etmem gerekiyor. c# dan Master devamli belli araliklarda veri yollayamiyorum. Oyuzden yukaridaki programda baglanti hatasi alabilsem slave e direk o zaman veri yollayabiliyirim.Master in internet baglantisini kontrol etmek zorundayim sürekli, sorunum burada basliyor.

    • Ömer Koman dedi ki:

      arduino ethernet kutuphaneyi tekrardan bir göz gezdirin http://arduino.cc/en/Reference/Ethernet telnet client örneğini bir inceleyin. normalde m2m(machine to machine) iletişimde http laflarını kurallarını kullanmanıza gerek yok. connected olduktan sonra serial porttan farkı kalmıyor tcp ip nin basit komutlarla karşılıklı haberleştirmeyi deneyin olsun bitsin.

  14. robotcu dedi ki:

    Hocam bir sorum daha olacak. Elimde BMP085 basinc sickalik sensörü var. Bu sensörden verileri direk serial monitorden okudugumda degerler iyi gösteriyor ama webserver ile okudugumda sicaklik 19 ken -68 gibi gösteriyor. Acaba bu farklar neden olur. Tabii ki basinc tada ayni sorun var. Acaba Arduino ve Ethernet shield arasindaki kullanilan SPI protokol buna etki ediyor olabilir mi bu konuda yardimci olabilir misiniz?

    • Ömer Koman dedi ki:

      spi portunda modullerın cs select pinleri ayrı ayrı olması lazım. kullanmadan önce ilgili cs pinin seçili(hi) olduğundan emin olmak lazım.

  15. alparslan dedi ki:

    hocam mrb arduniouno aldım adım sayar yapmak istiyoorum yardımcı olabilirmisiniz

  16. Uğur Aydemir dedi ki:

    Merhaba hocam. Arduino uno ile internet üzerinden lokasyon kontrolü yapıyorum. Webserver e de mit app inverter ile yazdığım aplikasyon ile yönetiyorum.
    Benim sorum şu olacak; Telefona girdiğim değeri arduino da nasıl alıp işleyebilirim. Şöyle ki; telefona % açıklık değeri gireceğim, örneğin %45, arduino ya bu web üzerinden gidecek, arduino bu aldığı değeri karta bağlı potasyometre değeri ile kıyaslayacak ve çıkış pininde bağlı motor ile açma ya da kapatma komutu verecek. Bunu nasıl sağlayabilirim. Android yazılımda yazdığım değeri arduino ya bağlı sensör ile kıyaslayacak yazılım nasıl olabilir?

    • Uğur Aydemir dedi ki:

      Ya da şöyle de düşünelibiliriz. App invertor’da oluşturacağımız text_box a girdiğimiz sayı kadar yanıp sönen led uygulaması. Mantığı aynı olur. Bunu nasıl yapabilirim. (Not: Hem app invertor hem de arduino kısmı için yardımcı olabilirseniz çok sevinirim)

  17. Emre Gazioğlu dedi ki:

    Hocam ben Arduino ve arduino wifi shield kullanarak relay kontrol etmek istiyorum ve bunu android uygulamasıyla kontrol etmek istiyorum ama bunun için yeterli bilgim ve tecrübem yok.Yani androidden yapacağım bir istek ile wifi üzerinden arduino da rölenin açılıp kapanmasını istiyorum. Bunu nasıl yapabilirim yardımcı olursanız sevinirim.

    • Ömer Koman dedi ki:

      malzemelerinizi alın kodunuzu yazın takıldığınız yeri forumda sorun birileri böyle olursa yardım edebilir… proje yazma şeklinde bir yardım yapamıyoruz. sizden ilerleme ve çaba olmazsa bu site ve forumdan kimse yardım etmez…

  18. Ceylan EREN dedi ki:

    Merhaba hocam.
    arduino yu bilgisayara bağlayıp ethernet shiled kullanmadan uzaktan nasıl kontrol edebiliriz?

    • Ömer Koman dedi ki:

      arduino bilgisayara bağlıysa şu şekilde olur…
      arduino < ---> bilgisayar < -----> ethernet < ------> internet < -----> kullanıcı

  19. akif dedi ki:

    hocam size iki sorum olacak
    1-) elimde bir ethernet shield’im var bunun sd kart yuvasına takılan sd karttaki index.html gibi grafiksel arayüzü olan bir siteyi arduinoya verdiğim ip üzerine yansıtabilirmiyim (mesela 192.168.1.177 yazdığımda sd karttaki index.html yi görüntüleyebilirmiyim)
    2-) başka bir şehirden arduinomu kontrol etmek için ne yapmalıyım

    şimdiden vereceğiniz cevaplar için teşekkür ederim…

    • Ömer Koman dedi ki:

      yazıyı hazırlayan arkadaş işerinin yoğunluğundan siteye uğramaz oldu ben cevaplıyayım. bu konuları forumda çok işledik oraya gel. zaten Ethernet shield in amacı tam da değiniz işleri yapmak için tasarlanmıştır. uzaktan erişim yapabilmeniz için tcp/ip mantığını, rooter, local ip, NAT gibi kavramları biliyor olmanız lazım. arduinonun bağlı olduğu networkten internete çıkışını ve internetten local networke girişin rooter üzerinden yönetilmesini yapabilmeniz lazım. yok ben internetten girmeyeyim aynı adsl modemi kullanıyoruz obur odadan neler oluyor bakacam dersen işin kolay sitedeki Ethernet yazılarını oku yeter sana… birde sonuçta arduino hafızası sınırlı bir alan hazırlayacağın web sayfalarının 1-2k gibi bir sınırı olacağını unutma. sd kart var ok oradan da sayfaları alıp yollarsın da bunlar hep sınırlı ve fazla grafik olmasa iyi olur. bir web sayfasından html kodunu tarayıcı çağırırken önce html kodu çağırır sonra resimleri tek tek çağırır da bunları hep iyi bir kod yazımı ile yönetmen lazım. bence basit text bilgileri yollama ve okuma işlemleri ile başla sonra renklendiririsin bir kac pixellik grafikler de sonra eklersin.

    • osman dedi ki:

      hocam elimde 1 arduino mega var . arduino megamın üstüne ethernet shield ve motor shielti aynı anda takabilirmiyiz. eğer bu mümkün değilse ethernet shield ile kullanabileceğim bir motor sürücü kartı önerebilirmisiniz. şimdiden teşekkürler.

      • Ömer Koman dedi ki:

        ethernetshield ile web server ve webclient orneklerini once bır hallet sonra motor surucu için foruma gel sor.

  20. Nurullah Çınar dedi ki:

    Merhaba hocam ben asp.net ,Mysql kullanarak arduino üzerindeki 3 adet sensörüm mevcut burdaki bilgileri kaydetmek istiyorum.asp.net üzerinden port kontrolü var arduino web server ile sensördeki bilgileri web browserda gösterebiliyorum.Bunları sadece Get etmek kaldı ama asp.net windows server tabanlı olduğu arduino bunları derleyemiyor ve sd karta attığımda okumuyor.Bu konuda nasıl bir yol izlemeliyim.

    • Ömer Koman dedi ki:

      arduino minnacık hafızası olan bir cpu buna rağmen bir web server olarak görev yapabiliyor yukarıdaki örnek bunu gösteriyor. sen arduinodaki sensor verilerini bir sunucuya atmak istiyorsan tcp client kullanacaksın o rrneklere bak. bildiğin asp ve mysql kodlarını kendi sunucunda kullan ve arduinonun oraya bağlanıp sensor verilerini oraya kaydetmesini sağla. buradaki örnek senin arduinoya bağlanıp sensor verilerini tarayıcı ıle çekmeni sağlar. foruma gel oradan da sor denemiş olanlar var. arduinoda asp ve mysql komutları işlemez. oyle şeyler yapmak istiyorsan php ve mysql gibi sistemleri rasbery pi ile veya arduino yun gibi Linux tabanlı sistemlerle çözebilirsin. arduinoda ıyı bır tcp/ip kutuphanesi var tarayıcıdan gelen istekleri cevaplayabılır ama asp veya php gibi yorumlayıcılar ıcermez şimdilik.

  21. mert sönmez dedi ki:

    Merhaba
    Arduino+ethernet shield(wiznet5100) ile html dosyası sd kartta olacak şekilde web server oluşturdum.Serial porttan her adımı takip ettim.Kod
    client.write(webFile.read()); // send web page to client
    kısmında kalıyor browser ekranına durmadan “y” harfleri basıyor.Başka html kodlarıyla denedim fakat sonuç aynı problem nedir bilen birileri yardım etsin lütfen.3 gündür bu sorunla uğraşıyorum.Kod ve htm linki : https://startingelectronics.org/articles/arduino/switch-and-web-page-button-LED-control/

    • Ömer Koman dedi ki:

      foruma gelin yazın. benzer işleri çözenler var…

      • habil dedi ki:

        KNDİ WEB SERVERIMIZI TASARLAYABİLECEĞİMİZ BİR PROGRAM VARMI
        ARDUİNO İÇİN

        • Ömer Koman dedi ki:

          en sade biçimi le html veya gömülü css ile yapabilirsin java script için yeterli bellek olmayacak buyuk ihtimal. arduinoda sayfalar çok kucuk boyutlu tasarlanmalı hatta mumkunse 1k civarı olmalı bazı uygulamalar sd karttan sayfa ve resimleri okuyup yolluyor ama sonuçta ardunonun işlem belli.

  22. Onur Yurt dedi ki:

    Hocam merhabalar. Ben hareket sensöründen aldığım bilgiyi arduino yardımıyla internet ortamına atmak ve başka bir arduino ile o web pageden o bilgiyi alıp led yakmak istiyorum.Bilgi alma işlemi mümkün müdür , nasıl yapabilirim acaba ?

    • Ömer Koman dedi ki:

      ethernetclient ile arduino veya herhangi bir web sunucudan veri okursunuz. ethernetserver ile web sayfası içinde verileri aktarırsınız. hepsinin örneği arduino ide de ornekler altında var oradan inceleyebilirsiniz.

  23. aytug dedi ki:

    Merbaha herkese bnm sorum şu sunucuda bulunan bir web api var ve tetiklendiğinde json formatında veri gönderiyor. Bu veriyi arduino ile alabilirmiyim?

    • Ömer Koman dedi ki:

      alırsınız. sonucta json format da text bazlı bir veri, içindekileri ayrıştırmak size düşüyor. tabi veri yoğunluğu 1-2k yı geçmezse fazla sorun yaşamazsın.

E-posta adresiniz gösterilmeyecek. Gerekli alanlar * ile işaretlidir.

*



Sosyal Ağlar