Wednesday, 29 November 2017

Pengendali Suhu Pada Ruangan Berbasis Arduino

Pada kesempatan ini saya akan membahas mengenai Pengendali Suhu Pada Ruangan Berbasis Arduino, yang merupakan tugas kuliah dengan mata kuliah Perancangan Berbasis Mikrokontroler, dengan dosen pengampu Bapak Ir. Eko Ihsanto, M. Eng. Tugas ini dikerjakan oleh saya dan rekan satu tim dengan profil sebagai berikut:

Nama : Edison Cipto Panjaitan
NIM : 41417110020
Jurusan/Prodi : Teknik Elektro
Kelas : Reguler II Universitas Mercu Buana

Nama : Debora Agape
NIM : 41417110097
Jurusan/Prodi : Teknik Elektro
Kelas : Reguler II Universitas Mercu Buana

Pada proyek ini, saya hanya akan membuat simulasi pengendali suhu ruangan menggunakan Proteus7. Sebelum masuk ke pembahasan lebih lanjut, ada baiknya saya menjelaskan terlebih dahulu komponen-komponen yang digunakan pada sistem kontrol suhu ruangan ini.
  1. Arduino Uno, sesuai dengan judulnya sistem ini menggunakan Arduino Uno sebagai controller-nya. Klik spoiler berikut untuk melihat gambar komponen.
  2. Arduino:
  3. Sensor suhu LM35, sensor suhu ini digunakan sebagai parameter untuk mengukur kondisi suhu di dalam ruangan, dimana akan ditentukan setpoint suhu minimal dan maksimal sebagai parameter suhu ruangan. Klik spoiler berikut untuk melihat gambar komponen.
  4. LM35:
  5. Servo Motor, merupakan penggerak tuas jendela. Servo motor ini digunakan untuk membuka dan menutup jendela ruangan berdasarkan suhu yang diukur oleh sensor suhu LM35. Klik spoiler berikut untuk melihat gambar komponen.
  6. Servo Motor:
  7. Fan Motor, merupakan kipas yang digunakan untuk menurunkan suhu ruangan sesuai dengan yang dibutuhkan. Fan akan menyala sesuai dengan kondisi suhu yang diukur oleh sensor suhu LM35. Klik spoiler berikut untuk melihat gambar komponen.
  8. Fan Motor:
  9. Fan Driver, komoponen ini terdiri dari beberapa transistor yang berfungsi untuk mengatur kecepatan fan motor dengan menyesuaikan PWM (Pulse Width Modulator)-nya. Klik spoiler berikut untuk melihat gambar komponen.
  10. Fan Driver:
  11. LCD, digunakan untuk menampilkan tampilan utama sistem dan tampilan saat sistem beroperasi (nilai suhu yang diukur sensor suhu LM35). Klik spoiler berikut untuk melihat gambar komponen.
  12. LCD:
  13. Push Button, merupakan komponen interupsi untuk mengalihkan sistem dari kondisi STANDBY ke kondisi sistem beroperasi, dan sebaliknya. Klik spoiler berikut untuk melihat gambar komponen.
  14. Push Button:
Gambar rangkaian Pengendali Suhu Pada Ruangan Berbasis Arduino secara keseluruhan, klik spoiler berikut untuk melihat gambar rangkaian.
Rangkaian:
Beberapa hal yang perlu diketahui:
  1. Posisi servo motor 180 derajat: Jendela Menutup.
  2. Posisi servo motor -180 derajat: Jendela Membuka
  3. Posisi awal servo motor diatur 180 derajat, yang artinya jendela menutup
  4. Ada tiga kondisi suhu ruangan yang digunakan pada sistem ini, yaitu: SUHU DINGIN (dibawah setpoint minimal), SUHU ADEM (diantara setpoint minimal dan maksimal), dan SUHU PANAS (diatas setpoint suhu maksimal).
  5. Setpoint suhu minimal : 28°C, setpoint suhu maksimal : 39°C.
