10 November 2016

Tutorial 11 - Penggunaan "Delay" Yang Betul


Hai!! Apa khabar semua! Diharap anda semua mendapat perlindungan dari Allah s.w.t hendaknya. Ok, baiklah! Untuk tutorial kali ini, saya ingin berkongsi sedikit ilmu berkaitan dengan penggunaan "delay". Dalam Arduino, penggunaan delay haruslah sesuai mengikut projek yang anda ingin hasilkan.

APA ITU DELAY?

Delay adalah sejenis arahan yang apabila dilaksanakan, ia akan menyebabkan semua aktiviti terhenti seketika ( ikut masa yang telah disetkan ). Ya. Semua benda akan terhenti! Jika anda ingin membuat LED menyala selama 5 saat, pasti anda akan tulis code seperti dibawah:

1
2
3
4
5
void loop() {
  digitalWrite ( LED, HIGH );
  delay ( 5000 );
  digitalWrite ( LED, LOW );
}

Jika diperhatikan pada code diatas, saya telah meletakkan delay selama 5 saat (5,000ms) supaya LED tersebut terus menyala. Dalam kata lain, aturcara ini akan pause aktivitinya pada baris coding ke -3 selama 5 saat, kemudian barulah ia akan bergerak ke baris yang ke-4. Apa yang saya ingin tekankan disini adalah konsep freeze atau pause pada delay ini.

Jadi kenapa kita perlu elakkan mengguna delay?

Apabila Arduino masuk ke dalam arahan "delay", ia akan menyebabkan KESELURUHAN pin Input dan Output anda terhenti. Iya.. SEMUA! Bayangkan, anda ada sensor yang akan mengesan gas LPG dan secara kebetulan program anda masuk ke dalam arahan "delay ( 10000 )", pin yang ditugaskan untuk membaca sensor hanya akan mula beroperasi pada saat yang ke 10.001 saat. Sebab, pada saat yang ke 0.001 hingga ke 10, semua pin dalam keadaan beku atau freeze. Ini semua angkara "delay". Jahat kan? Apabila anda menggunakan sensor sahaja, perkara ini perlu diambil kira kerana ianya akan membuatkan projek anda tidak real - time.

Jadi, macam mana nak selesaikan??

Aaa.. Sebab itulah wujudnya command millis(). Apa itu millis()? Millis ini adalah satu arahan yang akan memberi kita nilai, dalam milisaat, berapa lama Arduino telah beroperasi (apabila mendapat bekalan kuasa). Nilai millis ini akan menjadi sifar selepas 50 hari.. Masa yang diberi ini adalah masa sebenar ye.. Tidak cepat 1 saat atau lewat 0.5 saat

Contoh projek:

Saya ingin membuat projek yang mengandungi 2 jenis sensor iaitu Gas Sensor dan Temperature Sensor (LM35). Apabila pin Gas = HIGH, kipas ekzos akan menyala selama 20 saat dan dalam masa yang sama, LM35 akan mendapatkan bacaan suhu. Jika suhu lebih dari 35 Celcius, Buzzer akan berbunyi sehinggalah suhu turun bawah dari 35 Celcius

** jika kita masih menggunakan "delay", mmg jahanam la sebab lama tu saya letak delay.. 20 saat.. Bayangkan kalau suhu dah cecah pada 45 Celcius pada saat yang ke-5 dan kebetulan bacaan gas pula HIGH, buzzer tak akan berbunyi la sebab masih belum keluar dari keadaan beku 20 saat tu..


Jadi nak buat macam mana? Ayuh, kita guna millis ()


const int Buzzer =  2;
const int Ekzos_Fan = 3;
const int GasSensor = A0;
const int LM35 = A1;
float Temp = 0;

int Gas_State = 0;
int LM35_State = 0; 
int Gas_Time;

void setup() 
 {

  pinMode ( Buzzer, OUTPUT );
  pinMode ( Ekzos_Fan, OUTPUT );
  pinMode ( GasSensor, INPUT );
  pinMode ( LM35, INPUT );
  
  int Gas_State = LOW;
  int LM35_State = LOW;
  
  int Gas_Time = 0;
  
 }

void loop()
{

  Gas_State = digitalRead (GasSensor);
  LM35_State = analogRead (LM35);
  Temp = LM35_State * 0.48828125;
  
  if ( Gas_State == HIGH )
     
     {
       Gas_Time = millis ();
       digitalWrite ( Ekzos_Fan, HIGH );
     }
  
  if ( Gas_Time > 0 && millis() - Gas_Time > 20000 )
     
     {
       digitalWrite ( Ekzos_Fan, LOW );
       Gas_Time = 0;
     }
  
  if ( Temp > 35 )
     
     {
       digitalWrite ( Ekzos_Fan, HIGH );
     }
     
  else
     
     {
       digitalWrite ( Ekzos_Fan, LOW );
     }
}

~ TAMAT ~