[[{"fid":"229","view_mode":"default","fields":{"format":"default","field_file_image_alt_text[und][0][value]":"rangkaian kontrol kelembapan rumah dengan android","field_file_image_title_text[und][0][value]":"rangkaian kontrol kelembapan rumah dengan android"},"type":"media","link_text":null,"attributes":{"alt":"rangkaian kontrol kelembapan rumah dengan android","title":"rangkaian kontrol kelembapan rumah dengan android","height":"627","width":"1200","class":"media-element file-default"}}]]
Wah!!! Sudah lama tidak melanjutkan eksperimenya dengan android dikarenakan kesibukan membuat tugas akhir. Sekarang ayo kita lanjutkan lagi eksperimennya dengan bermain - main dengan suhu dan kelembaban. Pada kali ini kita akan mencoba untuk menggontrol kondisi suhu yang ada dalam ruangan melalui kendali smartphone android. Dalam project ini kita akan membuat sebuah model dari sistem pendingin sebuah ruangan yang mana nilai bacaan dari sensor suhu akan dijadikan inputan untuk mengontrol ON/OFF dari kipas, tentunya dengan kendali kondisi suhu yang diinginkan oleh pengguna. Oke....langsung saja dipersiapkan bahan - bahannya seperti berikut ini :
- Board Arduino
- Sensor suhu dan kelembaban (DHT11)
- Bluetooth
- Relay
- Kipas
- Kabel jumper
- Smartphone dengan platform Android
Jika sudah siap dengan bahannya langsung saja di rangkai seperti berikut ini :
[[{"fid":"230","view_mode":"default","fields":{"format":"default","field_file_image_alt_text[und][0][value]":"rangkaian kontrol kelembapan rumah dengan android_small","field_file_image_title_text[und][0][value]":"rangkaian kontrol kelembapan rumah dengan android_small"},"type":"media","link_text":null,"attributes":{"alt":"rangkaian kontrol kelembapan rumah dengan android_small","title":"rangkaian kontrol kelembapan rumah dengan android_small","height":"209","width":"400","class":"media-element file-default"}}]]
Bahan- bahan yang digunakan pada eksperimen ini sangat mudah untuk didapatkan dan juga dengan harga yang sangat terjangkau kecuali mungkin smartphone-nya heheheheheee J....:J. Dalam rangkaian terlihat menggunakan sumber listrik langsung dari PLN yang digunakan pada kipas. Saklar atau Relay yang tersambung dengan kipas inilah yang akan mengontrol hidup dan matinya. Namun eksperimen ini akan menggunakan kipas yang tidak begitu besar tapi sistem dan cara kerjanya sama saja hanya dibedakan pada ukuran kipas yang dipakai. Sistem ini menggunakan bluetooth sebagai media untuk komunikasi antara smartphone android dengan alat. Jadi, kemungkinan jarak komunikasi tidak akan terlalu jauh.
Oke.. kita langsung saja pada pembuatan programnya. Pertama buka aplikasi Arduino IDE kemudian sambungkan port USB arduino dengan komputer setelah itu sesuaikan nomor port yang digunakan pada arduino. Kalau sudah mulai tanamkan programnya kedalam mikrokontroler yang dipakai diboard arduino dengan cara klik tombol upload. Berikut ini sintaknya,
#include <MeetAndroid.h> #include <dht11.h> dht11 DHT11; #define DHT11PIN 7 int perintah; int celsius = 0; int kelembaban = 0; int relay = 13; int nilaiSuhu = 0; boolean setAktif = false; MeetAndroid meetAndroid; void setup(){ pinMode(relay, OUTPUT); Serial.begin(9600); meetAndroid.registerFunction(msetSuhu,'A'); } void loop() { meetAndroid.receive(); DHT11.read(DHT11PIN); celsius = (DHT11.temperature); kelembaban = (DHT11.humidity) + 500; meetAndroid.send(kelembaban); delay(500); meetAndroid.send(celsius); if(perintah == 0) { setAktif = false; nilaiSuhu = 0; digitalWrite(relay, LOW); } if(perintah > 0) { setAktif = true; nilaiSuhu = perintah; } if(setAktif == true) { if(nilaiSuhu > celsius) { digitalWrite(relay, LOW); } else if(nilaiSuhu < celsius) { digitalWrite(relay, HIGH); } } } void msetSuhu(byte flag, byte numOfValues) { perintah=meetAndroid.getInt(); }
Sekarang kita buatkan program untuk antarmuka kendalinya dengan bantuan aplikasi eclipse. Berikut langkah - langkanya :
Buat sebuah file pada /res/layout/input.xml isikan dengan sebuah Button dan EditText seperti ini :
<EditText android:id="@+id/deviceIDField" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="100dp"> </EditText> <Button android:id="@+id/okButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="Set ID" />
Buat sebuah file /res/layout/activity_main.xml halaman ini akan dijadikan sebagai halaman kendali utama dengan berbagai fungsi yang ada. Disini dibuatakan layout yang relatif untuk mempermudah pembuatan desain, Berikut sintaknya :
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="5dp" android:text="@string/celsius_" android:textSize="20dp"/> <TextView android:id="@+id/textKelembaban" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/textView2" android:layout_alignBottom="@+id/textView2" android:layout_marginLeft="26dp" android:layout_toRightOf="@+id/textView2" android:text="%" android:layout_marginTop="50dp" android:textSize="20dp"/> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/progressBar1" android:layout_below="@+id/progressBar1" android:layout_marginTop="96dp" android:text="Kelembaban :" android:textSize="20dp"/> <ProgressBar android:id="@+id/progressBarKelembaban" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView2" android:layout_below="@+id/textView2" android:layout_marginTop="23dp" android:max="100" /> <ProgressBar android:id="@+id/progressBarCelsius" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:layout_marginTop="26dp" android:max="50" /> <TextView android:id="@+id/textCelsius" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/textView1" android:layout_alignBottom="@+id/textView1" android:layout_toRightOf="@+id/textView2" android:text="degC" android:textSize="20dp"/> <ToggleButton android:id="@+id/togglebutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/progressBarKelembaban" android:layout_centerVertical="true" android:onClick="onToggleClicked" /> <TextView android:id="@+id/value1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/togglebutton" android:layout_below="@+id/togglebutton" android:layout_marginTop="62dp" android:textAppearance="?android:attr/textAppearanceLarge" /> <SeekBar android:id="@+id/seekBar1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignLeft="@+id/value1" android:layout_below="@+id/togglebutton" android:layout_marginTop="28dp" android:max="50" android:progress="1" />
Pembuatan antarmuka sudah selesai, berikutnya kita akan bermain di file.java... pertama - tama buat sebuah file /src/com.Miarana.suhukontrolamarino/main.java dalam file ini kita akan gunakan untuk memvalidasi alamat bluetooh dari alat dengan integrasi layout input.xml, berikut sintaknya :
package com.Miarana.suhukontrolamarino; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import at.abraxas.amarino.Amarino; public class main extends Activity implements OnClickListener { private static final String TAG = "Suhu dan Kelembaban"; public static String DEVICE_ADDRESS; EditText idField; Button button; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.input); Log.d(TAG, "Main onStart"); // get references to views defined in our main.xml layout file idField = (EditText) findViewById(R.id.deviceIDField); button = (Button) findViewById(R.id.okButton); // register listeners button.setOnClickListener(this); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); DEVICE_ADDRESS = prefs.getString("device", "20:13:06:09:02:87"); idField.setText(DEVICE_ADDRESS); } public void onClick(View v) { DEVICE_ADDRESS = idField.getText().toString(); PreferenceManager.getDefaultSharedPreferences(this) .edit() .putString("device", DEVICE_ADDRESS) .commit(); Amarino.connect(this, DEVICE_ADDRESS); Intent i = new Intent(this, MainActivity.class); startActivity(i); } }
Kemudian pada bagian MainActivity.java tulis sintaks berikut :
package com.Miarana.suhukontrolamarino; import android.support.v7.app.ActionBarActivity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.*; import android.widget.SeekBar.OnSeekBarChangeListener; import at.abraxas.amarino.Amarino; import at.abraxas.amarino.AmarinoIntent; public class MainActivity extends ActionBarActivity { public TextView celsius, kelembaban; private ProgressBar mProgressCelsius, mProgressKelembaban; public TextView mValue1; public SeekBar volumeControl = null; int progressChanged = 0; int setValue = 0; private ArduinoReceiver arduinoReceiver = new ArduinoReceiver(); private static final String TAG = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mValue1 = (TextView) findViewById(R.id.value1); volumeControl = (SeekBar) findViewById(R.id.seekBar1); celsius = (TextView) findViewById(R.id.textCelsius); kelembaban = (TextView) findViewById(R.id.textKelembaban); mProgressCelsius = (ProgressBar) findViewById(R.id.progressBarCelsius); mProgressKelembaban = (ProgressBar) findViewById(R.id.progressBarKelembaban); mProgressCelsius.setProgress(0); mProgressKelembaban.setProgress(0); volumeControl.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){ progressChanged = progress; if(setValue == 1) { mValue1.setText("setSuhu : "+progressChanged+"degC"); if(progressChanged == 0) { progressChanged = 1; volumeControl.setProgress(1); } } else { mValue1.setText("Nonaktif"); } } //jika seekbar mulai akan digerakan maka nilai akan keluar public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub //Toast.makeText(getApplicationContext(),"seek bar progress:"+progressChanged,Toast.LENGTH_SHORT).show(); } //jika seekbar berhenti digerakan maka nilai akan keluar public void onStopTrackingTouch(SeekBar seekBar) { if(setValue == 1) { turnOn(); Toast.makeText(getApplicationContext(),"Send to Arduino:"+progressChanged,Toast.LENGTH_SHORT).show(); } else { mValue1.setText("Nonaktif"); } } }); } public void onToggleClicked(View view) { // Is the toggle on? boolean on = ((ToggleButton) view).isChecked(); if (on) { setValue = 1; } else { turnOff(); setValue = 0; mValue1.setText("Nonaktif"); volumeControl.setProgress(0); } } private void turnOff() { Amarino.sendDataToArduino(this, main.DEVICE_ADDRESS, 'A', "0"); } private void turnOn(){ Amarino.sendDataToArduino(this, main.DEVICE_ADDRESS, 'A', progressChanged); } @Override protected void onStart() { super.onStart(); registerReceiver(arduinoReceiver, new IntentFilter(AmarinoIntent.ACTION_RECEIVED)); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); new Thread(){ public void run(){ try { Thread.sleep(6000); } catch (InterruptedException e) {} Log.d(TAG, "Hello");//logs debug messages } }.start(); } @Override protected void onStop() { super.onStop(); // stop Amarino's background service, we don't need it any more Amarino.disconnect(this, main.DEVICE_ADDRESS); } public class ArduinoReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String data = null; String dataKelembaban = null; String dataCelsius = null; int dataCelsiusProgress = 0; int dataKelembabanProgres = 0; // the device address from which the data was sent, we don't need it here but to demonstrate how you retrieve it final String address = intent.getStringExtra(AmarinoIntent.EXTRA_DEVICE_ADDRESS); // the type of data which is added to the intent final int dataType = intent.getIntExtra(AmarinoIntent.EXTRA_DATA_TYPE, -1); // we only expect String data though, but it is better to check if really string was sent // later Amarino will support differnt data types, so far data comes always as string and // you have to parse the data to the type you have sent from Arduino, like it is shown below if (dataType == AmarinoIntent.STRING_EXTRA){ data = intent.getStringExtra(AmarinoIntent.EXTRA_DATA); final int sensorReading = Integer.parseInt(data); if (data != null ){ try { if(sensorReading > 100) { dataKelembaban = String.valueOf(sensorReading - 500); if(Integer.parseInt(dataKelembaban) > 100) { dataKelembaban = String.valueOf(100); kelembaban.setText(dataKelembaban + " %"); dataKelembabanProgres = Integer.parseInt(dataKelembaban); mProgressKelembaban.setProgress(dataKelembabanProgres); } else { kelembaban.setText(dataKelembaban + " %"); dataKelembabanProgres = Integer.parseInt(dataKelembaban); mProgressKelembaban.setProgress(dataKelembabanProgres); } } else { // since we know that our string value is an int number we can parse it to an integer if(sensorReading > 50) { dataCelsius = String.valueOf(50); dataCelsiusProgress = Integer.parseInt(dataCelsius); celsius.setText(dataCelsius + " degC"); mProgressCelsius.setProgress(dataCelsiusProgress); } else { dataCelsius = String.valueOf(sensorReading); dataCelsiusProgress = Integer.parseInt(dataCelsius); celsius.setText(dataCelsius + " degC"); mProgressCelsius.setProgress(dataCelsiusProgress); } } } catch (NumberFormatException e) { /* oh data was not an integer */ } } } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, 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(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
[[{"fid":"231","view_mode":"default","fields":{"format":"default","field_file_image_alt_text[und][0][value]":"2._suhukontrol.jpg","field_file_image_title_text[und][0][value]":"2._suhukontrol.jpg"},"type":"media","link_text":null,"attributes":{"alt":"2._suhukontrol.jpg","title":"2._suhukontrol.jpg","height":"300","width":"400","class":"media-element file-default"}}]][[{"fid":"232","view_mode":"default","fields":{"format":"default","field_file_image_alt_text[und][0][value]":"1._suhukontrol.jpg","field_file_image_title_text[und][0][value]":"1._suhukontrol.jpg"},"type":"media","link_text":null,"attributes":{"alt":"1._suhukontrol.jpg","title":"1._suhukontrol.jpg","height":"300","width":"400","class":"media-element file-default"}}]]
Komentar Terbaru