Cara kerja sistem kontrol suhu pada ruangan ini.
  1. Pada saat sistem pertama kali dinyalakan, maka sistem akan masuk ke kondisi STANDBY dimana LCD akan menampilkan status sistem yaitu 'STANDBY' dan terdapat perintah untuk menekan tombol push button untuk masuk ke kondisi sistem beroperasi.
  2. Ketika tombol push button ditekan untuk penekanan pertama, maka sistem akan beralih dari kondisi STANDBY ke kondisi sistem beroperasi. Pada kondisi ini, Arduino Uno sebagai controller akan mengolah data analog yang dikirim oleh sensor suhu LM35 untuk selanjutnya data suhu tersebut akan ditampilkan ke LCD. Data analog sensor suhu LM35 yang telah diolah oleh Arduino Uno akan menjadi parameter untuk mengoperasikan servo motor dan fan motor.
  3. Pada kondisi sistem beroperasi, sensor suhu LM35 akan terus mengukur kondisi suhu di dalam ruangan. Apabila suhu ruangan telah mencapai atau melebihi setpoint suhu maksimal, maka servo motor akan berputar -180 derajat untuk membuka jendela, fan motor (kipas) akan berputar full (kecepatan penuh), dan LCD akan menampilkan nilai suhu pada ruangan dan menampilkan status suhu ruangan 'SUHU PANAS'.
  4. Setelah jendela terbuka, akan terjadi sirkulasi udara dari luar ke dalam ruangan dan sebaliknya. Sirkulasi udara ini ditambah fan motor yang berputar dengan kecepatan penuh mempengaruhi suhu di dalam ruangan, sehingga suhu di dalam ruangan akan turun.
  5. Ketika suhu turun dibawah setpoint suhu maksimal, kecepatan fan motor akan berkurang hingga setengah kecepatan penuh, dan LCD akan menampilkan nilai suhu pada ruangan dan menampilkan status suhu ruangan 'SUHU ADEM'. Sementera servo motor tetap pada posisi sebelumnya, yaitu terbuka
  6. Apabila suhu pada ruangan terus menurun dan mencapai atau dibawah setpoint suhu minimal, maka servo motor akan berputar 180 derajat untuk menutup jendela, kecepatan fan motor akan berkurang hingga berhenti berputar, dan LCD akan menampilkan nilai suhu pada ruangan dan menampilkan status suhu ruangan 'SUHU DINGIN'.
  7. Demikian seterusnya cara kerja sistem kontrol ini.
  8. Pada saat sistem dalam kondisi beroperasi, kemudian push button ditekan untuk penekanan kedua, maka sistem akan kembali ke kondisi STANDBY
Listing program:
Listing Program:
=============================================================
#include < LiquidCrystal.h >
#include < Servo.h >
int inputPB1=2;//variabel mendefinisikan input push button di pin 8
int kondisiInputPB1=1;//variabel untuk menyimpan kondisi awal input push button
int hitung;

int pwm=12;//variabel mendefinisikan pwm fan ada di pin 12
int Tr1=1;//variabel mendefinisikan driver transistor 1 di pin 1
int Tr2=0;//variabel mendefinisikan driver transistor 2 di pin 0
int Tr3=10;//variabel mendefinisikan driver transistor 3 di pin 10
int Tr4=11;//variabel mendefinisikan driver transistor 4 di pin 11
Servo runservo; // membuat nama objek servo untuk pengontrolan servo
int posisi=180; // variable untuk menyimpan posisi servo
float suhu;//variabel suhu bertipe data float
int maks= 39;//variabel mendefinisikan nilai suhu maksimal
int minimal= 28;//variabel mendefinisikan nilai suhu minimal
LiquidCrystal lcd (7,6,5,4,3,8);//deklarasi pin LCD

