Jika kamu berpikir, maka kamu tau. Jika kamu tau, maka tercipta kondisi dalam hati yg mendorong utk berbuat

Monday, May 12, 2014

# Automatic Egg Incubator

Monday, May 12, 2014 Posted by Raosan Fikri Lillahi , , No comments
Dalam project akhir kali ini, tim kami membuat sebuah automatic egg incubator, diterjemahkan sebagai inkubator telur otomatis, atau bisa disebut juga pengeram telur cerdas. Apa bedanya dengan inkubator telur biasa? kenapa disebut cerdas? jawabannya akan dijelaskan sebagai berikut.

Anggota tim pembuat sistem inkubator telur.
(http://andyprimawan.tumblr.com/post/85416056468/mahasi
swa-sti-itb-ciptakan-inkubator-telur-otomatis)

Pendahuluan
Jadi, kenapa kami membuat meisn ini? jawabannya adalah karena kami ingin menyelesaikan sebuah masalah perteluran yaitu: ayam memiliki 'mood' untuk mengerami telur hanya pada waktu tertentu; jumlah ayam tidak sebanyak jumlah telur untuk dierami, dan inkubator yang ada kebanyakan manual dan merepotkan. Yah intinya kami ingin membuat sesuatu yang berguna untuk tugas akhir kami ini, dan bernilai ekonomis juga alias dapat dijual.

Komponen
Kompoen yang digunakan dalam project ini adalah sebagai berikut:
  1. 2 buah Arduino Uno
  2. Breadboard
  3. Kabel
  4. Sensor suhu LM35
  5. Relay
  6. LCD
  7. PIR Sensor (Sensor gerakan)
  8. Buzzer (alarm)
  9. Keypad
  10. Lampu bohlam 5 Wattyang telah dipasang kabel dan steker
  11. Kipas angin laptop
  12. Lapotop yang terinstall IDE arduino
  13. Kabel USB

Rangkaian
Semua komponen di atas kemudian disusun seperti blok diagram dan skema di bawah ini:

Blok Diagram

Skema Rangkaian

Walaupun kelihatannya agak rumit, namun kalau dikerjakan dengan sabar dan pelan-pelan sebenarnya mudah.

Spesifikasi Sistem
Jadi, apakah yang dapat dilakukan dalam sistem ini?
  • Memiliki input temperatur yang dideteksi oleh sensor LM35 dan input gerakan dideteksi oleh sensor PIR.
  • Memiliki 2 mode, yaitu mode automatic dan manual, namun secara default sistem akan berjalan dalam mode automatic.
  • Pada mode automatic, bila suhu di bawah suhu optimum, lampu akan menyala. Tujuannya agar suhu akan naik ke suhu optimum. Bila suhu berada di atas suhu optimum, kipas akan menyala untuk menurunkan suhu. Sedangkan bila sudah mencapai suhu optimum, kipas dan lampu akan mati. Dapat juga mendeteksi gerakan disekitar telur, bila terdeteksi gerakan misal telur sudah mau menetas, maka alarm/buzzer akan menyala.


  • Pada mode manual, kita dapat mengontrol sistem dengan menekan tombol yang sesuai untuk menyalakan lampu atau kipas, mematikan keduanya, mematikan alarm, dan berpindah antara mode Automatic atau Manual. 


Hasil Prototype
Berikut ini adalah prototype mesin inkubator telur otomatis yang kami buat:

Tampilan antarmuka

Rangkaian di dalamnya

Inkubator tempat pengeraman telur
Berikut adalah video hasil simulasi cara kerjanya:



Catatan Menarik
Dalam pengerjaan project ini, ada beberapa hal menarik yang harus diketahui:

Master-slave Arduino
Yang menarik dari 2 buah arduino yang digunakan dalam project ini yaitu konsep master-slave. Masing-masing arduino punya tugasnya. Sebut saja arduino 1 yang bertugas sebagai master, yaitu memproses inputan dari sensor dan menentukan apa yang akan dilakukan sistem (apakah menyalakan lampu, kipas, atau alarm). Master arduino ini akan mengirim sinyal ke arduino 2 yang bertugas sebagai slave. Selanjutnya slave arduino akan memerintahkan hardware yang sesuai untuk menyala.

Relay
Barang satu ini bisa dibilang ajaib. Sebenarnya relay adalah sebuah saklar yang dapat memutus dan menyambung aliran listrik, namun pemicunya bukan tangan kita, melainkan arus listrik. Dengan sedikit pemrograman, maka akan menjadi saklar otomatis yang akan menyala-matikan lampu bertegangan tinggi 220V dan kipas angin sesuai input dari sensor.



Kode Program
Berikut ini adalah kode program yang dipakai dalam sistem yang dibagi ke dua buah arduino:

Arduino 1 (Master)
// Arduino 1
// Master

//Mendefinisikan library yang dibutuhkan
#include Wire.h
#include Keypad.h
#include LiquidCrystal.h

//Mendefinisikan mode user
//Angka 0 = otomatis & 1 = manual
int state = 0;

