12 Ekim 2014 Pazar

Arduino Ethernet Uygulaması

Arduino ile internet üzerinden birşeyleri kontrol etmek fikri son zamanlarda oldukça yaygınlaştı. Bu yazımızda birşeyleri kontrol etmeden önce arduino ile ethernet shieldın nasıl kullanılacağını inceleyeceğiz. Çünkü ilk aşamada ethernet shieldı çalıştırmak kod hazır dahi olsa emek istemektedir. Ne yapacağımızı bilemediğimiz bir durumdur aslında.

Herşeyden önce Ethernet kütüphanesini indirmeniz gerekmektedir. İndirdiğiniz kütüphane dosyasını Library klasörüne attıktan sonra IDE' yi çalıştırabilirsiniz.

Sırasıyla File / Sketchbook yada Examples / Ethernet / Web Server komutlarına tıkladığınızda bu çalışmada yapacağınız uygulamanın kodunu açmış olacaksınız. Yada direk aşağıda göreceğiniz yorum satırları ile yapacağınız işi anlaşılır kılmaya çalışan kodu çalıştırabilirsiniz.

arduino ethernet uygulaması


Şimdi gelelim benim bu işteki katkıma :)

Öncelikle kodun yorum satırlarında da görebileceğiniz gibi kod içerisinde bulunan IP Adresini değiştirmeniz gerekmektedir. Bağlı olduğunuz internet bağlantısı üzerinden bağlantı IPv4 adresinizi öğrenmelisiniz. Bu adresin sadece son hanesini değiştirerek kod içerisindeki ip adresi karşısına yazacaksınız. Örneğin bağlantınızın IP adresi 192.168.1.15 ise siz koda 192.168.1.20 yazmalısınız.

Bir diğer husus ethernet shieldı bağladığınız internet ile kod içerisine yazdığınız IP adresini aratmanızdır. Yani kullandığınız internet hattı bu çalışmada aynı olmalıdır.



Yorum satırları eklenmiş uygulama kodu:
/*
  Web Server = Web sunucusu : Hosting, web sayfalarının internet 
  üzerinde yayınlanması için gerekli alanların kiralanması 
  anlamına gelmektedir. Yani internet üzerinden yayınlanmak istenen
  döküman, resim, sayfa vb. verilerin kullanıcıların erişebileceği
  bir bilgisayarda tutulmasıdır. İşte bu verilerin tutulduğu - 
  saklandığı internete hızlı bağlantısı olan web verilerini tutan
  bilgisayarlara web sunucusu denir.
 
 Bu çalışmada arduino üzerindeki analog pinlerin değerleri 
 basit bir web server da gösterilecektir. Bu çalışmada arduino uno
 ve ethernet shield kullanılmaktadır.
 
 Devre ayak bağlatıları:
 NOT: Eğer ethernet kitiniz shield halinde değilse yani arduino
 kartınız üzerine direk olarak bağlanamıyorsa şu piner 
 kullanılacaktır:
 * Ethernet shieldı arduino üzerindeki bağlanacağı pinler:
 10, 11, 12, 13
 * Analog girişlerinizi (A0...A5) potansiyometre gibi analog
 aygıtlara-sensörlere bağlayabilirsiniz.
 
 */
#include <SPI.h>
#include <Ethernet.h>

// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,89); // IP adresi yerel bağlantınızın
// yani kullandığınız internetin IP adresi ile uyumlu olmalıdır.
// Buna Ağ ve Paylaşım Merkezini Aç/ (İnternete bağlandığınız) Ağ
// Bağlantısı / Ayrıntılar komutlarına tıklayarak IPv4 Adresi linki
//karşısında görebilirsiniz. Burada gördüğünüz IP adresinin sadece
//son hanesini değiştirerek kod içerisindeki kısmı doldurmalısınız.
//Örneğin benim IPv4 adresim 192.168.1.86 idi ancak kod içerisine 
//192.186.1.89 yazdım. Kod içerisine yazdığınız IP adresini web
// browser yani chrome yada Internet Explorer da aratınız. 
//Tabi arduino ya bu kodu yüklemiş ve internet shielda internet
//kablosunu bağlamış olmanız gerekmektedir.

EthernetServer server(80); // HTTP için tanımlanmış port numarası

void setup() {
  Serial.begin(9600); //Seri haberleşme açıldı
   while (!Serial) {
    ; // Seri porta bağlantının yapılmasını bekler
  }


  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
   client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");       
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}