void setup()
{
pinMode(inputPB1, INPUT); //memberikan status variabel inputPB1 sebagai INPUT
pinMode(Tr1, OUTPUT);//memberikan status variabel Tr1 sebagai OUTPUT
pinMode(Tr2, OUTPUT);//memberikan status variabel Tr2 sebagai OUTPUT
pinMode(Tr3, OUTPUT);//memberikan status variabel Tr3 sebagai OUTPUT
pinMode(Tr4, OUTPUT);//memberikan status variabel Tr4 sebagai OUTPUT
pinMode(pwm, OUTPUT);//memberikan status variabel pwm sebagai OUTPUT
runservo.attach(9); // objek servo diletakan pada pin 9
lcd.begin(16,2);//memulai lcd 16x2
EICRA = 0; EIMSK = 0; EIFR = 0;
EICRA |= (1 << ISC01);
EIMSK |= (1 << INT0);
EIFR |= (1 << INT0);
interrupts();
}

ISR(INT0_vect){
for( hitung=0;hitung<3 br="" hitung="++"> if(hitung==1){

}

if(hitung==2){
analogWrite(pwm, 0);
analogWrite(Tr1,0);
digitalWrite(Tr2, LOW);
digitalWrite(Tr3, LOW);
analogWrite(Tr4, 0);

if( suhu>minimal && suhu < maks )
{
}

if(suhu>maks){

}
}}}

//subrutin program untuk menutup jendela (dalam hal ini menggerakkan motor servo +180 derajat)
void jend_tutup(){

for(posisi = 0; posisi < 180; posisi ++) // start dari 0 derajar sampai 180 derajat
{
// pada posisi 1 derajat
// memberitahu servo untuk pergi ke posisi 'pos'
runservo.write(180);
delay(15); // tunggu 15ms untuk pencapaian posisi servo
}}

//subrutin program untuk membuka jendela (dalam hal ini menggerakkan motor servo -180 derajat)
void jend_buka(){

for(posisi = 180; posisi > 0; posisi --) // start dari 180 derajar sampai 0 derajat
{
// pada posisi 1 derajat
// memberitahu servo untuk pergi ke posisi 'pos'
runservo.write(0);
delay(15); // tunggu 15ms untuk pencapaian posisi servo
}}

//subrutin program untuk tampilan dan speed pwm kipas pada suhu adem ( > 28 degC & < 39 degC )
void pwm_adem(){

analogWrite(pwm, 128);//mengaktifkan pwm dengan nilai 128
analogWrite(Tr1,128);//mengaktifkan Tr1 dengan nilai 128
digitalWrite(Tr2, HIGH);//mengaktifkan Tr2 dengan nilai HIGH
digitalWrite(Tr3, HIGH);//mengaktifkan Tr3 dengan nilai HIGH
analogWrite(Tr4, 128);//mengaktifkan Tr4 dengan nilai 128

lcd.setCursor(0,0);//menempatkan karakter pada baris 0 dan kolom 0 LCD
lcd.print("SUHU ADEM");//mencampilkan karakter SUHU ADEM pada LCD
lcd.setCursor(0,1);//menempatkan karakter pada baris 1 kolom 0 LCD
lcd.print("Suhu:");//menampilkan karakter Suhu: pada LCD
lcd.setCursor(6,1);//menempatkan karakter pada baris 1 kolom 6 LCD
lcd.print(suhu);//instruksi menampilkan nilai suhu ke LCD
lcd.setCursor(12,1);//menempatkan karakter pada baris 1 dan kolom 12 LCD
lcd.print("degC"); //menampilkan karakter degC pada LCD
}

//subrutin program untuk tampilan dan speed pwm kipas pada suhu dingin ( < 28 degC )
void pwm_dingin(){

analogWrite(pwm, 0);
analogWrite(Tr1,0);
digitalWrite(Tr2, LOW);
digitalWrite(Tr3, LOW);
analogWrite(Tr4, 0);

lcd.setCursor(0,0);
lcd.print("SUHU DINGIN");
lcd.setCursor(0,1);
lcd.print("Suhu:");
lcd.setCursor(6,1);
lcd.print(suhu);
lcd.setCursor(12,1);
lcd.print("degC");
}

