Anggota tim pembuat sistem inkubator telur. (http://andyprimawan.tumblr.com/post/85416056468/mahasiswa-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:
- 2 buah Arduino Uno
- Breadboard
- Kabel
- Sensor suhu LM35
- Relay
- LCD
- PIR Sensor (Sensor gerakan)
- Buzzer (alarm)
- Keypad
- Lampu bohlam 5 Wattyang telah dipasang kabel dan steker
- Kipas angin laptop
- Lapotop yang terinstall IDE arduino
- Kabel USB
Rangkaian
Semua komponen di atas kemudian disusun seperti blok diagram dan skema di bawah ini:
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?
Hasil Prototype
Berikut ini adalah prototype mesin inkubator telur otomatis yang kami buat:
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 2 (Slave)
Kendala
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.
Berikut ini adalah prototype mesin inkubator telur otomatis yang kami buat:
Tampilan antarmuka |
Rangkaian di dalamnya |
Inkubator tempat pengeraman telur |
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
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