Monthly Archives: April 2018

Kalibrasi Gas Detektor

Kalibrasi Gas Detektor (Sumber gambar: Ventis Pro Series)

Mengapa gas detektor harus di kalibrasi? Sebetulnya tidak hanya gas detektor, namun pertanyaan ini juga harus selalu ditanyakan ke setiap alat pengukuran, apapun itu jenisnya.

Sepengetahuan saya hal ini dilakukan karena dua alasan. Pertama, pembacaan pada gas detektor dapat dipengaruhi oleh beberapa hal seperti: keadaan suhu dan kelembaban, kontaminasi dari paparan gas tertentu, mungkin juga pernah merespon konsentrasi gas tertentu sampai pada batas maksimum pengukurannya, berkurangnya lifetime produk, dsb. Hal-hal tersebut dapat mempengaruhi pembacaan, seperti misalnya konsentrasi dari suatu combustible gas terbaca sebesar 45%LEL yang sebetulnya konsentrasi aktualnya adalah 50%LEL. Kedua, biasanya dalam sebuah plant ada regulasi tersendiri dari tingkat manajerial ataupun departemen safety yang mengharuskan semua alat ukur harus terkalibrasi dan juga memiliki  jadwal kalibrasi secara periodik.

Oleh karena itu, jika sebelumnya saya pernah melakukan Kalibrasi Sensor Gas MQ-7 maka kali ini saya akan membagi rangkuman mengenai metode-metode pengujian gas detektor yang pernah saya lakukan.

1. Bump Test (Calibration Check)
Bump test merupakan metode pengujian gas detektor dengan menggunakan calibration gas (test gas) untuk memastikan bahwa gas detektor masih melakukan pembacaan secara tepat.

DSCF4892

Contoh test gas yang berisi methana (CH4) dengan konsentrasi sebesar 2.5% volume (50% LEL).

Test gas berisikan gas dengan konsentrasi tertentu yang biasanya kurang dari 100% LEL. Apabila gas detektor melakukan pembacaan secara tepat, maka saat dikoreksi menggunakan kalibrator akan menampilkan nilai konsentrasi yang sama besarnya dengan konsentrasi pada test gas.

DSCF4911

Kalibrator menampilkan hasil pengujian performa gas detektor (error 0.5%LEL)

Oleh karena itu, pada praktiknya di lapangan bump test biasanya dilakukan secara periodik untuk memastikan bahwa performa gas detektor di lapangan selalu dalam keadaan baik.

2. Function Test (Performance Test)
Function test merupakan pengujian yang sama dengan bump test hanya saja gas detektor yang di uji sudah terintegrasi dengan sistem alarm, sehingga pengujian ini selain memastikan pembacaan gas yang tepat juga memastikan sistem alarm bekerja sesuai dengan yang diinginkan. Semisal sebuah gas detektor telah dirancang untuk memberikan alarm LOW pada level 10% kemudian HIGH pada level 20% dan HIGH HIGH pada level 50%. Maka pengujian ini dilakukan untuk memastikan bahwa sistem alarm bekerja di tiap-tiap level tersebut.

3. Calibration
Penyesuaian respon gas detektor (sensor) agar sesuai dengan nilai yang diinginkan. Artinya dalam metode ini dilakukan pengaturan atau adjusment agar didapat respon yang diinginkan. Langkah kalibrasi yang paling mudah adalah dengan merujuk pada manual gas detektor, karena pada manual tersebut berisi prosedur kalibrasi yang jelas sehingga dapat menjamin agar prosedur kalibrasi yang dilakukan benar.

Disclaimer : Setiap manufaktur memiliki cara kalibrasi yang spesifik sesuai dengan produknya masing-masing. Sehingga penting untuk selalu mengikuti prosedur yang sudah dibuat oleh manufaktur.

 

Membuat Menu pada TFT LCD 2.2″ ILI9340

Pada tutorial kali ini saya akan coba menjelaskan cara membuat menu pada TFT LCD 2.2″ ILI9340 menggunakan Arduino. LCD ini sudah pernah saya gunakan pada tutorial penunjuk jarum Kompas Digital . Tujuan dari tutorial ini sederhana, ketika anda membuat suatu proyek elektronika menggunakan Arduino dan sebuah TFT LCD kemudian anda ingin menampilkan suatu user-interface, maka anda bisa melakukannya!