//Mendefinisikan keypad
const byte ROWS = 4; // jumlah baris = 4
const byte COLS = 3; // jumlah kolom = 3

// Mendefiniskan keypad map
char keys[ROWS][COLS] = {
 {'1','2','3'},
 {'4','5','6'},
 {'7','8','9'},
 {'*','0','#'}
};

// Menghubungkan dengan pin arduino
byte rowPins[ROWS] = { 0, 1 , 7, 8 };
byte colPins[COLS] = { 9, 10, 13 }; 

//Menciptakan objek keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

//Mendefinisikan Layar LCD
const int inPin = 0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Inisiasi
void setup() {
 //Setting bit rate dari komunikasi serialnya 9600 bps
  Serial.begin(9600);
    
  //Setting awal untuk layar LCD
  //Banyaknya kolom yang dipakai 16.
  //Barisnya sebanyak 2.
  lcd.begin(16, 2);
    
  // Tuliskan pesannya ke LCD
  lcd.print("Suhunya saat ini :");

  //Setting untuk membuka koneksi
  Wire.begin();
}

//Tahapan yang selalu berulang
void loop() {
  //Mendefinisikan kondisi alarm
  //0 = OFF & 9 = ON
  int alarm = 0;

  //Mendefinisikan input keypad
  char key = kpd.getKey();
 
  //Mengeset hasil pembacaan sensor LM 35
 int value = analogRead(inPin);
 
 //Mengubah hasil pembacaan sensor LM 35
 //ke dalam milivolt
 float millivolts = (value / 1024.0) * 5000; 
 
 //Mengkonversi ke dalam Celcius
 float celcius = millivolts / 10;

  // Pindahkan kursor LCD ke baris 2, kolom paling kiri
  lcd.setCursor(0, 1);
    
  // Tulis temperatur ke LCD
  lcd.print(celcius); lcd.print(" C");
  
  //Tulis mode user saat ini
  //0 = Auto & 1 = Manual     
  if(state == 1){
    lcd.print(" MODE:M"); 
  }else if(state == 0){
    lcd.print(" MODE:A");
  }
  
  int out;
  Wire.beginTransmission(4); // transmit to device #4

  //Kondisi jika user menekan tombol keypad
  //Jika tombol * ditekan, maka state = Auto
  if(key == '*'){
    state = 0;
  }
  //Jika tombol # ditekan, maka state = Manual
  else if(key == '#') {
    state = 1;
  }
  //Jika tombol 9 ditekan, maka kondisi alarm = OFF
  else if(key == '9'){
    alarm = 9;
  }
  
  //Pengaturan data yang akan dikirimkan ke arduino 2
  //Jika mode Auto   
  if(state == 0){
    //Jika temperatur kurang dari kondisi optimal,
    //maka akan mengirimkan angka 1
    if (celcius < 36.00) {
      out=1;
    } 
    //Jika temperatur optimal
    //maka akan mengirimkan angka 2
    else if (celcius >= 36.00 && celcius <= 38.00) {
      out=2;
    } 
    //Jika temperatur lebih dari kondisi optimal
    //maka akan mengirimkan angka 3
    else if (celcius > 38.00) {
      out=3;
    }        
  }
  //Jika mode Manual
  else if(state == 1){
    //Jika user menekan tombol 1, maka kirimkan angka 4
    if(key == '1'){
      out=4;
    }
    //Jika user menekan tombol 2, maka kirimkan angka 5
    else if(key == '2'){
      out=5;
    }
    //Jika user menekan tombol 3, maka kirimkan angka 2
    else if (key == '3') {
      out=2;
    }
  }
 
  //Pengiriman data ke arduino 2
  //Jika alarm ON, maka kirimkan data variabel 'alarm'
  if(alarm == 9){
    Wire.write(alarm);    
  }
  //Kirimkan data yang berada di variabel 'out'
  else{
    Wire.write(out);
  }
  
  //Setting untuk menutup koneksi
  Wire.endTransmission();
 
  //Delay 1 detik
 delay(1000); 
}

Arduino 2 (Slave)
// Arduino 2
// Slave

//Mendefinisikan library yang dibutuhkan
#include Wire.h

//Mendefinisikan pin digital untuk relay
#define RELAY1  8                        
#define RELAY2  9                        

//Mendefinisikan state dari sensor PIR
//LOW = tidak ada gerakan         
int statePIR = LOW;

//Mendefinisikan pin digital untuk sensor PIR
int inputPIR = 7;

//Variabel untuk sensor PIR
int valPIR = LOW;
int statemove = 0;

//Mendefinisikan kondisi lampu
//0 = OFF & 1 = ON
int lampstate = 0;

//Mendefinisikan kondisi kipas
//0 = OFF & 1 = ON
int fanstate = 0;

//Mendefinisikan pin digital untuk buzzer
int pinALARM = 13;

//Variabel untuk iterator
int counter = 0;

