Minggu, 28 Agustus 2016

Digital Clock + Prayer Times + Thermometer dengan DS3231 dan LCD TFT 2.4"


Sourche Code untuk project ini dapat di download di google drive saya melalui link nerikut :

https://drive.google.com/open?id=0B7t_g4hdtuILczh2RV9tS0IybUU



 Membuat Digital Clock + Prayer Time + Thermometer dengan LCD TFT 2.4" dan RTC DS3231

Module yang dibutuhkan dalam Project ini :

- 1 Unit Arduino Uno Atmega328
- 1 Unit Module RTC DS3231
- 1 Unit Module LCD TFT 2,4 inch dengan Chip Controller ILI9328 / ILI9325 / ILI9341
- Beberapa pcs kabel Jumper Dupont Male-Female dan Female-Female

  (Apabila anda mempunyai LCD TFT 2,4 yang berbeda Seri Chip Driver Controllernya mungkin tidak
   bisa berjalan dengan Library Adafruit dan HARUS menggunakan library mcufriend_kbv atau Uglib
   sehingga harus ada modifikasi coding pada bagian tampilan display nya )

 

Library Arduino yang dibutuhkan dalam Project ini :

- Library SPFD5408 untuk LCD TFT dengan chip ILI9325/9328 download disini.
- Library Adafruit_LCD_TFT untuk LCD TFT dengan chip ILI9341/Other Chip download disini.
- Library mcufriend_kbv untuk LCD TFT yang tidak mau jalan dengan Lib Adafruit download disini.
- Library RTC DS3231 download disini. 

  (Beberapa kasus apabila anda menggunakan LCD TFT 2,4 yang menggunakan library selain 
  SPFD5408 (mcufriend dan Adafrui TFT_LCD) harus mengatur ulang posisi cursor text & shape.

Wiring Module ke Arduino Board Project ini :

Menghubungkan Arduino uno dengan  Module LCD TFT 2,4"

-Karena Module LCD TFT 2,4" sudah berbentuk Uno Shiled maka tidak perlu adanya Wiring jumper dari module ini ke Arduino Board.Yang perlu kita perhatikan adalah adanya pin yang nantinya akan dipakai bersama oleh Module LCD TFT dan Module RTC DS3231 yaitu pin Analog A4.

-Pin A4 pada Arduino dipakai oleh Module TFT LCD sebagai RESET PIN yang fungsinya sebagai Trigger LCD BEGIN atau untuk memulai penggunaan LCD dan pengkosongan layar


#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

Pada sample coding dari library kita dapat melihat bahwa pin Analog A0 sampai dengan A4 digunakan oleh LCD termasuk A4 sebagai LCD RESET.

Pada sample diatas juga disebutkan bahwa pin LCD RESET dapat menggunakan pin selain A4 (Apabila pin A4 akan digunakan untuk keperluan lain.misal komunikasi i2c/iic/twi) yaitu dengan menggabungkan pin LCD RESET dengan PIN RESET (RST) pada board Arduino.

Saya tidak menyarankan anda menggunakan metode diatas (LCD RESET ke Arduino RESET pin) karena LCD tidak akan langsung bekerja saat arduino mendapatkan power supply dan akan BLANK putih sampai anda menekan tombol reset pada Arduino baru LCD akan Start.

Hal ini bisa kita akali dengan menggunakan pin yang tersisa (yang tidak digunakan oleh LCD) yaitu pin A5, D0 dan D1. Ketiga pin tersebut adalah sisa pin pada Arduino Uno setelah menggunakan LCD TFT 2,4+Touchscreen+Memory Card/data logger.

Kita tidak akan menggunakan pin A5 karena A5 adalah pin SCL yang akan kita gunakan untuk komunikasi i2c dengan RTC DS3231.Pin D0 juga adalah Pin RX Arduino artinya kalau kita menggunakanya maka Arduino akan mengalami Error saat Upload Program dari USB.Jadi kita akan menggunakan Pin D1 sebagai pin trigger LCD RESET sebagai pengganti PIN A4.

Maka pada Define pin LCD akan kita rubah seperti di bawah ini :


#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET 1 // Pin D1 Arduino kita fungsikan sebagai pin LCD RESET

Pada penggunaan LCD nya kita tidak boleh memasukan pin LCD Reset ke dalam lubang A4 pada Board Arduino karena kita akan menghubungkanya dengan pin D1.Jadi Jika kita akan menghubungkan langsung LCD ke Arduino Board kita harus "membengkokan" pin LCD Reset ke dalam atau keluar agar tidak masuk ke lubang A4 kemudian kita dapat menggunakan kabel Jumper untuk menghubungkan pin LCD RESET dengan Pin D1 (TX) pada Arduino Uno Board.

(Perhatikan gambar diatas, Jumper kabel warna hitam dari pin LCD RST menghubung ke pin D1 Arduino)

Catatan : Karena pin D1 adalah pin TX Serial Arduino dan kita gunakan untuk keperluan selain Serial Comunication maka kita tidak boleh mengaktifkan fungsi Serial pada Arduino ( Serial.begin();), jika Serial pada arduino diaktifkan maka LCD akan terus Restart jika ada signal TTL/serial  keluar dari PIN TX(D1)


Menghubungkan Arduino uno dengan  Module RTC DS3231
  
RTC DS3231 < --> Arduino Uno
           VCC  <--> pin 5V Arduino
           GND  <--> pin GND Arduino
           SDA  <--> pin SDA Arduino (A4)
           SCL  <--> pin SCL Arduino (A5)

Karena  bagian depan PIN Arduino sudah penuh tertutup LCD Shiled maka anda bisa menggunakan bagian belakang Arduino untuk mengambil jalur kabel jumper duppont untuk Module DS3231.
Apabila Anda menggunakan Arduino Uno Clone CK340 dengan dilengkapi lubang (troughhole) disisi dalam Female Header Arduino,anda bisa memasang MALE HEADER (pin tulang ikan) pada lubang tersebut melalui sisi belakang Board Arduino Uno Clone CH340.


Sketch Coding Arduino :

Berikut adalah Sketch Coding Arduino unuk project ini 
Pastikan anda sudah download semua library yang dibutuhkan dan memasukanya ke dalam folder Libraries pada Folder Installer Arduino IDE.
Untuk program ini saya menyarankan untuk menggunakan Versi Arduino IDE diatas Ver.1.6.5
Copy semua coding dibawah ini kemudian Upload ke Arduino Board anda.


///////////////////////////////////////////////
// Coding ini dibuat Oleh Dani Rajacell ///////
// Untuk www.belajarduino.com /////////////////
// Support by www.tokopedia.com/rajacell //////
// Copyright 27/8/2016 Rev.0.1 ////////////////
///////////////////////////////////////////////

#include <DS3231.h> //Memanggil RTC3231 Library
#include <Wire.h>  // i2C Conection Library
//#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include <SPFD5408_Adafruit_TFTLCD.h> // Hardware-specific library
#include "Jadwal_Sholat_Bekasi.h" //File jadwal Shollat untuk Bekasi
//#include "Jadwal_Sholat_JakPus.h" //File jadwal Shollat untuk Jakarta Pusat
//untuk library jadwal sholat daerah lain bisa hubungi admin web ini

#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET 1 // Can alternately just connect to Arduino's reset pin

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

// Init RTC DS3231
DS3231  rtc(SDA, SCL);

// Init a Time-data structure
Time  t; //pencacah string time()

//Mengambil waktu jam dari waktu Compile/Upload di system Windows
//digunakan untuk setting RTC pertama kali
uint8_t hh = 0, mm = 0, ss = 0, dd = 0, bb = 0;
int yy = 0;
String Day = "  ";
String Month = "  ";

//analog clock
float sx = 0, sy = 1, mx = 1, my = 0, hx = -1, hy = 0;    // Saved H, M, S x & y multipliers
float sdeg = 0, mdeg = 0, hdeg = 0;
uint16_t osx = 120, osy = 120, omx = 120, omy = 120, ohx = 120, ohy = 120; // Saved H, M, S x & y coords

void setup()
{
  //pinMode (0, OUTPUT); //Untuk Fungsi Alarm
  rtc.begin(); //Memulai RTC
  tft.reset(); //Memulai LCD
  tft.begin(0x9328);  //LCD Address ILI9328 
  
tft.setRotation (3); //Set LCD to Lanscape
tft.fillScreen (BLACK); //Set Background Color

//Gunakan untuk setting RTC pertama kali (setelah RTC di setup upload ulang tanpa kode set RTC)
rtc.setTime (15, 37, 00); //set jam (hh,mm,ss)
//rtc.setDate(23, 8, 2016); //set tanggal (dd,bb,yyyy)
}
///////////////////////////////////////////////
// Coding ini dibuat Oleh Dani Rajacell ///////
// Untuk www.belajarduino.com /////////////////
// Support by www.tokopedia.com/rajacell //////
// Copyright 27/8/2016 Rev.0.1 ////////////////
///////////////////////////////////////////////

void loop(){
  
t = rtc.getTime();
Day = rtc.getDOWStr(); //mengambil data String nama Hari
Month = rtc.getMonthStr(1); //mengambil data String nama Bulan

hh = t.hour,DEC;
mm = t.min,DEC;
ss = t.sec,DEC;
dd = t.date,DEC;
bb = t.mon,DEC;
yy = t.year,DEC;

analogClock (); //menjalankan tampilan jam analog
if (hh==0&&mm==0&&ss==1){tft.fillScreen (BLACK);}

//menjalankan running text dibagian atas
tft.fillRect (0,0,319,10,BLACK);
tft.setTextColor (WHITE,BLACK);
tft.setTextSize (1);
tft.setCursor (ss*3.3,1);
tft.print (F("www.belajarduino.com")); 

//Menampilkan data 'Date" dari RTC
tft.setTextColor (YELLOW,BLACK);
tft.setTextSize (2);
tft.setCursor (20,20);
tft.print (dd); 
tft.print (F("."));
tft.print (Month); 
tft.print (F("."));
tft.print (yy);

//Menampilkan data Suhu dari RTC
tft.setCursor (220,20);
tft.setTextColor (RED,BLACK);
tft.print (rtc.getTemp()); 
tft.print (F("'C"));

//JAM UTAMA
tft.setTextColor (rainbow(ss*2),BLACK);
tft.setTextSize (6);
tft.setCursor (20,50);
if(hh<10){tft.print (F("0"));}
tft.print (hh); 
tft.print (":");
if(mm<10){tft.print (F("0"));}
tft.print (mm); 
tft.print (":");
if(ss<10){tft.print (F("0"));}
tft.print (ss);

//Menampilkan data nama Hari (now)
tft.setTextColor (MAGENTA,BLACK);
tft.setTextSize (3);
if (Day.length()==8){tft.setCursor (152,103);}
else if (Day.length()==7){tft.setCursor (166,103);}
else {tft.setCursor (180,103);}
tft.print (Day); 

//Menampilkan Jadwal Solat
String pTime ="   ";
if (bb==8){pTime = Aug[dd-1];}
//if (bb==9){pTime = Sep[dd-1];} // Untuk bulan September 2016
//if (bb==10){pTime = Okt[dd-1];} // Untuk bulan Oktober 2016
//data jadwal sholat diambil dari www.jadwalsholat.org

//Menampilkan Jadwal Sholat
tft.setTextColor (rainbow(120-(ss*2)),BLACK);
tft.setTextSize (2);
tft.setCursor (145,140);
tft.print (F("Shubuh = ")); tft.print(pTime.substring(0,5));    tft.setCursor (145,158);
tft.print (F("Dzuhur = ")); tft.print(pTime.substring(18,23));  tft.setCursor (145,176); 
tft.print (F("Ashar  = ")); tft.print(pTime.substring(24,29));  tft.setCursor (145,194);
tft.print (F("Magrib = ")); tft.print(pTime.substring(30,35));  tft.setCursor (145,212);
tft.print (F("Isya'  = ")); tft.print(pTime.substring(36,41));
}  
///////////////////////////////////////////////
// Coding ini dibuat Oleh Dani Rajacell ///////
// Untuk www.belajarduino.com /////////////////
// Support by www.tokopedia.com/rajacell //////
// Copyright 27/8/2016 Rev.0.1 ////////////////
///////////////////////////////////////////////

//Membuat Rainbow TFT SetColor untuk mengganti ganti warna jam
unsigned int rainbow(byte value)
{
  byte red = 0; 
  byte green = 0;
  byte blue = 0;
  byte quadrant = value / 32;

  if (quadrant == 0) {
    blue = 31;
    green = 2 * (value % 32);
    red = 0;
  }
  if (quadrant == 1) {
    blue = 31 - (value % 32);
    green = 63;
    red = 0;
  }
  if (quadrant == 2) {
    blue = 0;
    green = 63;
    red = value % 32;
  }
  if (quadrant == 3) {
    blue = 0;
    green = 63 - 2 * (value % 32);
    red = 31;
  }
  return (red << 11) + (green << 5) + blue;
}
///////////////////////////////////////////////
// Coding ini dibuat Oleh Dani Rajacell ///////
// Untuk www.belajarduino.com /////////////////
// Support by www.tokopedia.com/rajacell //////
// Copyright 27/8/2016 Rev.0.1 ////////////////
///////////////////////////////////////////////

//Jam analog
void analogClock () {
  boolean initial = 1;
  uint16_t xpos = 65; // x posisi jam

    sdeg = ss * 6;
    mdeg = mm * 6 + sdeg * 0.01666667;
    hdeg = hh * 30 + mdeg * 0.0833333; 
    hx = cos((hdeg - 90) * 0.0174532925);
    hy = sin((hdeg - 90) * 0.0174532925);
    mx = cos((mdeg - 90) * 0.0174532925);
    my = sin((mdeg - 90) * 0.0174532925);
    sx = cos((sdeg - 90) * 0.0174532925);
    sy = sin((sdeg - 90) * 0.0174532925);

    if (ss == 0 || initial) {
      initial = 0;
      // Erase hour and minute hand positions every minute
      tft.drawLine(ohx, ohy, xpos,  171, BLACK);
      ohx = hx * 62 + xpos + 1;
      ohy = hy * 62 +  171;
      tft.drawLine(omx, omy, xpos,  171, BLACK);
      omx = mx * 84 + xpos;
      omy = my * 84 +  171;
    }

    // Redraw new hand positions, hour and minute hands not erased here to avoid flicker
    tft.drawLine(osx, osy, xpos,  171, BLACK);
    osx = sx * 90 + xpos + 1;
    osy = sy * 90 +  171;
    tft.drawLine(osx, osy, xpos,  171, RED);
    tft.drawLine(ohx, ohy, xpos,  171, CYAN);
    tft.drawLine(omx, omy, xpos,  171, WHITE);
    tft.drawLine(osx, osy, xpos,  171, RED);
    tft.fillCircle(xpos,  171, 3, RED);
    tft.drawRoundRect(xpos-50,  121, 100, 100, 10, WHITE);
}

Untuk .ino file dan sample library jadwal sholat silahkan download disini.
Coding ini tidak akan bekerja tanpa library jadwal sholat (.h file) yang disimpan bersama ino filenya.


Video Review :

Membuat Library Jadwal Sholat dari data www.jadwalsholat.org

1.Buka situs www.jadwalsholat.org
2.Pilih nama kota anda (atau kota terdekat bila tidak ada)
3.Pilih Bulan dan tahun dari data yang akan diambil
4.Blok data dari angka 01 (pada tanggal) hingga jam terakhir (jam isya tanggal terakhir)

5.Buka Arduino IDE dan New File, hapus semua text
6. ketik  char* Aug[] = { 
    kemudian paste data dari jadwalsholat yang sudah di copy tadi
 Hilangkan/hapus nomor tanggal (group kolom pertama) dan data Imsyak (group kolom kedua) seperti yang saya kotakin diatas.sehingga nampak seperti dibawah ini :

 Apit sediap baris data dengan tanda (") agar setiap baris data menjadi sebuah String kemudian
 tambahkan tanda koma (,) didepan setiap baris data mulai data baris kedua (data baris pertama jangan dikasih koma) sebagai pemisah data string tanggal pertama dengan taggal berikutnya.
Terakhir tambahkan tanda (;) setelah } sebagai tanda akhir perintah (jadi };).
Perhatikan gambar dibawah :


Kemudian Save as Sketch code tersebut menjadi sebuah H file.
Klik File -> Save as -> Nama File.h



  Simpan h file ini 1 folder dengan .ino file program ini dan pastikan nama file yang anda masukan pada sketch Jam Digital sama dengan nama file library (.h file) yang anda buat.

  Semoga Sukses Percobaanya

Apabila ada pertanyaan silahkan hubungi saya 

21 komentar:

  1. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  2. mantaaaaap gan makasih gan... kalo hanya untuk jam ama thermo contol gan gimana gan..?

    BalasHapus
  3. Om bikin speedo pake lcd tft...
    Nanti ane belanja lg ma si om nya lg hehehe

    BalasHapus
  4. selamat pagi gan..mau tanya untuk library jadwal sholat, ada cara kah biar bisa sedikit variabel globalnyanya,,
    di isi jadwal pada semua bulan sram bisa mencapai 13 kb,,,

    BalasHapus
  5. boleh minta library untuk daerah Kota Surakarta

    BalasHapus
  6. gan itu bakai lcd yang berapa kali berapa

    BalasHapus
  7. gan punya simulasinya di proteus dan untuk library proteus tambahan. klo boleh minta tolong kirim ke e-mail saya
    bagussusilo646@gmail.com

    BalasHapus
  8. mas dani kalau di tambahi dipflayer suara adzan bisa orak mas? pengen buat mas

    BalasHapus
  9. min kalo coba diproteus search komponen ds3231 apa min? saya cari library nya susah min. makasih min

    BalasHapus
  10. saat di verivikasi file.h memiliki kesalhan

    BalasHapus
  11. min..kalau tulisanya kebalik gimana ya?jadi yang harusnya misal ngadep ke depan ini ngadepnya kebelakang

    BalasHapus
  12. Gan untuk board arduino mega...apakah source kodenya sama

    BalasHapus
  13. MAshaAllah I want to do the same application. But I am using TFT LCD TActile 2.8 instead of 2.4 is it possible to help me

    BalasHapus
  14. Ada yang menggunakan seven segmen gak mas?

    BalasHapus
  15. bisakah jam ini library untuk waktu sholatnya dibuat abadai dengan memasukkan rumus penghitungan hisab? mohon pencerahan

    BalasHapus
  16. Hi
    Very good project.
    How I can get contact with you?
    I need your support.

    BalasHapus
  17. gan mau tanya, saya pake arduino auto adzan saya matikan lampu , pada saat saya buat cooding di skecth kok begitu tampilan di serial monitor, jam dan trigger waktunya tidak bisa tampil sedangkan time RTC dan triggernya ada. mohon pencerahan

    BalasHapus
  18. Om Dani, projeknya bagus sekali, saya sudah coba tapi layar tft kaya semut ( kaya televisi ga dapet antena), Saat RTC module belum dikonek gambar semutnya diam, saat RTC dikonek tetap semut tapi bergerak. Mohon pencerahannya, terima kasih sebelumnya

    BalasHapus
  19. Sudah saya temukan solusinya, ternyata setelah pakai library mcufriend_kbv tampilan sudah bisa sesuai. terima kasih

    BalasHapus
  20. Beautiful watch!
    I would like to use it with the tft ili9341 SPI Breakout display and need to know how to connect the pins, which are different;
    And what should be changed in the sketch; Help, Thanks

    BalasHapus

Copyright © 2014 Belajar Arduino | Designed With By Blogger Templates | Distributed By Gooyaabi Templates
Scroll To Top