Sekilas tentang MENU
Pada dasarnya untuk membuat sebuah tampilan menu adalah dengan membuat beberapa halaman. Berapa banyak halaman yang akan dibuat bergantung pada berapa banyak menu atau bahkan sub-menu yang diiinginkan dan juga seberapa interaktif tampilannya.

Sebagai contoh saya berikan sebuah tampilan menu yang akan kita pelajari pada tutorial kali ini, berikut tampilannya.

Tampilan Menu Sederhana

Untuk membuat tampilan menu seperti gambar diatas, maka kita terlebih dahulu harus membuat beberapa halaman. Pada dasarnya gerakan pointer yang dapat berpindah-pindah dari opsi pertama menuju opsi selanjutnya adalah dengan membuat beberapa halaman berisikan posisi pointer yang berbeda-beda. Untuk lebih jelasnya coba perhatikan gambar dibawah ini.

Tampilan Menu yang berisi beberapa halaman

Namun yang perlu diperhatikan pada gambar diatas adalah: kita tidak perlu membuat semua halaman dengan seluruh isi teksnya. Pergerakan menu yang diinginkan dari tampilan diatas hanyalah pointernya saja. Oleh karena itu, pada setiap halaman hanya berisi kode program untuk menampilkan pointer saja, sedangankan untuk teks yang lain cukup dieksekusi sekali, lebih tepatnya tidak masuk dalam void loop namun masuk ke dalam void setup sehingga yang dieksekusi berkali-kali adalah kode program untuk pointernya.

Komponen
[1] Arduino Pro Mini 5V
[1] TFT LCD 2.2″ ILI9340
[1] Push Button
[1] Resistor 1kOhm
[~] Komponen penunjang (breadboard, kabel jumper, dll)

Koneksi Pin

Arduino (Uno, Pro Mini) LCD TFT 2.2″ (ILI9340) Push Button (Pull Up)
5V (VCC) VIN
GND GND
D8 RST
D9 DC
D10 CS
D11 MOSI
D13 SCK
D3 INPUT

Rangkaian

Rangkaian TFT LCD 2.2″ + Arduino Pro Mini 5V

Kode Program

/******************************************************************************
  This is an sketch for the project below
  ----> http://engine-near.com/2018/04/05/membuat-menu-pada-tft-lcd/

  Check out the links below to download specific library used in this project
  ----> https://github.com/adafruit/Adafruit_ILI9340
  ----> https://github.com/adafruit/Adafruit-GFX-Library
 
  All library works with Arduino IDE 1.6.5 version. 

  Written by Fathur Miftahudin for http://engine-near.com
 *****************************************************************************/

#include "SPI.h"
#include "Adafruit_GFX.h" Library for all our adafruit displays
#include "Adafruit_ILI9340.h" // Library for Adafruit TFT LCD 2.2"

#if defined(__SAM3X8E__)
    #undef __FlashStringHelper::F(string_literal)
    #define F(string_literal) string_literal
#endif

#define _sclk 13
#define _miso 12
#define _mosi 11
#define _cs 10
#define _dc 9
#define _rst 8

Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _rst);
int Button;

void setup() {
  pinMode(3,INPUT); // Digital input from pushButton
  tft.begin(); // TFT display
  pageMenu(); // Show display of page menu
}


void loop() {
  
  Button = digitalRead(3); //read the pushButton value
  
  if (Button == LOW){
    page1(); //--------------------------> Show page 1
    delay(200); // Avoid bounce

    int stoploop = false;
    while(!stoploop){
    Button = digitalRead(3);
    if (Button == LOW){
      stoploop = true;
      page2(); //------------------------> Show page 2
      delay(200);
      
      int stoploop = false;
      while(!stoploop){
      Button = digitalRead(3);
      if (Button == LOW){
        stoploop = true;
        page3(); //----------------------> Show page 3
        delay(200);
        
        int stoploop = false;
        while(!stoploop){
        Button = digitalRead(3);
        if (Button == LOW){
          stoploop = true;
          page4(); //--------------------> Show page 4
          delay(200);
          
            int stoploop = false;
            while(!stoploop){
            Button = digitalRead(3);
            if (Button == LOW){
              stoploop = true;
              page1(); //----------------> Back to page 1
          }      
          }
        }
        }      
      }
      }
    }
    }
  }
}