//Inisialisasi
void setup()
{
  //Inisialisasi pin digital arduino untuk INPUT/OUTPUT
  pinMode(RELAY1, OUTPUT);       
  pinMode(RELAY2, OUTPUT);
  pinMode(inputPIR, INPUT);
  pinMode(pinALARM, OUTPUT);

  //Setting untuk membuka koneksi
  Wire.begin(4);

  //Setting arduino sebagai penerima data
  //Menjalankan function receiveEvent jika data diterima
  Wire.onReceive(receiveEvent);
  
  //Setting bit rate dari komunikasi serialnya 9600 bps
  Serial.begin(9600);
}

void loop()
{ 
  //Delay 0,1 detik
  delay(100);
}

//Function yang dieksekusi ketika ada data 
//yang diterima dari arduino 1
void receiveEvent(int howMany)
{
  //Menerima data yang dikirim dari arduino 1
  //dan disimpan ke dalam variabel integer 'x'
  int x = Wire.read();

  //Jika data yang diterima = 1 dan state lampu = OFF
  if (x == 1 && lampstate == 0) {
    //Lampu dinyalakan
    digitalWrite(RELAY1,LOW); 
    //Kipas dimatikan
    digitalWrite(RELAY2,HIGH);
    //Ubah state lampu = ON
    lampstate = 1;
  } 
  //Jika data yang diterima = 2 dan state lampu = ON
  //atau data yang diterima = 2 dan state kipas = ON
  else if (x == 2 && lampstate == 1 || x ==2 && fanstate == 1) {
    //Lampu dimatikan
    digitalWrite(RELAY1,HIGH);
    //Ubah state lampu = OFF
    lampstate = 0;
    //Kipas dimatikan
    digitalWrite(RELAY2,HIGH);
    //Ubah state kipas = OFF
    fanstate = 0;
  } 
  //Jika data yang diterima = 3 dan state kipas = OFF
  else if (x == 3 && fanstate == 0) {
    //Lampu dimatikan
    digitalWrite(RELAY1,HIGH);
    //Kipas dinyalakan
    digitalWrite(RELAY2,LOW);
    //Ubah state kipas = ON 
    fanstate = 1;
  } 
  //Jika data yang diterima = 4 (mode Manual)
  else if (x == 4) {
    //Lampu dinyalakan
    digitalWrite(RELAY1,LOW);
    //Kipas dimatikan
    digitalWrite(RELAY2,HIGH);
    //Ubah state lampu = ON 
    lampstate = 1;
  } 
  //Jika data yang diterima = 5 (mode Manual)
  else if (x == 5) {
    //Lampu dimatikan
    digitalWrite(RELAY1,HIGH);
    //Kipas dinyalakan
    digitalWrite(RELAY2,LOW); 
    //Ubah state kipas = ON
    fanstate = 1;
  }
  
  //Untuk mengatur sensor PIR dan buzzer
  //Membaca input dari sensor PIR
  valPIR = digitalRead(inputPIR);
  //Jika ada pergerakan dan alarm belum berbunyi
  if(valPIR == HIGH && statePIR == LOW){
    //Alarm dibunyikan
    digitalWrite(pinALARM, HIGH);
    //Ubah state gerakan = 1
    statemove = 1;
    //Ubah state alarm = ON
    statePIR = HIGH;
  }

  //Jika state gerakan = 1
  if (statemove = 1) {
    //Iterator bertambah
    counter++;
  }

  //Jika sudah lebih dari 30 detik 
  //atau user menekan tombol 9
  if (counter >= 30 || x == 9 ) {
    //Ubah state gerakan = 0
    statemove = 0;
    //Iterator kembali menjadi 0
    counter = 0;
    //Alarm dimatikan
    digitalWrite(pinALARM, LOW);
    //Ubah state alarm = OFF
    statePIR = LOW;
  }
}


Kendala
  • Hardware vs Software Error: kadang bila keluaran tidak sesuai yang diinginkan, kami bingung dalam proses debuggingnya, apakah masalah berasal dari kodingan yang tidak benar atau rangkaiannya. Hal ini sungguh membuat frustasi, namun sebenarnya bisa di atasi dengan pengerjaan rangkaian dan kodingan yang rapi
  • Masalah Kabel: untuk membuat suatu rangkaian yang cukup rumit, usahakan pakai kabel yang bagus (lentur namun ujungnya dapat tertancap kuat). Kelompok kami menggunakan kabel yang lentur, namun dalamnya berupa serabut, sehingga susah untuk ditancapkan dan mudah copot. kami mengakali hal ini dengan menyolder ujungnya sehingga menjadi lebih keras namun hati-hati agar tidak terlalu tebal agar dapat tetap ditancapkan.
  • Keberatan Beban Listrik dari Baterai: tadinya kami ingin sistem ini portable, hanya menggunakan baterai sebagai sumber listriknya, namun ternyata tidak kuat untuk memberi daya pada 2 arduino dan kipas angin sekaligus, akhinya kami menggunakan laptop sebagai sumber tenaga. Namun sebenarnya bisa di akali dengan menambah baterai atau membuat rangkaiannya menjadi paralel.
  • Selebihnya merupakan hal minor yang mudah untuk diatasi.

0 comments:

Post a Comment