Anda di sini

Elektronika

[TUTORIAL] Mengontrol Suhu dan Kelembapan Dalam Ruangan Menggunakan Kendali Smartphone Android

Agus Ady Aryanto - 22 November 2015 11:14:00 0

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 :

  1. Board Arduino
  2. Sensor suhu dan kelembaban (DHT11)
  3. Bluetooth
  4. Relay
  5. Kipas
  6. Kabel jumper
  7. Smartphone dengan platform Android

Jika sudah siap dengan bahannya langsung saja di rangkai seperti berikut ini :

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);
    }
}

3.775
Image

Agus Ady Aryanto

Profil pujangga Komang Agus Ady Aryanto belum tersedia.

Artikel Menarik Lainnya
Mari Gabung

Halo Emo 51 , Ada yang ingin disampaikan? Jangan sungkan untuk gabung diskusi ini. Silahkan Login dulu atau Daftar baru.