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

Author : Ila MulyandiNo comments


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


Posted On : Wednesday, February 1, 2017Time : 6:01 AM
SHARE TO :
| | Template Created By : Rajendroid | CopyRigt By : ARDUINO | |