SENSOR SUHU LM35 DENGAN JAM & TANGGAL YANG BISA DIATUR DENGAN TOMBOL

Penjelasan Singkat:
Hai sobat semua, kali ini kita akan membuat sebuah alat yang dapat memonitoring suhu dan menampilkannya pada layar LCD 16x2 dengan waktu dan tanggal yang dapat di atur dengan menggunakan 3 buah tombol. Disini waktu dan tanggal tidak menggunakan modul RTC melainkan memanfaatkan library time.h pada arduino. Berikut penampkannya.


Setelah dilakukan pengujian, nilai suhu yang dihasilkan oleh rangkaian arduino dengan sensor LM35 bisa dikatakan akurat setelah dibandingkan dengan termometer manual. Adapun pin yang digunakan pada arduino adalah sebagai berikut:
          Pin Tombol : 2 , 3 dan 4
          Pin LM35   : A0
Setelah merangkainya keatas papan breadboard maka sobat bisa langsung coba sketch dibawah ini:

Sketch Arduino
// Membuat Jam sederhana menggunakan library time.h
// Menampilkan nilai Suhu menggunakan LM35
// Waktu dan Tanggal tanpa menggunakan RTC
//---------------------------------------------------------------------------------------------------

// Library yang digunakan
//---------------------------------------------------------------------------------------------------
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Time.h>

// Inisialisi library LCD 16x2
//----------------------------------------------------------------------------------------------------
#define I2C_ADDR          0x27
#define BACKLIGHT_PIN     3
#define En_pin            2
#define Rw_pin            1
#define Rs_pin            0
#define D4_pin            4
#define D5_pin            5
#define D6_pin            6
#define D7_pin            7
LiquidCrystal_I2C  lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

// Pendeklarasian pin arduino
//----------------------------------------------------------------------------------------------------
const int   pSuhu = A0;
float       suhu, data;
char        ico_temp;

char *hari[] ={"Kamis ", "Jumat", "Sabtu ", "Minggu  ", "Senin ", "Selasa", "Rabu  "};
int maxday[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// Animasi Loading
//----------------------------------------------------------------------------------------------------
byte p1[8]      = {0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};
byte p2[8]      = {0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18};
byte p3[8]      = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C};
byte p4[8]      = {0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E};
byte p5[8]      = {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
byte temp [8]   = {B00100,B01010,B01010,B01110,B01110,B11111,B11111,B01110};

int detik       = 20;
int menit       = 10;
int jam         = 01;
int tanggal     = 01;
int bulan       = 12;
int tahun       = 2016;
int blinkState  = LOW;

unsigned long timer1;
unsigned long timer2; //update detik1
int curX;
int curY;
int set         = 6;

void setup() {
  lcd.begin (16,2);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);

  analogReference(INTERNAL);                //Jalankan tegangan referensi internal untuk suhu [LM35]
  lcd.createChar(ico_temp,temp);            //Buat karakter Suhu

  // Pin A0[pSuhu],2,3 & 4 jadikan sebagai masukan
  //----------------------------------------------
  pinMode(pSuhu,INPUT);
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);
  
  // Buat dan Jalankan animasi loding
  //--------------------------------------------------------------------------------------------------
  lcd.createChar(1, p1);
  lcd.createChar(2, p2);
  lcd.createChar(3, p3);
  lcd.createChar(4, p4);
  lcd.createChar(5, p5);
  loadanim();
  
  // Tampilkan data waktu dan tanggal pada LCD.
  //--------------------------------------------------------------------------------------------------
  setTime(jam, menit, detik, tanggal, bulan, tahun); 
}

