android ile arduino nasıl haberlesir etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
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?
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.