Posted by : MC 10 Şubat 2015 Salı

Merhabalar,
Daha önce arduino ile ethernet class chat server özelliğinden basetmiştik.Bu konumuzda ise arduinonun ethernet örnek kütüphanesindeki webserver özelliğini kullanarak arduinodan gelen değerleri c# ile nasıl okuyacağımızdan bahsedeceğim.

İlk olarak isterseniz arduinonun bize örnek olarak sunduğu webserver programını inceleyelim



#include <SPI.h>
#include <Ethernet.h>


byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177); // ip adresi ayarlanmış


EthernetServer server(80);//port 80 olarak ayarlanmış

void setup() {

  Serial.begin(9600);



//ethernet bağlantısı kuruluyor
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {

  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
//hatta yeni bir client var ise seri ekrana client yazılıyor
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
//hattımızda client olduğu sürece hattımızı dinliyoruz
        Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {
         //eğerki cleint tarafından '\n' bilgisi gelirse standart bir html dosyasını yansıtıyoruz
          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') {
     
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
       
          currentLineIsBlank = false;
        }
      }
    }
 
    delay(1);

    client.stop();
    Serial.println("client disconnected");
  }
}

Şimdi programı kendimize göre düzenleyelim

#include <SPI.h>
#include <Ethernet.h>


byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177); // ip adresi ayarlanmış


EthernetServer server(80);//port 80 olarak ayarlanmış

void setup() {

  Serial.begin(9600);
  


//ethernet bağlantısı kuruluyor
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {

  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
//hatta yeni bir client var ise seri ekrana client yazılıyor
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
      

          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;
        }
      
      }
    }
   
    delay(1);

    client.stop();
    Serial.println("client disconnected");
  }
}

Bizim programımız client tarafından bilgi göndermeyeceğinden client tan gelen mesajları görmezden geliyoruz.Biz c# tarafından sadece server ı dinlemek ve ondan gelen verileri almak istiyoruz.

Yukarıdaki kodda yer alan

  if (client.available()) {
      

          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.println("<br />");       
            client.print(sensorReading);
            client.println("<br />");       
          }
          client.println("</html>");
          break;
        }
Aşağıdaki resim arduino ide nın standart html çıktısı



Bizim çıkmtımız ise

analog input 0
275
analog input 1
252
.
.
analog input 5
137
şeklinde olacak


Şimdi gelelim biz bu resimdeki çıktıyı nasıl c# tarafında alırız sorusuna 

using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using asiz;
using System.Net;//html okumak için kullanacağımız kütüphaneler
using System.Net.Sockets;//html okumak için kullanacağımız kütüphaneler
using System.Threading;//multi threading yapacağız sürekli okumada program görsellerim donmasın
using MySql.Data.MySqlClient;
using System.Timers;



namespace asiz
{



    public partial class MainWindow : Window
    {

        Thread t;//yeni bir thread tanımlıyorum
        public MainWindow()
        {
            this.InitializeComponent();
       
         
            try
            {


                t = new Thread(new ThreadStart(okumayabasla));//tanımladığım threade okumayabasla fonksiyonumu ekliyorum
                t.Start();//thread imi başlatıyorum
         
             

            }
            catch (Exception)
            {

                MessageBox.Show("Server ile baglanti kurulurken hata olustu !");
//ethernet bağlantım yok ise uyarı alıyorum
            }
        }
     
   
     static int[5]analog;

   
   