//subrutin program untuk tampilan dan speed pwm kipas pada suhu panas (>39 degC)
void pwm_panas(){

lcd.setCursor(0,0);
lcd.print("SUHU PANAS");
lcd.setCursor(0,1);
lcd.print("Suhu:");
lcd.setCursor(6,1);
lcd.print(suhu);
lcd.setCursor(12,1);
lcd.print("degC");

analogWrite(pwm, 512);
analogWrite(Tr1,512);
digitalWrite(Tr2, HIGH);
digitalWrite(Tr3, HIGH);
analogWrite(Tr4, 1024);
}

//tampilan ketika tombol ditekan kedua kalinya
void mulai(){

lcd.setCursor(0,0);
lcd.print("STANDBY");
lcd.setCursor(0,1);
lcd.print("ON: TEKAN TOMBOL");

//set posisi awal jendela dengan posisi motor servo 180 derajat
for(posisi = 0; posisi < 180; posisi ++) // start dari 0 derajar sampai 180 derajat
{
// pada posisi 1 derajat
// memberitahu servo untuk pergi ke posisi 'pos'
runservo.write(180);
delay(15); // tunggu 15ms untuk pencapaian posisi servo
}}

void loop()
{
mulai(); //memanggil subrutin mulai()

//subrutin program utama untuk sistem
kondisiInputPB1=digitalRead(inputPB1);//membaca nilai digital pada pin inputPB1
if(kondisiInputPB1==0){ //interupsi jika pushbutton ditekan maka nilai variable 'kondisiInputPB1'akan bernilai 0
for(hitung=0;hitung<3:hitung akan="" bertambah="" br="" ditekan="" hitung="" maka="" nilai="" pengulangan="" pushbutton="" setiap="" variable=""> lcd.clear();
while(hitung==1){ //kondisi jika nilai variable 'hitung' sudah bernilai 1 sesuai dengan jumlah penekanan pushbutton
suhu= analogRead(5); //membaca nilai adc sensor
suhu=suhu*500/1023; //konversi data analog menjadi milivolt & konversi kedalam derajat celsius dengan persamaan 1derajat/10mv

if(suhu>minimal && suhu {
pwm_adem(); //memanggil subrutin program pwm_adem()
}

else if(suhu<=minimal) //kondisi jika suhu dibawah suhu minimal
{
pwm_dingin(); //memanggil subrutin program pwm_dingin()
jend_tutup(); //memanggil subrutin program jend_tutup()
lcd.clear(); //perintah merefresh layar }

else if(suhu>maks)//kondisi suhu jika suhu diatas suhu maksimal
{
pwm_panas(); //memanggil subrutin pwm_panas()
jend_buka(); //memanggil subrutin program jend_buka()
lcd.clear(); //perintah merefresh layar
}

else{jend_tutup();}
}

while(hitung==2){ //kondisi jika nilai variable 'hitung' sudah bernilai 2 sesuai dengan jumlah penekanan pushbutton
mulai(); } //memanggil subrutin mulai()

lcd.clear();
delay(10);
hitung==0;
}}}
=============================================================
File skematik dan program sistem Pengendali Suhu Ruangan Berbasis Arduino ini dapat didownload dengan mengklik link ini https://drive.google.com/open?id=1tv3rvGaPhQ8z5luMvi4Pq2iGt1kd9ABa

Untuk melengkapi penjelasan di atas, berikut saya sertakan video mulai dari cara penggunaan Proteus7, penjelasan mengenai program pengendali suhu ruangan ini, dan sistem kerja sistem pengendali suhu ruangan ini.

Video Tutorial
Part-1


Part-2


Part-3


Part-4

Part-5

0 comments

Post a Comment