void pageMenu(){ // Show main page (menu)
  
  tft.fillScreen(ILI9340_BLACK);
  tft.setTextColor(ILI9340_WHITE);
  tft.setTextSize(2);
  
  tft.setCursor(55, 10);
  tft.print("MENU EXAMPLE");

  tft.drawLine(0, 32, 240, 32, ILI9340_WHITE); 
  
  tft.setCursor(75, 50);
  tft.print("Option 1");
  
  tft.setCursor(75, 95);
  tft.print("Option 2");
  
  tft.setCursor(75, 140);
  tft.print("Option 3"); 
  
  tft.setCursor(75, 185);
  tft.print("Option 4");

  tft.drawLine(0, 220, 240, 220, ILI9340_WHITE);
 
}

void page1(){
  
  tft.fillTriangle(45,187,45,197,55,192,ILI9340_BLACK); // Erase pointer option4
  tft.fillTriangle(45,52,45,62,55,57,ILI9340_WHITE); // Print pointer option1
  
}

void page2(){

  tft.fillTriangle(45,52,45,62,55,57,ILI9340_BLACK); // Erase pointer option1
  tft.fillTriangle(45,97,45,107,55,102,ILI9340_WHITE); // Print pointer option2
  
}

void page3(){

  tft.fillTriangle(45,97,45,107,55,102,ILI9340_BLACK); // Erase pointer option2
  tft.fillTriangle(45,142,45,152,55,147,ILI9340_WHITE); // Print pointer option3

}

void page4(){
  
  tft.fillTriangle(45,142,45,152,55,147,ILI9340_BLACK); // Erase pointer option3
  tft.fillTriangle(45,187,45,197,55,192,ILI9340_WHITE); // Print pointer option4
  
}

Jarum Penunjuk Kompas Digital HMC5883L + TFT LCD 2.2″

Jarum Penunjuk Kompas Digital HMC5883L + TFT LCD 2.2″

Pada tutorial kali ini, saya akan berbagi pengalaman membuat  kompas digital dengan tampilan berupa jarum penunjuk yang ditampilkan pada LCD. LCD yang digunakan bukanlah LCD  (16×2) yang umum digunakan pada proyek elektronika, melainkan menggunakan TFT LCD 2.2″. Jarum penunjuk ditampilkan dalam bentuk animasi yang nantinya akan selalu menunjuk ke arah utara layaknya jarum pada kompas analog, sehingga kemanapun sensor kompas (pengguna) berputar maka jarum akan selalu menunjuk ke arah utara.

Sekilas tentang kompas
Pada dasarnya jarum penunjuk pada kompas akan selalu menunjuk ke arah kutub utara magnetis bumi. Oleh karena itu, untuk membuat kompas digital yang selalu menunjuk ke arah utara layaknya kompas konvensional adalah dengan membuat suatu algoritma. Algoritma tersebut sebagai berikut: berapapun heading sensor kompas maka heading penunjuk arah utara akan memiliki nilai yang sama dengan heading sensor namun arahnya berkebalikan. Algoritma tersebut dibuat menggunakan circular function atau yang biasa disebut dengan fungsi trigonometri.

sincos-75

Circular Function (mathdemos.org)

Pergerakan heading oleh sensor merupakan representasi dari unit lingkaran dengan koordinat (sin θ, cos θ) yang pergerakannya searah dengan jarum jam (CW). Untuk membuat jarum (animasi) bergerak berlawanan dengan arah jarum jam (CCW) adalah dengan menggunakan hubungan koordinat kartesius terhadap koordinat kutub, yakni (cos θ, sin θ).

Dengan menggunakan koordinat (cos θ, sin θ) maka jarum bergerak sebesar heading sensor namun arahnya berkebalikan.