void loop() {
  unsigned long currentMillis = millis();
  int t1  = digitalRead(2);               // Tombol Down
  int t2  = digitalRead(3);               // Tombol Up
  int t3  = digitalRead(4);               // Tombol Setting
  
  detik   = second();
  menit   = minute();
  jam     = hour();
  tanggal = day();
  bulan   = month();
  tahun   = year();
   
  // Jika tombol Setting di tekan
  //------------------------------------
  if (t3 == HIGH){
       set = set +1;
        delay(250);
       if (set > 6){
         set=0;
       }
  }
  
  // Setting waktu kedip-kedip
  //-------------------------------------
  if(currentMillis - timer1 > 300) {
     timer1 = currentMillis;  
    if (blinkState == LOW){
      blinkState = HIGH;  
    }
    else {
      blinkState = LOW;
    }
  } 
  
  // Setting pada posisi kedap-kedip
  //--------------------------------------------------------------------------------------
  if (set == 0)             //Jika posisi kedip pd tanggal, cek penekanan tombol up & down.
  {  
    curX = 0;
    curY = 0;
    if (t1 == HIGH){                                          //Jika tombol up ditekan
      tanggal = tanggal +1;                                   //Tanggal tambah dengan 1
      delay(100);                                             //Jeda 0,1 detik
      if (tanggal > maxday[bulan] ) {                         //Jika tanggal terakhir
        tanggal=1;                                            //Kembali ke tanggal awal
      }
    }
    if (t2 == HIGH){                                          //Jika tombol down yang ditekan
      tanggal = tanggal -1;                                   //Tanggal kurang dengan 1
      delay(100);                                             //Jeda 0,1 detik
      if (tanggal < 1 ) {                                     //Jika tanggal awal
        tanggal=maxday[bulan];                                //Kembali ketanggal akhir
      }
    }
    setTime(jam, menit, detik, tanggal, bulan, tahun);  
  }

  if (set == 1)           //Jika posisi kedip pd bulan, cek penekanan tombol up & down.
  {
    curX = 3;
    curY = 0;
    if (t1 == HIGH) {
      bulan = bulan +1;
      delay(100);
      if (bulan > 12 ) {
        bulan=1;
      }
    }
    if (t2 == HIGH) {
      bulan = bulan -1;
      delay(100);
      if (bulan < 1 ) {
        bulan=12;
      }
    }
    setTime(jam, menit, detik, tanggal, bulan, tahun);
  }
  
  if (set == 2)           //Jika posisi kedip pd tahun, cek penekanan tombol up & down.
  {
    curX = 6;
    curY = 0;
    if (t1 == HIGH) {
      tahun = tahun +1;
      delay(100);
      if (tahun > 3000 ) {
        tahun=2000;
      }
    }
    if (t2 == HIGH){
      tahun = tahun -1;
      delay(100);
      if (tahun < 2000 ) {
        tahun=3000;
      }
    }
    setTime(jam, menit, detik, tanggal, bulan, tahun);
  }
  
  if (set == 3) {           //Jika posisi kedip pd jam, cek penekanan tombol up & down.
    curX = 0;
    curY = 1;
    if (t1 == HIGH){
      jam = jam +1;
      delay(100);
      if (jam > 23 ) {
        jam=0;
      }
    }
    if (t2 == HIGH){
      jam = jam -1;
      delay(100);
      if (jam < 0 ) {
        jam=23;
      }
    }
    setTime(jam, menit, detik, tanggal, bulan, tahun);
  }
  
  if (set == 4) {           //Jika posisi kedip pd menit, cek penekanan tombol up & down.
    curX = 3;
    curY = 1;
    if (t1 == HIGH){
      menit = menit +1;
      delay(100);
      if (menit > 59 ) {
        menit=0;
      }
    }
    if (t2 == HIGH){
      menit = menit -1;
      delay(100);
      if (menit < 0 ) {
        menit=59;
      }
    }
    setTime(jam, menit, detik, tanggal, bulan, tahun);
  }
  
  if (set == 5) {           //Jika posisi kedip pd detik, cek penekanan tombol up & down.
    curX = 6;
    curY = 1;
    if (t1 == HIGH){
      detik = detik +1;
      delay(100);
      if (detik > 59 ) {
        detik=0;
      }
    }
    if (t2 == HIGH){
      detik = detik -1;
      delay(100);
      if (detik < 0 ) {
        detik=59;
      }
    }
    setTime(jam, menit, detik, tanggal, bulan, tahun);
  }

  //Jika kursor tidak pada posisi setting
  //-------------------------------------
  if (blinkState == LOW) {
    if (set != 6){
      lcd.setCursor(curX,curY);
      lcd.print("  ");
    }
  }
  
  
  // Tampilkan Jam Kalender
  //------------------------ 
  if (blinkState == HIGH) {
  lcd.setCursor(0, 0);
  if (tanggal < 10) lcd.print('0');
  lcd.print(tanggal);
  lcd.print("/");
  if (bulan < 10) lcd.print('0');
  lcd.print(bulan);
  lcd.print("/");
  lcd.print(tahun-2000);      // Tampilkan tahun dua digit saja
  
  lcd.setCursor(0,1);
  if (jam < 10) lcd.print('0');
  lcd.print(jam);
  lcd.print(":");
  if (minute() < 10) lcd.print('0');
  lcd.print(menit);
  lcd.print(":");
  if (second() < 10) lcd.print('0');
  lcd.print(detik);
  lcd.print("  ");
  lcd.setCursor(10, 0);
  lcd.print(hari[jumlahhari()%7]);  // Tampilkan Hari
  lcd.setCursor(10, 1);
  }
  // End // Tampilkan Jam Kalender
  
  data_suhu();                // Panggil fungsi pengecekan nilai suhu
}

