Posted by : MC 28 Mart 2015 Cumartesi


Daha önce C# ile socket programlama üzerinden tcp bağlantısı kullanarak ethernet üzerinden arduinomuzu kontrol etmiştik.

Okuyamayan arkadaşlar için adım adım C# ile ethernet üzerinden arduino kontrolü yazımız.

Bu yazımızda aslında yapacağımız C# ile gerçekleştirmiş olduğumuz kodlardan farklı olmayacak Neden?

Android üzerinde program yazmak için Android studio kullandık.Android studio üzerinde incelerseniz çoğu görselin ve programların genellikle xml ön yapısında ancak arka planında ise java kodlarının döndüğünü göreceksiniz.Bu noktada şunu söyleyebilirim ki java ve C# arasındaki benzerlik bizim daha önce gerçekleştirdiğimiz projenin android tarafına daha rahat aktarılmasını sağlayacak.

Neler yapacağız?

Daha önce .net framework içerisindeki socket sınıflarını kullandık bu sefer ise java kütüphaneleri içerisindeki socket sınıfı üzerinden arduinomuz ile tcp bağlantısı kurmayı deneyeceğiz.


Android tarafında en önemli konulardan biri manifest doyasının düzenlenmesi.
Bu kısımda kullanıcının cihazında kullanmak istediğiniz kaynaklar için izin almak durumundasınız.Örnek olarak biz projemizde tcp üzerinden arduino ile haberleşeceğimiz için internete erişim iznini manifest doyası içerisinde tanımlamlıyız

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.toshiba.arduino" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".ArduinoRemoteControl"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>


</manifest>

İşimiz bununla bitmiyor tabii ki :)
sonrasında görsel arayüzümüzü oluşturmalıyız.Nasıl bir görsel arayüz oluşturduk.iki adet imagebutton u üst üste getirerek birine on digerine off resmi yerleştirdik.Hemen ardından herbir butonumuz için tıklama fonksiyonu oluşturduk.Java kısmında ise butonların tıklanma durumları gore gorsellik durumlarını değiştirerek bir aksiyon elde etmiş olduk.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".ArduinoRemoteControl">

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageButton"
        android:src="@drawable/buttonon"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:onClick="onbutton" // java içerisinde kullanacagımız fonksiyon olusturuldu
        android:background="@null"/>

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageButton2"
        android:src="@drawable/buttonoff"
        android:layout_above="@+id/textView"
        android:layout_centerHorizontal="true"
        android:onClick="offbutton" // java içerisinde kullanacagımız fonksiyon olusturuldu
        android:background="@null"/>

    <TextView // ısıkların durumu için bir adet ekledik
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/textView"
        android:layout_below="@+id/imageButton"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

Gelelim can alıcı noktamıza java kodlarımıza :)

package com.example.toshiba.arduino;

import android.os.StrictMode;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import java.io.DataOutputStream; // veri gonderebilmek için output buffer kutuphanesi
import java.net.Socket; // java da ki socket sınıfımızı ekledik