Dengan demikian, berapapun besar heading sensor kompas maka pergerakan jarum akan selalu menunjuk ke arah utara magnetis bumi yang secara definitif menunjuk ke arah 0°. Sebagai contoh, ketika sensor menghadap (heading) sebesar 30° maka jarum akan melakukan heading yang sama namun arahnya berkebalikan, hal inilah yang membuat tampilan jarum selalu menunjuk ke arah 0° alias arah utara.

K3

Heading sensor kompas sebesar 30°

Komponen
[1] Arduino Pro Mini 5V
[1] Sensor Kompas HMC5883L
[1] TFT LCD 2.2″ ILI9340
[~] Komponen penunjang (breadboard, kabel jumper, dll)

Koneksi Pin

Arduino (Pro Mini, Uno) HMC5883L (GY-271 breakout) LCD TFT 2.2″ (ILI9340)
5V (VCC) VCC VIN
GND GND GND
A4 (SDA) SDA
A5 (SCL) SCL
D8 RST
D9 DC
D10 CS
D11 MOSI
D13 SCK

Rangkaian

Rangkaian Kompas Digital HMC5883L + TFT LCD 2.2″ + Arduino Pro Mini 5V

Kode Program

/******************************************************************************
  This is an sketch for the project below
  ----> http://engine-near.com

  Check out the links below to download specific library used in this project
  ----> https://github.com/platisd/HMC5883L
  ----> https://github.com/adafruit/Adafruit_ILI9340
  ----> https://github.com/adafruit/Adafruit-GFX-Library
 
  All library works with Arduino IDE 1.6.5 version. If using the above version
  please click 'tools' and select 'fix encoding & reload'

  Written by Fathur Miftahudin for http://engine-near.com
 *****************************************************************************/


#include <Wire.h>      // Library for I2C Communication
#include <HMC5883L.h>  // Library for Compass HMC5883L
#include "SPI.h"
#include "Adafruit_GFX.h"    // Library for all our adafruit displays
#include "Adafruit_ILI9340.h" // Library for Adafruit TFT LCD 2.2"
#include <SPI.h>
 
#if defined(__SAM3X8E__)
    #undef __FlashStringHelper::F(string_literal)
    #define F(string_literal) string_literal
#endif

// These are the pins used for the Pro Mini & UNO
// for Due/Mega/Leonardo use the hardware SPI pins (which are different)
#define _sclk 13
#define _miso 12
#define _mosi 11
#define _cs 10
#define _dc 9
#define _rst 8


// Using software SPI is really not suggested, its incredibly slow
Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _rst);
// Use hardware SPI
int error = 0;
 
HMC5883L compass; // HMC5883L
 
void setup(void){
 
 Serial.begin(9600);
 Wire.begin();
 
 // HMC5883L
 compass = HMC5883L();  
 error=compass.SetScale(1.3);
 if(error!=0)Serial.println(compass.GetErrorText(error));
 Serial.println("Setting measurement mode to continous.");
 error=compass.SetMeasurementMode(Measurement_Continuous); 
 if(error != 0)Serial.println(compass.GetErrorText(error));
 
 tft.begin(); // TFTdisplay
 display_show(); // Show display such as battery, time & circle
 
}
 
// Magnetic declination in Jakarta 0.64° = 0.0111 rad
float declinationAngle=0.0111;
 
int heading_degrees=0;
int heading_degrees_old=360;
int heading_degrees_correction=-90;
 
void loop(void){
 
  MagnetometerScaled scaled=compass.ReadScaledAxis();
  
  float heading=atan2(scaled.YAxis,scaled.XAxis);
  
  heading+=declinationAngle;
  if(heading<0)heading+=2*PI;
  if(heading>=2*PI)heading-=2*PI;
 
  heading_degrees=heading*180/M_PI; //+heading_degrees_correction;
  if(heading_degrees<0)heading_degrees+=360;
  if(heading_degrees>=360)heading_degrees-=360;
 
  if(heading_degrees!=heading_degrees_old){
  
    display_info(); // Show compass heading
    display_graphic(); // Show animation (North direction)
    heading_degrees_old=heading_degrees;
 }
   delay(250);
}
 