        public void okumayabasla()
        {


            WebClient client = new WebClient();//yeni bir web client oluşturuyorum.Html kodlarını alacağım
            string oku;//oku adında bir değişken ile html kaynağını okuyacağım


            try//bağlantı kurup okumaya başlayacağım
            {
                while (true)//okuma işlemini sürekli yapacağım
                {


                    StreamWriter writer = new StreamWriter("modul.txt");//modul.txt adı altında html kaynağını bilgisayarıma kayıt altına alacağım

                    String htmlCode = client.DownloadString("http://192.168.1.177");//arduinoya bağlanıyorum ve html kodlarını alıyorum

                    writer.Write(htmlCode);//modul.txt dosyasına kayıt ediyorum
                    writer.Close();//kayıt tamam
                    StreamReader ok = new StreamReader("modul.txt");//modul.txt dosyasını okumak için açıyorum


                    while (ok.ReadLine() != "</html>")//html dosyasının sonuna geldim mi gelmedim mi kontrol ediyorum.
                    {
                        oku = ok.ReadLine();//satır satır okuma işlemine devam ediyorum
                        if (oku == "analog input 0")  //analog input 0 olan satırı yakaldım mı ?
                        {
                            oku = ok.ReadLine();//bir alt satırını oku
                       
                            label1.Dispatcher.Invoke(new Action(() => oda_sic.Content = oku));
                            analog[0]= int.Parse(oku);
                   
                        }
                          if (oku == "analog input 1")  //analog input 1 olan satırı yakaldım mı ?
                        {
                            oku = ok.ReadLine();//bir alt satırını oku
                         
                            label2.Dispatcher.Invoke(new Action(() => oda_sic.Content = oku));
                            analog[1]= int.Parse(oku);
                     
                        }
                          if (oku == "analog input 2")  //analog input 2 olan satırı yakaldım mı ?
                        {
                            oku = ok.ReadLine();//bir alt satırını oku
                         
                            label3.Dispatcher.Invoke(new Action(() => oda_sic.Content = oku));
                            analog[2]= int.Parse(oku);
                     
                        }
                          if (oku == "analog input 3")  //analog input 3 olan satırı yakaldım mı ?
                        {
                            oku = ok.ReadLine();//bir alt satırını oku
                         
                            label4.Dispatcher.Invoke(new Action(() => oda_sic.Content = oku));
                            analog[3]= int.Parse(oku);
                     
                        }
                          if (oku == "analog input 4")  //analog input 4 olan satırı yakaldım mı ?
                        {
                            oku = ok.ReadLine();//bir alt satırını oku
                         
                            label5.Dispatcher.Invoke(new Action(() => oda_sic.Content = oku));
                            analog[4]= int.Parse(oku);
                     
                        }
                          if (oku == "analog input 5")  //analog input 5 olan satırı yakaldım mı ?
                        {
                            oku = ok.ReadLine();//bir alt satırını oku
                         
                            label6.Dispatcher.Invoke(new Action(() => oda_sic.Content = oku));
                            analog[5]= int.Parse(oku);
                     
                        }

                     
                    }
                    ok.Close();//okuma bufferını kapatıyorum
                }
            }
            catch
            {
               //sistemde okuyamadığınızda ekrana buradan hata yazdırabilirsiniz
            }
        }
        private void MainWindow1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            Environment.Exit(1);//kapat butonuna basılında sistemi komple kapat
            t.Abort();//açtığım thread i öldür


        }

   


    }
}

Yukarıda bahsettiğimiz örnek benim her zaman kullandığım expression blend 4 ile oluşturulmuştur.Microsoft visual studio ile oluşturacağınız projede sadece label lara değer yazma kısmı değişecektir.

Belirtmemiz gereken diğer bir husus bu sistemle sadece arduinodan değer okuyabilirsiniz.Veri gönderimi için yine arduino ile c# programı arasında tcp socket açmanız ve 2 yönlü haberleşmeniz gerekmektedir.

Yazar: Caner ÇAKAR

{ 2 Comments... read them below or Comment }

  1. Tarayıcıya 192.168.0.70 yazarak erişim sağlamışsınız. Ben de 192.168.0.177 olarak ayarlıyorum fakat giriş yapamıyorum.

    YanıtlaSil
    Yanıtlar
    1. arduino ile aynı ip grubunda olduğunuzdan emin olun
      arduino ip si 192.168.0.177 ise sizinde ip niz 192.168.0.200 yada son 200 rakamı farklı bir degerde olmalı ve arduino ile aynı ağ içerisinde olmanız gerekir.

      bunu test edebilmeniz için cmd yi çalıştırıp arduino ip adresine ping yaparak test edin arduinodan ttl değerleri gordugunuz anda sizin programınızda çalışacaktır

      Sil

ELEKTRO BLOGGER A HOŞGELDINIZ

ARAMA YAP

EN COK OKUNANLAR

- Copyright © ELEKTRO-BLOGGER Blogger