// Digunakan untuk menghitung hari pasaran
//----------------------------------------
int jumlahhari(){   
  int d= day();
  int m= month();
  int y= year();
  int hb[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
  int ht = (y - 1970) * 365 - 1;
  int hs = hb[m - 1] + d;
  int kab = 0;
  int i;
  if(y % 4 == 0) {
    if(m > 2) {
    hs++;
    }
  }
  for(i = 1970; i < y; i++) {
    if(i % 4 == 0) {
    kab++;
    }
  }
  return (ht + hs + kab); 
}

void data_suhu(){  
  lcd.setCursor(10, 1);
  lcd.write(ico_temp);        //Custom icon temperatur
  //lcd.print(":");
  
  data = analogRead(pSuhu);   //Baca nilai tegangan pin A0 = Output LM35
  suhu = data / 9.309;        //Konversikan nilai tegangan ke Celcius


  lcd.setCursor(12, 1);
  lcd.print((int)suhu);        //Bulatkan nilai Suhu
  
  lcd.print((char)223);        //Simbol Derajat
  lcd.print("C");
  delay(100);
  } 
  
// Animasi pada saat loading
//----------------------------------------------------------------------------------------------------
void loadanim(){
  lcd.setCursor(5,0);
  lcd.print("LOADING");
  lcd.setCursor(0,1);
  for (int loadbar = 0; loadbar < 16; loadbar++) {
    lcd.setCursor(loadbar,1);  
    lcd.setCursor(loadbar,1);
    lcd.write(1);
    delay(10);
    lcd.setCursor(loadbar,1);
    lcd.write(2);
    delay(10);
    lcd.setCursor(loadbar,1);
    lcd.write(3);
    delay(10);
    lcd.setCursor(loadbar,1);
    lcd.write(4);
    delay(10);
    lcd.setCursor(loadbar,1);
    lcd.write(5);
    delay(10);
  } 
  
  delay(800);
  lcd.clear();
  
//----------------------------------------------------------------------------------------------------

}


Download Sketch & Library:
download[4]



OPTIMASI DAN PENYEDERHANAAN PROGRAM ARDUINO

Penjelasan Singkat:
Hai sobat semua, kali ini kita akan mempelajari cara pendeklarasian variable konstanta pada arduino dan juga cara penyederhanaanya dalam program arduino.  Pendeklarasian pin pada arduino kedalam variable konstanta kita lakukan untuk mempermudah kita dalam pemrograman sehingga kita lebih mudah mengingat nama variable yang kita buat  daripada mengingat tiap nomor pin yang kita gunakan pada arduino. Variable konstanta juga tidak memakan memory pada arduino. Dan berikutnya adalah penyederhanaan program yang dapat  mengurangi penggunaan space memory pada arduino.

Contoh Kasus:
Seandainya suatu saat sobat ingin membuat sebuah rangkaian lampu berjalan dengan menggunakan 5 buah led. Dan pin yang ingin sobat gunakan pada arduino adalah pin 3,5,6,9,10. Kita contohkan seperti gambar dibawah ini:



Pertama sekali yang akan sobat lakukan pada program adalah mendeklarasikan ke lima pin tersebut ke dalam  variable konstanta seperti berikut:
const int  led1 = 3;
const int  led2 = 5;
const int  led3 = 6;
const int  led4 = 9;
const int  led5 = 10;
Const int adalah perintah yang digunakan untuk mendeklarasikan variabel konstanta dalam bentuk variable integer pada program arduino. led1, led2, led3, led4 dan led 5 adalah nama variable konstanta mewakili nomor pin 3,5,6,9,10 pada arduino. Pemberian nama led1, led2.. dst, pastinya akan mempermudah sobat dalam penulisan program terutama pada saat penggunaan nama variable yang berulang-ulang daripada harus mengingat nomor tiap pin yang digunakan pada arduino. Untuk Pendeklarasian pin ke dalam variable konstanta diatas dapat juga kita sederhanakan menjadi seperti dibawah ini: 
const int  led[] = {3,5,6,9,10};

Selanjutnya kita akan melakukan konfigurasi pada tiap pin yang telah kita deklarasikan tersebut. Dimana led1 sampai dengan led5 akan kita jadikan sebagai  keluaran atau output. 
void setup() {
       pinMode(led1, OUTPUT);
       pinMode(led2, OUTPUT);
       pinMode(led3, OUTPUT);
       pinMode(led4, OUTPUT);
       pinMode(led5, OUTPUT);
}
Pendeklarasian tiap pin pada arduino diatas juga dapat kita sederhanakan menjadi:
void setup() {
for (char a=0; a<=4; a+=1) {
       pinMode(led[a], OUTPUT);
    }
}

Selanjutnya kita masuk ke bagian program utama, berikut contoh program jika kita ingin menyalakan led satu persatu secara bergantian dan kemudian mematikan led tersebut satu persatu  secara bergantian. Sobat dapat perhatikan programnya dibawah ini:
void loop() {
      digitalWrite(led1, HIGH);
         delay(300);
     digitalWrite(led2, HIGH);
         delay(300);
      digitalWrite(led3, HIGH);
         delay(300);
     digitalWrite(led4, HIGH);
         delay(300);
      digitalWrite(led5, HIGH);
         delay(300);
     digitalWrite(led4,  LOW);
         delay(300);
      digitalWrite(led3, LOW);
          delay(300);
     digitalWrite(led2, LOW);
          delay(300);
      digitalWrite(led1, LOW);
          delay(300);
    }
Perintah di atas dapat juga kita sederhanakan menjadi seperti berikut:
void loop() {
for (char d=0; d<=4; d+=1) {
      digitalWrite(led[d], HIGH);
      delay(300);
    }
  for (char e=4; e>=0; e-=1) {
      digitalWrite(led[e], LOW);
      delay(300);
    }
Selanjutnya mari kita perhatikan perbedaan program sebelum di sederhanakan dan sesudah disederhanakan.

Sketch program sebelum disederhanakan.
const int  led1 = 3;
const int  led2 = 5;
const int  led3 = 6;
const int  led4 = 9;
const int  led5 = 10;

void setup() {
       pinMode(led1, OUTPUT);
       pinMode(led2, OUTPUT);
       pinMode(led3, OUTPUT);
       pinMode(led4, OUTPUT);
       pinMode(led5, OUTPUT);
}

void loop() {
      digitalWrite(led1, HIGH);
         delay(300);
     digitalWrite(led2, HIGH);
         delay(300);
      digitalWrite(led3, HIGH);
         delay(300);
     digitalWrite(led4, HIGH);
         delay(300);
      digitalWrite(led5, HIGH);
         delay(300);
     digitalWrite(led4,  LOW);
         delay(300);
      digitalWrite(led3, LOW);
          delay(300);
     digitalWrite(led2, LOW);
          delay(300);
      digitalWrite(led1, LOW);
          delay(300);
    }

Sketch program setelah disederhanakan:
const int  led[] = {3,5,6,9,10};

void setup() {
for (char a=0; a<=4; a+=1) {
       pinMode(led[a], OUTPUT);
    }
}

void loop() {
for (char d=0; d<=4; d+=1) {
      digitalWrite(led[d], HIGH);
      delay(300);
    }
  for (char e=4; e>=0; e-=1) {
      digitalWrite(led[e], LOW);
      delay(300);
    }
}

Demikianlah cara pendeklarasian tiap pin arduino ke dalam variable konstanta dan cara penyederhanannya. Hal tersebut akan terasa sangat berguna pada saat sobat sudah mulai membuat program yang membutuhkan space memory yang cukup besar pada arduino. Sehingga program akan kelihatan lebih rapi, terstruktur dan memakan space memory yang lebih kecil.