Rancangan displai jadwal waktu sholat / JWS menggunakan arduino ini memanfaatkan I2C EEPROM 24C32 sebagai penyimpan data tampilan Infomasi text yang mampu menampung 4096 karakter. Chip 24C32 umumnya disertakan pada modul RTC DS1307 / DS3231 dengan jalur komunikasi yang sama dan alamat yang berbeda. Karena komunikasi I2C dikategorikan lambat, maka akses pembacaan memori ini diminimalisir dengan metode read on demand.
Display Jadwal Sholat Arduino
Perancangan JWS menggunakan Arduino atau JWS dengan kontroller running text harus mampu menangani hal-hal berikut :
- Waktu sholat berdasarkan perjalanan matahari yang berubah-ubah sepanjang tahun, sehingga dibutuhkan perhitungan khusus untuk menentukan posisi matahari secara matematis. Formula yang digunakan berasal dari islamicity, dengan penambahan variabel sudut-sudut matahari.
- Pengaturan yang komplek namun fleksibel mengharuskan JWS didesain mampu menyesuaikan tugasnya dengan beberapa parameter yang bisa di monitor atau diganti berkala. Seperti adanya kegiatan-kegiatan khusus sehingga JWS bisa beralih fungsi.
Kapasitas memory flash arduino uno (ATMega328) yang 32Kb masih menyisakan ruang untuk 3 set font diamping 1 font angka. Font-font ini berfungsi memberikan efek tulisan sehingga memungkinkan adanya penekanan informasi.
Efek JWS Arduino
Efek-efek tampilan diperlukan supaya kehadiran JWS lebih menghiasi dinding, bukan hanya sebagai papan informasi. efek yang di tambahkan :
- Wipe in – wipe out
- Marque
- Lukis gambar
JWS Bluetooth
Fasilitas pengaturan JWS dengan bluetooth:
- 10 teks informasi yang disimpan dalam memory 24C32 yang mampu menyimpan 4096 karakter.
- Font informasi bisa diatur terpisah (System Font 5×7,Arial 14,Arial Black 16) pada uno, dan bisa ditambahkan pada board yang memiliki memori lebih besar.
- Waktu padam dan nyala.
- Perhitungan waktu sholat dengan metode sudut matahari.
- Tampilan tanggal hijriah (bisa diatur dan dinonaktifkan).
- Efek wipe untuk tampilan waktu-waktu sholat.
- Efek tulisan gambar.
- Pengaturan bluetooth meliputi kecerahan DMD panel, kecepatan scroll.
- Token aplikasi apk, untuk mengantisipasi apabila ada komunikasi bluetooth yang tidak diinginkan yang mungkin akan merubah setting.
- Konfirmasi data setting diterima dan waktu padam/nyala ke apk android.
- Data yang diketik di apk disimpan dalam database android, jadi saat aplikasi ditutup data yang diketik tetap akan tampil saat aplikasi dibuka kembali.
Komponen yang digunakan dalam JWS Arduino bluetooth:
- Arduino Uno (Gunakan Arduino mega untuk memory yang lebih besar).
- RTC DS3231 (termasuk 24C32) kompatibel DS1307 (beda address)
- Bluetooth HC-05
- Panel P10 (2 panel)
Jika ingin upload sketch dari arduino ide, lepaskan dahulu pin ‘0’ / pin RX jika menggunakan bluetooth hardware serial.
Skema arduino JWS bluetooth:
Video bluetooth arduino JWS:
JWS Android
Screenshoot JWS Android bluetooth:
JWS bluetooth android ini menggunakan hardware SPI sebagai pengirim data ke running text, meskipun mengorbankan pin 12 (MISO) yang tidak bisa digunakan karena dikontrol oleh SPI.
Pengaturan JWS dengan arduino yang dibutuhkan :
- #define modeDemo pada baris atas digunakan jika ingin menjalankan JWS demo, hapus baris ini jika JWS digunakan normal.
- Pin Kontrol DMD hardware SPI : pinOE harus dipasangkan pada pin PWM sebagai pengatur kecerahan. Sedangkan pinA, pinB, dan pinSCK bisa ditempatkan dimana saja.
- Jumlah panel.
- Perancangan ini dibuat dengan DS3231, jika menggunakan DS1307 harap diganti bagian alamat I2C-nya.
- Pin SQW (DS3231) diset sebagai penghasil pulsa dengan frekuensi 1 HZ sebagai interupsi bagi JWS bahwa detik telah berubah. dalam perancangan JWS arduino ini dihubungkan ke pin A3 namun bisa dipindahkan kemana saja.
- Jenis font bisa disesuaikan dengan kebutuhan, (#include-kan juga library font-nya). dengan merubah variabel berikut:
#define fontWaktu angka6x13
#define fontInformasi SystemFont5x7Ramping
#define fontTanggal SystemFont5x7Ramping
#define fontNamaSholat SystemFont5x7Ramping
#define fontWaktuSholat SystemFont5x7Ramping
#define fontWaktuMasuk SystemFont5x7Ramping
#define fontAdzan SystemFont5x7Ramping
#define fontIqomah SystemFont5x7Ramping
#define fontMatikanHP Arial14
- JWS ini dilengkapi sistem token, untuk RTC dan komunikasi bluetooth, apabila token yang digunakan cocok maka perintah untuk RTC dan bluetooth (setting variabel) akan dijalankan.
Sketch/koding header dan setup android bluetooth JWS:
#define modeDemo 0 //<<==================================== DEMO prinsip kerja 0 / 1
#define selisihImsak 10
//defenisi pin
#define pinA 6
#define pinB 7
#define pinOE 9
#define pinSCK 8
#define alarm 5
#define RTCDetikIRQ A3
//variabel Setting
#define jumlahKolomPanel 2 //panel
#define jumlahBarisPanel 1 //panel
#define lamaTampilWaktuSholat 10 // * 100 milidetik
#define lamaTampilInformasiJam 100 // * 100 milidetik
#define fontWaktu angka6x13
#define fontInformasi SystemFont5x7Ramping
#define fontTanggal SystemFont5x7Ramping
#define fontJadwalSholat SystemFont5x7Ramping
#define fontWaktuSholat SystemFont5x7Ramping
#define fontWaktuMasuk SystemFont5x7Ramping
#define fontAdzan SystemFont5x7Ramping
#define fontIqomah SystemFont5x7Ramping
#define fontMatikanHP Arial14
#define RTC_ADDRESS 0x68
#define I2CEEPROM_ADDRESS 0x57 //Perhatikan alamat I2CEEPROM 0x50(ds1307 .. 0x57(ds3231)
#define RTC_CONTROL_REG 0x0E //0x07 ds1307, 0x0E ds3231
#include <Wire.h>
#include <SPI.h>
#include <avr/sleep.h>
#include <avr/pgmspace.h>
#include <EEPROM.h>
#include <SoftwareSerial.h>
#include <DMD2.h>
#include "fungsi.h"
#include "definisi.h"
#include "konstanta.h"
#include "rtc.h"
#include "prayer.h"
#include "i2cUmum.h"
#include "trigonometri.h"
#include <fonts/SystemFont5x7Ramping.h>
#include <fonts/Arial14.h>
#include <fonts/Arial_Black_16.h>
#include <fonts/angka6x13.h>
#include <fonts/AllahMuhammad.h>
const uint16_t alamatFont[] = {&SystemFont5x7Ramping, &Arial14, &Arial_Black_16};
struct Setting
{
int8_t koreksiHijriah;
int8_t jumlahAlarm;
int8_t lamaAdzan;
int8_t lamaIqomah[5];
int8_t ulangMatikanHP;
int8_t lamaSholat[5];
int8_t lamaSholatJumat;
int8_t kecepatanJalanInfoText;
int8_t kecerahanJWS;
int8_t padamJam;
int8_t padamMenit;
int8_t nyalaJam;
int8_t nyalaMenit;
int8_t tampilanHijriah;
int8_t tampilanImsak;
int8_t tampilanTerbit;
int8_t tampilanDhuha;
int8_t tampilanTerbenam;
int8_t JumlahInfoTextAktif;
};
#if modeDemo
Setting setting = {0, 5, 1, {5, 5, 5, 5, 5}, 1, {5, 5, 5, 5, 5}, 2, 50, 20, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1};
char namaMesjid[panjangString] = "Musholla ...\0 ";
#else
Setting setting;
char namaMesjid[panjangString];
#endif
//variabel
const char strWaktu[] PROGMEM = "Waktu";
const char strSholat[] PROGMEM = "Sholat";
char strWaktuInformasi[9];
JamDanMenit waktuSholat[9];
EfekMarqueHorizontalkeKiri marqueKiri;
EfekTulis efekTulis;
uint8_t efekScrollOutDanWipeIn;
uint8_t marqueOut;
bool marqueTampilan;
uint8_t wipeInTampilan;
uint8_t wipeOutTampilan;
uint8_t efekTulisTampilan;
uint8_t indexNamaSholat;
uint16_t hitungMundurSholat;
uint16_t hitungMundurPesanSebelumSholat;
uint16_t hitungMundurIqomah;
uint16_t hitungMundurAdzan;
uint8_t hitungMundurAlarm;
uint16_t hitungMudurAlarmIqomah;
byte modeOperasi;
byte modeOperasiSebelumnya;
uint8_t menitSebelumnya = 60;
uint8_t hariSebelumnya = 32;
bool statusAlarm;
bool tampilkanMenit;
bool infoWaktu;
byte infoWaktuTop;
uint16_t lamaTampil = 0;
uint16_t indekTampilan;
char textWaktuJam[6];
char textTanggalHijriah[sizeof(strNamaHari[0]) + 2 + 3 + sizeof(strNamaBulanHijriah[0]) + 3 - 2];
uint8_t bluetoothData[32];
uint16_t indexParseSerial = 0;
byte indexInformasi = 1;
long mulaiMillis;
uint16_t AlamatI2CEEPROM;
int8_t indexSetting = 0;
byte indexSettingInfo;
bool tokenValid = false;
bool RTCValid = true;
byte tanggalHijriah;
byte bulanHijriah;
uint16_t tahunHijriah;
uint16_t AlamatI2CEEPROMSebelumnya;
bool nextEEPROMData = false;
byte EEPROMDataCounter;
bool modeSambungSebelumnya = false;
tanggalDanWaktu now;
tanggalDanWaktu settingWaktu;
byte settingWaktuIndex;
//Class variabel
#define l jumlahKolomPanel * 32
#define t jumlahBarisPanel * 16
SPIDMD dmd(jumlahKolomPanel, jumlahBarisPanel, pinOE, pinA, pinB, pinSCK);
DMDFrame dmdEfek(l, t);
DMD_TextBox boxKolom1(dmd, 0, 0, l / 2, t);
DMD_TextBox boxKolom2(dmd, l / 2, 0, l / 2, t);
DMD_TextBox boxBaris1(dmd, 0, 0, l, (t / 2) - 1);
DMD_TextBox boxBaris2(dmd, 0, t / 2, l, t / 2);
DMD_TextBox boxKolom2Baris1(dmd, l / 2, 0, l / 2, t / 2);
DMD_TextBox boxKolom2Baris2(dmd, l / 2, t / 2, l / 2, t / 2);
//Eeprom24C32_64 I2CEEPROM(EEPROM_ADDRESS);
HardwareSerial *bluetooth;
#define tokenRTC 0xA9
#define tokenBluetooth 0x4C
#define tokenSetInformasi "225654"
#define tokenSetSetting "963215"
void setup() {
Serial.begin(9600);
Serial.println("JWS Bluetooth");
Serial.println("https://www.project.semesin.com/");
Serial.println();
bluetooth = &Serial;
pinMode(alarm, OUTPUT);
pinMode(RTCDetikIRQ, INPUT_PULLUP);
//Interupsi setiap 1 detik
Wire.begin();
Wire.beginTransmission(RTC_ADDRESS);
Wire.write(RTC_CONTROL_REG);
Wire.write(0x00);//SQW freq, 1Hz
Wire.endTransmission();
#if modeDemo
prayerData = { -1576, 27343, 1792, 5120, 213, -1152, 1024, 4608, 0, 0, 0,0,0};
settingWaktu = {50, 29, 4, 5, 7, 5, 2018};
simpanRTC(RTC_ADDRESS, settingWaktu);
#endif
if (EEPROM.read(alamatTokenRTC) != tokenRTC)
{
//Waktu compiler
char Month[12];
int Day, Year;
uint8_t monthIndex;
int Hour, Min, Sec;
char *monthName[12] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
sscanf(__TIME__, "%d:%d:%d", &Hour, &Min, &Sec);
sscanf(__DATE__, "%s %d %d", Month, &Day, &Year);
for (monthIndex = 0; monthIndex < 12; monthIndex++) {
if (strcmp(Month, monthName[monthIndex]) == 0) break;
}
uint8_t wday = hariDariTanggal(Day, monthIndex + 1, Year);
settingWaktu = {Sec, Min, Hour, wday, Day, monthIndex + 1, Year};
simpanRTC(RTC_ADDRESS, settingWaktu);
EEPROM.write(alamatTokenRTC, tokenRTC);
}
#if !modeDemo
if (EEPROM.read(alamatTokenBluetooth) == tokenBluetooth)
{
ambilSetting();
}
#endif
ambilHijriah();
dmd.begin();
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_enable();
mulaiMillis = millis();
modeOperasi = tampilWaktuSholat;
while (!digitalRead(RTCDetikIRQ));
}
File-file yang digunakan dalam JWS android :
- definisi.h
- fungsi.h
- i2cUmum.h
- JWS_Semesin.ino
- konstanta.h
- prayer.h
- rtc.h
- trigonometri.h
- JWS_Bluetooth.apk
- file lengkap (.zip)
Rekomendasi Perakitan JWS Bluetooth Android:
- unzip JWS Bluetooth + apk – Semesin.zip (adalah folder sketch arduino beserta file pendukung dalam satu folder)
- copy isi folder libraries ke Document/Arduino/libraries/
- Buka JWS_Semesin.ino dengan arduino IDE (pengujian dengan versi 1.8.5)
- Lepas tx Bluetooth
- Upload ke arduino
- Hubungkan tx Bluetooth
- Buka app JWS Bluetooth klik setting dan kirim pengaturan
- Selesai.
antisipasi masalah:
- Data EEPROM sebelumnya mungkin berpengaruh pada settingan, set dengan apk via bluetooth atau hapus dahulu dengan examples->EEPROM->eeprom_clear.
- #define modeDemo 1 untuk test / 0 untuk running
- Pastikan daya mencukupi (kalo tidak punya 5V > 5A hubungkan saja GND DMD ke GND Arduino tapi tidak Vcc +5V-nya)
nb: V1.0 -> Versi2.0
- Karakter informasi yang akan ditampilkan langsung diambil dari I2CEEPROM
- Penambahan pengaturan sudut-sudut waktu sholat.
- Penambahan efek grafis
catatan:
- koordinat dalam mode derajat-menit –±dd° mm’–(menit = pecahan derajat*60/100)
contohnya :
lintang -6.78 -> -6-46′
bujur 110.38 -> 110-22′
- jika koordinat sudah sesuai, namun masih ada perbedaan waktu dengan jadwal yang diinginkan (mis: jadwal depag), maka geser bujur (ditambah/dikurang)
- Jika sebagian jadwal shalat tidak akurat, maka geser derajat masing-masing jadwal shalat yang belum akurat
- JWS ini belum menggunakan ikhtiyath, untuk mengantisipasinya bisa dengan menggeser derajat-menit bujur ±2 menit)
Hasil percobaan
by: Priadi Amfi
Hasil percobaan
by: Catur cahya
Hasil percobaan
by: Ochoy Thea