public class ArduinoRemoteControl extends ActionBarActivity {
    ImageButton off; // off butonunu javaya çekmek için off değişkeni
    ImageButton on; // on butonunu javaya çekmek için on değişkeni
    Socket client_socket; // socket değişkenimiz
    TextView txt; // textview i javaya çekme değişkenimiz

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_arduino_remote_control);
        off=(ImageButton)findViewById(R.id.imageButton2);//off değişkenimizle görseldeki off butonu ilişkilendi
        on=(ImageButton)findViewById(R.id.imageButton);//on değişkenimizle görseldeki on butonu ilişkilendi
        off.setVisibility(View.INVISIBLE);//off butonunu başlangıçta görünmez kıldık
        txt=(TextView)findViewById(R.id.textView);//txt ile gorseldeki textview elemanını eşledik
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();// threadlere izin veriyoruz
        StrictMode.setThreadPolicy(policy);

        try {// baglantıdaki sıkıntıları yakalamak için try catch yapısı kullandık
            bagla(); // bagla fonksiyonumuzu çağırıyoruz
        } catch (Exception e) {
            e.printStackTrace();// bağlantı olmaması durumundaki hatayı alıyoruz
        }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_arduino_remote_control, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
    public void onbutton(View view)//on butonuna basıldıgında donecek olan fonksiyonumuz
    {
        on.setVisibility(View.INVISIBLE);//on butonunu gorunmez kıl
        off.setVisibility(View.VISIBLE);//off butonunu gorunur kıl
        try {
            if(!client_socket.isClosed()) {//socket acık mı ? acıksa
                DataOutputStream out = new DataOutputStream(client_socket.getOutputStream());//out adı alrında output kanalı olustur ve socket ile ilişkilendir
                out.writeBytes("a");// tcp üzerinden 'a' gönder
                txt.setText("ısıklar yandı");// textview e ısıklar yandı yaz
            }
            else
            {
                bagla();// baglantı giderse tekrar bagla fonksiyonunu cagır ve baglanmayı dene
            }
        }
        catch (Exception a)
        {

        }
    }
    public void offbutton(View view)// off butonuna basıldıgında donecek olan fonksiyon
    {
        off.setVisibility(View.INVISIBLE);// off butonunu gorunmez kıl
        on.setVisibility(View.VISIBLE);//on butonunu gorunur kıl
        try {
            if(!client_socket.isClosed()) {//socket acık mı ? acıksa

                DataOutputStream out = new DataOutputStream(client_socket.getOutputStream());//out adı altında cıkıs kanalı olustur ve socket ile ilişkilendir
                out.writeBytes("A");//tcp üzerinden 'A' yaz
                txt.setText("ısıklar söndü");//textview e ısıklar sondu yaz
            }
            else {// baglantıda sıkıntı yakalarsan
            bagla();//bagla fonksiyonunu cagır ve tekrar baglanmayı dene
            }
        }
        catch (Exception a)
        {
          System.out.print(a); // hata mesajını alıyoruz
        }
    }
    public void bagla() throws Exception {// baglanma fonksiyonumuz

            try {
                client_socket = new Socket("192.168.1.177", 23);// arduino ip miz ve 23 nolu port uzerinden android tarafı ile arduino arasında client_socket ile tcp baglantısı olusturuyoruz


                Toast.makeText(this, "baglantı saglandı", Toast.LENGTH_SHORT).show();//baglantı saglandıgı takdirde ekranda baglantı saglandı yazacak ve sonecek

            } catch (Exception a) {// baglantı hatasını yakalıyoruz

                Toast.makeText(this, "baglantı yok", Toast.LENGTH_SHORT).show();//baglantı saglanamadı ise baglantı yok yazısı bir sure ekranda yanacak ve sonecek

                txt.setText(a.toString());//baglantı hatasını net gorebilmek acısından birde textview e yazdırıyoruz

                client_socket.close();//socketimizi kapatıyoruz.

            }
        }

}


gelelim dipnotlarımıza :)

arduino tarafındaki kodları paylasmadım lakin c# ile yaptıgımı örnekteki kodlarımız birebir aynı o kodlara buradan ulasabilirsiniz.

Diğer önemli bir husus bu program ile arduinoyu kontrol edebilmeniz için arduino ile telefonunuzun aynı ağ içerisinde olduğundan emin olun ya da arduinonuzu sabit bir ip ile internete açabiliyorsanız o ip ile projedeki ip değerini değiştiriniz.





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

  1. Emeğinize sağlık çok çok yararlı bir yazı olmuş. Bu konu hakkında proje çalışmam var bu yazınız çok işime yaradı çok teşekkürler.

    Acaba Arduino'ya bağlı olan sensör bilgilerini Androide nasıl çekebiliriz? Yardımcı olursanız çok sevinirim.

    YanıtlaSil
  2. getMenuInflater().inflate(R.menu.menu_arduino_remote_control, menu);
    if (id == R.id.action_settings) {
    Bu iki bölümde hata alıyorum. Bi türlü bulamadım sebebini. Yardım ederseniz sevinirim. Action_settings ile menu.menu_program adı, menu kısmı kırmızı oluyor.

    YanıtlaSil
    Yanıtlar
    1. kaynak kodlarınızı net olarak incelemeden bir sonuca varmam zor
      ancak tahminim seçmiş olduğunuz program template ile alakalı olabilir seçmiş olduğunuz template te android ekranı sağ üst köşede bulunan settings menu bulunmuyor olabilir

      Diğer bir çözm yolu ise belirtilen id ler uyuşmuyor ve sizin programınız farklı bir id ile o menüyü oluşturmuş olabilir

      menu dosyası içinde xml i kontrol ederek id sini ya da gerçektende template in bir menuye sahip olup olmadığını kontrol edebilirsiniz

      bunların bir çözüm olmaması durumunda bana size ulasabilecegim bir mail adresi verebilirseniz uygun oldugum bir zaman en azından uzaktan bağlanarak size yardımcı olmayı deneyebilirim

      Kolaylar gelsin

      Sil

ELEKTRO BLOGGER A HOŞGELDINIZ

ARAMA YAP

EN COK OKUNANLAR

- Copyright © ELEKTRO-BLOGGER Blogger