// Determine coordinate of the circle
#define cx 120 // X coordinate
#define cy 160 // Y coordinate
#define cr 85 // Diameter of circle
 
void display_show(){
 
 tft.fillScreen(ILI9340_BLACK); 
 // Compass circle
 tft.fillCircle(120, 160, 97, ILI9340_WHITE);
 tft.fillCircle(120, 160, 84, ILI9340_BLACK);
    
 tft.fillCircle(120, 69, 5, ILI9340_BLACK);
 tft.fillCircle(120, 251, 5, ILI9340_BLACK);
    
 tft.fillCircle(29, 160, 5, ILI9340_BLACK);
 tft.fillCircle(211, 160, 5, ILI9340_BLACK);

 // Battery icon
 tft.fillRect(193, 6, 35, 17, ILI9340_WHITE);
 tft.fillRect(196, 9, 29, 11, ILI9340_BLACK); 
 tft.fillRect(198, 11, 18, 7, ILI9340_WHITE);
 tft.fillRect(228, 11, 4, 7, ILI9340_WHITE);

 // Time
 tft.setTextSize(2);
 tft.setCursor(5,8);
 tft.print("12:12");
 
}

void display_graphic(){

    // Animation of North direction
    int h=heading_degrees_old+90;
    int h2 = h - 90 ;
    int k2 = h + 90;

    tft.fillTriangle((int)(cx+(cr-70)*cos(M_PI/180*h2)),(int)(cy-(cr-70)*sin(M_PI/180*h2)), (int)(cx+(cr-12)*cos(M_PI/180*h)),(int)(cy-(cr-12)*sin(M_PI/180*h))
    ,(int)(cx+(cr-70)*cos(M_PI/180*k2)),(int)(cy-(cr-70)*sin(M_PI/180*k2)),ILI9340_BLACK);
    

    h=heading_degrees+90;
    h2 = h - 90 ;
    k2 = h + 90;

    tft.fillTriangle((int)(cx+(cr-70)*cos(M_PI/180*h2)),(int)(cy-(cr-70)*sin(M_PI/180*h2)), (int)(cx+(cr-12)*cos(M_PI/180*h)),(int)(cy-(cr-12)*sin(M_PI/180*h))
    ,(int)(cx+(cr-70)*cos(M_PI/180*k2)),(int)(cy-(cr-70)*sin(M_PI/180*k2)),ILI9340_WHITE);
 
    tft.fillCircle(120, 160, 15, ILI9340_WHITE); 
    tft.fillCircle(120, 160, 10, ILI9340_BLACK); 

}
 
void display_info(){

 tft.setTextSize(3);
 tft.fillRect(90,280,73,22,ILI9340_BLACK);
 tft.setTextColor(ILI9340_WHITE);
 tft.setCursor(95,280);
 tft.print(heading_degrees); // Print compass heading 

 tft.setTextSize(2);
 tft.write(247); // Print degree symbol
 delay(100);

}

Hasil Pengujian
Secara pemrograman arah utara magnetis yang dibentuk jarum akan selalu tepat, namun mungkin karena sensor kompas HMC5883L mengalami interferensi medan magnet maka arah utara yang ditunjuk oleh animasi jarum dapat menjadi kurang tepat sesuai dengan defleksi yang terjadi pada sensor.

Perlu diketahui bahwa utara magnetis bumi bukanlah utara 0° sehingga nanti dalam penggunaannya harus disesuaikan dengan deklinasi atau pergeseran medan magnet di lokasi dimana anda berada. Untuk mengetahui berapa besar deklinasi yang terjadi di lokasi anda maka dapat mengunjungi http://www.magnetic-declination.com/

Jika anda ingin lebih memaksimalkan tampilan jarum penunjuk kompas pada LCD, tentunya anda dapat menggunakan imajinasi atau kreatifitas anda sendiri untuk membuat tampilan yang lebih menarik seperti pada video dibawah ini.

Referensi:
[1] https://processing.org/tutorials/trig/
[2] http://mathdemos.org/mathdemos/sincos-demo1/
[3] https://en.wikipedia.org/wiki/Magnetic_declination