7 yorum:

  1. güzel makale olmuş ellerinize sağlık
    Arduino uygulamaları hakkında detaylı bilgiler için sizi de sitemize bekleriz
    http://elektro-blogger.blogspot.com.tr

    YanıtlaSil
    Yanıtlar
    1. Teşekkürler. İnceleyeceğim sitenizi. Yeni yayınlarım bu sitede olacak.
      http://www.gokhangol.com/

      Sil
  2. modemim tp-link. 192.168.0.1 ile modem arayüzüne girebiliyorum. ethernet shield'a 192.168.0.177'yi atıyorum fakat buraya giriş yapamıyorum.

    YanıtlaSil
  3. Merhaba Gökhan bey,arduino ethernet uygulaması yapıyorum fakat ilginç bir sorunla karşılaşıyorum. site kodlarını char *site="..html kodları.."; şeklinde programın başında tanıtıyorum.Yaklaşık 7 satır tutan bu kodlar tarayıcıda düzgün görüntülenirken site kodlarını geliştirip de daha fazla olunca ya sayfa görüntülenmiyor ya da tarayıcı da kod yazıları görüntüleniyor.Bu sorunu nasıl aşabilirim?saygılarımla

    YanıtlaSil
  4. paylaşım için teşekkürler

    YanıtlaSil
  5. Merhabalar;

    arduino mega + pn532 NFC + ethernet shield

    bunları kullanarak bi giriş kontrol sistemi yapıyorum. söyle bir sorunum vardı sistem sadece usb kablosu ile bilgisayardan güç aldıgı zaman çalışıyor adaptör le güç verdigimde veya usb adaptörü ile güc verdigimde internet e baglanmıyor.

    usb den bi daha tetikleme alıyor sanırım ama anlamadım böyle bir durum varmı acaba ?

    yazdıgım kodlarda serial vardı onlarıda sildim tamamen sadece ethernet ve nfc nın kodları var nfc kodları tarıyor eger id varsa post atıyor .

    bu sorun neden olabilir acaba ?

    kodlar:

    #include
    #include

    #include
    #include

    #include
    #include
    #include

    PN532_SPI pn532spi(SPI, 46);
    NfcAdapter nfc = NfcAdapter(pn532spi);

    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

    ///////// DEFİNE //////////
    String inString = "";
    String stringOne = "";
    const char kHostname[] = "www.tuva.me";
    String stringUrl = "/turnstiles/ping/EF3136F282CCC00C960F0F20F620BA15/"; // string to hold input
    const int kNetworkTimeout = 30*1000;
    const int kNetworkDelay = 1000;
    String readString = "";

    void setup(void)
    {
    pinMode(32, OUTPUT);
    pinMode(40, OUTPUT);
    pinMode(41, OUTPUT);
    delay(1000);
    Ethernet.begin(mac);
    delay(1000);
    }

    void loop(void)
    {
    nfc.begin();
    if (nfc.tagPresent()){
    NfcTag tag = nfc.read();
    stringOne = tag.getUidString(); // okunan id degişkene ata
    stringOne.replace(" ", ":"); // aralarındaki boşlugu iki nokta üstüste ile degiştir
    if (stringOne){
    ethernetGET();
    }
    }
    delay(300);
    }




    void ethernetGET()
    {
    int err =0;
    EthernetClient c;
    HttpClient http(c);
    inString = stringUrl + stringOne;
    String newData;
    char buffer[90];
    newData=inString;
    newData.toCharArray(buffer, 90);
    err = http.get(kHostname, buffer);
    if (err == 0){
    err = http.responseStatusCode();
    if (err >= 0){
    err = http.skipResponseHeaders();
    if (err >= 0){
    int bodyLen = http.contentLength();
    unsigned long timeoutStart = millis();
    char c;
    while ( (http.connected() || http.available()) &&
    ((millis() - timeoutStart) < kNetworkTimeout) ){
    if (http.available()){
    c = http.read();
    if (c != '\n'){
    readString += c;
    }
    bodyLen--;
    timeoutStart = millis();
    }else{
    delay(kNetworkDelay);
    }
    }
    hadiyapsunu();
    }
    }
    }
    http.stop();
    }

    void hadiyapsunu()
    {
    if (readString.indexOf("[true") > 0) {
    success();
    }
    if (readString.indexOf("[false") > 0) {
    danger();
    }
    }


    void success()
    {
    digitalWrite(40, HIGH);
    delay(800);
    digitalWrite(40, LOW);
    }


    void danger()
    {
    digitalWrite(41, HIGH);
    delay(500);
    digitalWrite(41, LOW);
    }

    YanıtlaSil
  6. Türkçe karakter sorununu nasıl çözebiliriz

    YanıtlaSil