07 August 2019

Cycloconverter sederhana menggunakan Arduino dan modul dimmer

Jadi kemarin saya punya kerjaan, ingin mengendalikan (kontrol) kecepatan motor AC induksi 1 phase. tujuannya supaya mesin bisa berputar pelan misalnya setengah atau seperempat kecepatan namun tetap ada powernya.
Awalnya saya mencoba menggunakan modul AC dimmer yang biasa untuk lampu yang katanya juga bisa dipakai untuk motor AC.
Modul module Dimmer SCR 2000w 2000 watt Motor Speed Controller voltage
tapi setelah dsicoba ternyata ketika dipelankan ternyata powernya hilang kemudian berhenti, jadi malah susah untuk dikendalikan.
kemudian saya mencari referensi untuk mengendalikan motor AC ternyata ada 2 metode yang saya temukan

1. menggunakan VFD, tapi harganya mahal sekali dan susah mencari VFD yang 1 phase
2. menggunakan Cycloconverter, manum tidak ditemukan penjualnya dimanapun, cuma nemu 1 sumber yang menjual training Kit, mungkin Cycloconverter masih teknologi baru atau mungkin teknologinya kurang bagus di industri.

Akhirnya saya menemukan ide untuk membuat Cycloconverter dengan Arduino dan modul dimmer yang biasa dipakai di arduino.





AC LIGHT DIMMER 220V PWM MODULE MAX 5A ZERO CROSSING DETECTOR ARDUINO
prinsip kerjanya sama persis seperti Cyclo converter, tapi dengan modul dimmer ini kita tidak dapat membalik phase, hanya dapat memotong phase yang tidak kita gunakan, sehingga didapatkan Cycloconverter dengan tenaga separuhnya saja.

memang hasilnya tidak bisa sempurna, tetapi hasilnya lumayan, motor tetap ada tenaganya ketika diseting kecepatan rendah.
cara kerjanya:
1. jika setting full speed kita tidak perlu melakukan pengontrolan
2. jika setting setengah kecepatan, di phase pertama, kita hanya aktifkan tegangan positif, tegangan negatif dimatikan. di phase kedua kita aktifkan tegangan yang negatif saja, tegangan positif dimatikan. begitu diulang seterusnya. sehingga kita menciptakan output frekuensi listrik 25 Hz
3. untuk frekuensi yang lebih rendah, seperempat atau seper delapan gunakan logika yang sama, tapi pembagi fasenya dibuat lebih lebar.

semoga membantu untuk yang sedang penelitian pengontrolan motor AC. untuk kode tidak dapat saya berikan di sini, silakan kontak langsung untuk kerja sama.

11 April 2018

Membuat jadwal sholat menggunakan panel P10 DMD dan RTC DS1302

kita semua tahu bahwa RTC DS1302 merupakan RTC dengan harga termurah. namun ternyata tidak banyak yang menggunakan. Disini akan saya berikan contoh sketch arduino untuk membuat jadwal sholat menggunakan panel running text satu buah. nanti hasilnya akan seperti video ini.



library yang kita butuhkan(untuk didownload)
1. library DMD
2. library RTC DS1302
3. library PrayerTimes

pin arduino yang dipakai :

  • RTC  --> A5,A4,A3 (CE,IO,SCLK) CE= reset , IO=data
  • tombol SETTING --> 2
  • tombol UP --> 3
  • tombol DOWN --> 4
  • alarm --> 5
  • pin tombol bisa langsung ke arah ground, tidak perlu pakai pull up, 

Skettchnya: (download disini, sudah termasuk library). link diupdate 2 agustus 2018
DS1302 bisa beli disini https://tokopedia.link/mTYCxNdh1L
jam sholat yang sudah jadi bisa beli disini : https://store.yufid.com/jual/jam-pengingat-waktu-sholat/

//perubahan: rutin adzan dan iqomah menjadi satu fungsi saja dengan input integer dari waktu sholat
// fix tahun kabisat untuk 100 dan 400 tahun
// tambahan seting jam kedip kedip
#include <EEPROM.h>
#include <EepromUtil.h>
#include <DMD.h>
#include <TimerOne.h>
#include "DS1302.h" // library RTC
//#include <Time.h>
#include "PrayerTimes.h"
double times[sizeof(TimeName) / sizeof(char*)];
DS1302 rtc(A5, A4, A3); // (CE,IO,SCLK)  pin terhubung ke RTC CE=reset IO=data
Time t;               // library RTC
#include <SystemFont5x7.h>
#include <angka6x13.h>
#include <font4x7.h>
#include <SPI.h>
char separator[] = {':', ' '};
const char *waktusholat[] = {"SUBUH", "DZUHUR", "'ASHAR", "MAGHRIB", "ISYA'"} ;
const char *szona[] = { "", "", "", "", "", "", "", "WIB ", "WITA", "WIT ",};
char *hari[] = {"SENIN", "SELASA", "RABU" , "KAMIS", "JUM'AT", "SABTU", "AHAD" };
int maxday[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
double lintang;
double bujur;
int zonawaktu;
int jedaiqomah;
unsigned long previousMillis = 0;
unsigned long currentMillis;
const int interval = 1000;

#define SETTING 2
#define UP 3
#define DOWN 4
#define ALARM 5

int mode = 0;
byte tjam;
byte tmenit;
byte tdetik;
byte ttanggal;
byte tbulan;
int ttahun;
int tdow;
int pos;
int subuhH;
int subuhM;
int terbitH;
int terbitM;
int dzuhurH;
int dzuhurM;
int asarH;
int asarM;
int magribH;
int magribM;
int isyaH;
int isyaM;
int imsakH;
int imsakM;
char textbuffer[10];
DMD dmd(1, 1); //untuk mengatur jumlah panel yang kamu pakai

void ScanDMD()
{
  dmd.scanDisplayBySPI();
}
//////////////////////SEEEEEEETTTTTTTUUUUUUUUP//////////////////////////////////////////////////////////////
void setup() {
  // put your setup code here, to run once:
  pinMode(SETTING, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(DOWN, INPUT_PULLUP);
  pinMode(ALARM, OUTPUT);
  digitalWrite(ALARM, LOW); // alarm of dulu kan
  delay(100);
  digitalWrite(ALARM, HIGH); // alarm of dulu kan
  delay(1000);
  digitalWrite(ALARM, LOW); // alarm of dulu kan
  rtc.halt(false);
  rtc.writeProtect(false);
  // Setup Serial connection
  Serial.begin(9600);

  //setting JAM
  //  rtc.setDate(28, 9, 2017);
  // rtc.setTime(11, 35, 30);
  //  rtc.setDOW(4);

  //READ EEPROM DATA

  zonawaktu = EEPROM.read(1);
  jedaiqomah = EEPROM.read(2);
  //EepromUtil::eeprom_write_string(5,"-7.78");
  //EepromUtil::eeprom_write_string(15,"110.36");
  EepromUtil::eeprom_read_string(5, textbuffer, 10);
  lintang = atof(textbuffer);
  EepromUtil::eeprom_read_string(15, textbuffer, 10);
  bujur = atof(textbuffer);
  Serial.print("lintang = ");
  Serial.println(lintang);
  Serial.print("bujur = ");
  Serial.println(bujur);
  // fire UP DMD
  Timer1.initialize( 3000 );
  Timer1.attachInterrupt( ScanDMD );
  dmd.clearScreen( true );
  dmd.setBrightness(255);
  //attachInterrupt(digitalPinToInterrupt(SETTING), interruptpress, FALLING);
}
////// LOOOOOOOOP ///////////////////////////////////////////////////////////////////////
void loop() {
  // put your main code here, to run repeatedly:
  
  int t1 = digitalRead(SETTING);  //tombol setting
  int t2 = digitalRead(UP);  // tombol Up
  int t3 = digitalRead(DOWN);  // tombol down

  if (t1 == LOW) {
    mode = mode + 1;
    Serial.print("mode = ");
    Serial.println(mode);
    dmd.clearScreen(true);
    delay(250);
    if (mode > 9) {
      mode = 0;
      dmd.clearScreen(true);
    }
  }

  getjadwal();
  if (mode == 1) {
    //setting jam
    //    dmd.clearScreen(true);
    dmd.selectFont(font4x7);
    dmd.drawString(8, 0, "JAM", 3 , GRAPHICS_NORMAL);
    int jam = tjam;
    int menit = tmenit;
    if (t2 == LOW) {
      jam = jam + 1;
      delay(100);
      if (jam > 23 ) {
        jam = 0;
      }
    }
    if (t3 == LOW) {
      jam = jam - 1;
      delay(100);
      if (jam < 0 ) {
        jam = 23;
      }
    }
    String xjam = Konversi(jam);
    int pjg = xjam.length() + 1;
    char sjam[pjg];
    xjam.toCharArray(sjam, pjg);
    String xmenit = Konversi(menit);
    char smenit[pjg];
    xmenit.toCharArray(smenit, pjg);
    dmd.selectFont(SystemFont5x7);
    //dmd.drawString(0, 8, sjam, pjg, GRAPHICS_NORMAL);
    //dmd.drawChar(12, 8, separator[currentMillis / 1000 % 2],  GRAPHICS_NORMAL);
    dmd.drawChar(12, 8, ':',  GRAPHICS_NORMAL);
    dmd.drawString(18, 8, smenit, pjg, GRAPHICS_NORMAL);
    if (separator[currentMillis / 250 % 2] == ' '){
      dmd.drawString(0, 8, sjam, pjg, GRAPHICS_NORMAL);
    }
    else dmd.drawString(0, 8, "  ", pjg, GRAPHICS_NORMAL);
    rtc.setTime(jam, tmenit, tdetik);
  }
  if (mode == 2) {
    //setting menit
    //    dmd.clearScreen(true);
    dmd.selectFont(font4x7);
    dmd.drawString(5, 0, "MENIT", 5 , GRAPHICS_NORMAL);
    int jam = tjam;
    int menit = tmenit;
    if (t2 == LOW) {
      menit = menit + 1;
      delay(100);
      if (menit > 59 ) {
        menit = 0;
      }
    }
    if (t3 == LOW) {
      menit = menit - 1;
      delay(100);
      if (menit < 0 ) {
        menit = 59;
      }
    }
    String xjam = Konversi(jam);
    int pjg = xjam.length() + 1;
    char sjam[pjg];
    xjam.toCharArray(sjam, pjg);
    String xmenit = Konversi(menit);
    //int pjg = xmenit.length() + 1;
    char smenit[pjg];
    xmenit.toCharArray(smenit, pjg);
    dmd.selectFont(SystemFont5x7);
    dmd.drawString(0, 8, sjam, pjg, GRAPHICS_NORMAL);
    //dmd.drawChar(12, 8, separator[currentMillis / 1000 % 2],  GRAPHICS_NORMAL);
    dmd.drawChar(12, 8, ':',  GRAPHICS_NORMAL);
    //dmd.drawString(18, 8, smenit, pjg, GRAPHICS_NORMAL);
    if (separator[currentMillis / 250 % 2] == ' '){
      dmd.drawString(18, 8, smenit, pjg, GRAPHICS_NORMAL);
    }
    else dmd.drawString(18, 8, "  ", pjg, GRAPHICS_NORMAL);
    rtc.setTime(tjam, menit, tdetik);
  }
  if (mode == 3) {
    //setting tahun
    //    dmd.clearScreen(true);
    dmd.selectFont(font4x7);
    dmd.drawString(3, 0, "TAHUN", 5 , GRAPHICS_NORMAL);
    int tahun = ttahun;
    int bulan = tbulan;
    if (bulan>12){
      bulan = 12;
    }
    int tanggal = ttanggal;
    if (tanggal > 31) {
      tanggal = 31;
    }
    if (t2 == LOW) {
      tahun = tahun + 1;
      delay(100);
      if (tahun > 2200 ) {
        tahun = 2200;
      }
    }
    if (t3 == LOW) {
      tahun = tahun - 1;
      delay(100);
      if (tahun < 2017 ) {
        tahun = 2017;
      }
    }
    String xtahun = Konversi(tahun);
    int pjg = xtahun.length() + 1;
    char stahun[pjg];
    xtahun.toCharArray(stahun, pjg);
    dmd.selectFont(SystemFont5x7);
    if (separator[currentMillis / 250 % 2] == ' '){
      dmd.drawString(0, 8, stahun, pjg, GRAPHICS_NORMAL);
    }
    else dmd.drawString(0, 8, "    ", pjg, GRAPHICS_NORMAL);
    rtc.setDate(tanggal, bulan, tahun);
  }
  if (mode == 4) {
    //setting bulan
    //    dmd.clearScreen(true);
    dmd.selectFont(font4x7);
    dmd.drawString(3, 0, "BULAN", 5 , GRAPHICS_NORMAL);
    int bulan = tbulan;
    int tanggal = ttanggal;
    if (t2 == LOW) {
      bulan = bulan + 1;
      delay(100);
      if (bulan > 12 ) {
        bulan = 1;
      }
    }
    if (t3 == LOW) {
      bulan = bulan - 1;
      delay(100);
      if (bulan < 1 ) {
        bulan = 12;
      }
    }
    String xbulan = Konversi(bulan);
    int pjg = xbulan.length() + 1;
    char sbulan[pjg];
    xbulan.toCharArray(sbulan, pjg);
    String xtanggal = Konversi(tanggal);
    char stanggal[pjg];
    xtanggal.toCharArray(stanggal, pjg);
    dmd.selectFont(SystemFont5x7);
    dmd.drawString(18, 8, stanggal, pjg, GRAPHICS_NORMAL);
    dmd.drawChar(12, 8, '/',  GRAPHICS_NORMAL);
    if (separator[currentMillis / 250 % 2] == ' '){
      dmd.drawString(0, 8, sbulan, pjg, GRAPHICS_NORMAL);
    }
    else dmd.drawString(0, 8, "  ", pjg, GRAPHICS_NORMAL);
    rtc.setDate(ttanggal, bulan, ttahun);
  }
  if (mode == 5) {
    //setting tanggal
    //    dmd.clearScreen(true);
    dmd.selectFont(font4x7);
    dmd.drawString(8, 0, "TGL", 3 , GRAPHICS_NORMAL);
    int bulan = tbulan;
    int tanggal = ttanggal;
    if (t2 == LOW) {
      tanggal = tanggal + 1;
      delay(100);
      if ((((ttahun % 4 == 0) && (ttahun % 100 != 0)) || (ttahun % 400 == 0)) && (tbulan ==2) ) {
        if (tanggal > maxday[tbulan] + 1 ) {
          tanggal = 1;
        }
      }
      else if (tanggal > maxday[tbulan] ) {
        tanggal = 1;
      }
    }
    if (t3 == LOW) {
      tanggal = tanggal - 1;
      delay(100);
      if (tanggal < 1 ) {
        if ((((ttahun % 4 == 0) && (ttahun % 100 != 0)) || (ttahun % 400 == 0)) && (tbulan ==2) ) {
          tanggal = maxday[tbulan] + 1;
        }
        else tanggal = maxday[tbulan];
      }
    }
    String xtanggal = Konversi(tanggal);
    int pjg = xtanggal.length() + 1;
    char stanggal[pjg];
    xtanggal.toCharArray(stanggal, pjg);
    String xbulan = Konversi(bulan);
    char sbulan[pjg];
    xbulan.toCharArray(sbulan, pjg);
    dmd.selectFont(SystemFont5x7);
    //dmd.drawString(0, 8, stanggal, pjg, GRAPHICS_NORMAL);
    dmd.drawString(0, 8, sbulan, pjg, GRAPHICS_NORMAL);
    dmd.drawChar(12, 8, '/',  GRAPHICS_NORMAL);
    if (separator[currentMillis / 250 % 2] == ' '){
      dmd.drawString(18, 8, stanggal, pjg, GRAPHICS_NORMAL);
    }
    else dmd.drawString(18, 8, "  ", pjg, GRAPHICS_NORMAL);
    rtc.setDate(tanggal, tbulan, ttahun);
    Serial.println(jumlahhari());
    Serial.println(((jumlahhari() - 4) % 7) + 1);
    rtc.setDOW(((jumlahhari() - 4) % 7) + 1);
  }
  if (mode == 6) {
    //setting jeda iqomah
    //    dmd.clearScreen(true);
    dmd.selectFont(font4x7);
    dmd.drawString(7, 0, "JEDA", 5 , GRAPHICS_NORMAL);
    int jeda = EEPROM.read(2);
    if (t2 == LOW) {
      jeda = jeda + 1;
      delay(100);
      if (jeda > 30 ) {
        jeda = 30;
      }
    }
    if (t3 == LOW) {
      jeda = jeda - 1;
      delay(100);
      if (jeda < 5 ) {
        jeda = 5;
      }
    }
    String xjeda = Konversi(jeda);
    int pjg = xjeda.length() + 1;
    char sjeda[pjg];
    xjeda.toCharArray(sjeda, pjg);
    dmd.selectFont(SystemFont5x7);
    if (separator[currentMillis / 250 % 2] == ' '){
      dmd.drawString(0, 8, sjeda, pjg, GRAPHICS_NORMAL);
    }
    else dmd.drawString(0, 8, "  ", pjg, GRAPHICS_NORMAL);
    dmd.drawString(14, 8, "mnt", pjg, GRAPHICS_NORMAL);
    jedaiqomah = jeda;
    EEPROM.write(2, jeda);
  }
  if (mode == 7) {
    //setting zona waktu
    //    dmd.clearScreen(true);
    dmd.selectFont(SystemFont5x7);
    dmd.drawString(1, 0, "ZONA:", 5 , GRAPHICS_NORMAL);
    //dmd.selectFont(font4x7);
    int zona = EEPROM.read(1);
    if (t2 == LOW) {
      zona = zona + 1;
      delay(100);
      if (zona > 9 ) {
        zona = 7;
      }
    }
    if (t3 == LOW) {
      zona = zona - 1;
      delay(100);
      if (zona < 7 ) {
        zona = 9;
      }
    }
    if (separator[currentMillis / 500 % 2] == ' '){
      dmd.drawString(1, 8, szona[zona], 4, GRAPHICS_NORMAL);
    }
    else dmd.drawString(1, 8, "    ", 4, GRAPHICS_NORMAL);
    zonawaktu = zona;
    EEPROM.write(1, zona);
  }
  if (mode == 8) {
    //setting LINTANG
    //    dmd.clearScreen(true);
    dmd.selectFont(font4x7);
    dmd.drawString(0, 0, "LINTANG", 7 , GRAPHICS_NORMAL);
    if (t2 == LOW) {
      lintang = lintang + 0.01;
      delay(5);
      if (lintang > 15 ) {
        lintang = 15;
      }
      if (lintang == 0  ) {  //pergantian minus biar tidak nyisa
        dmd.clearScreen( true );
      }
    }
    if (t3 == LOW) {
      lintang = lintang - 0.01;
      delay(5);
      if (lintang < -15 ) {
        lintang = -15;
      }
    }

    String xlintang = String(lintang);
    int pjg = xlintang.length() + 1;
    char slintang[pjg];
    xlintang.toCharArray(slintang, pjg);
    dmd.selectFont(font4x7);
    if (separator[currentMillis / 500 % 2] == ' '){
      dmd.drawString(0, 8, slintang, pjg, GRAPHICS_NORMAL);
    }
    else dmd.drawString(0, 8, "      ", pjg, GRAPHICS_NORMAL);
    EepromUtil::eeprom_write_string(5, slintang);
  }
  if (mode == 9) {
    //setting BUJUR
    //    dmd.clearScreen(true);
    dmd.selectFont(font4x7);
    dmd.drawString(1, 0, "BUJUR", 5 , GRAPHICS_NORMAL);
    if (t2 == LOW) {
      bujur = bujur + 0.01;
      delay(10);
      if (bujur > 145 ) {
        bujur = 145;
      }
    }
    if (t3 == LOW) {
      bujur = bujur - 0.01;
      delay(10);
      if (bujur < 90 ) {
        bujur = 90;
      }
    }
    String xbujur = String(bujur);
    int pjg = xbujur.length() + 1;
    char sbujur[pjg];
    xbujur.toCharArray(sbujur, pjg);
    dmd.selectFont(font4x7);
    if (separator[currentMillis / 500 % 2] == ' '){
      dmd.drawString(0, 8, sbujur, pjg, GRAPHICS_NORMAL);
    }
    else dmd.drawString(0, 8, "       ", pjg, GRAPHICS_NORMAL);
    EepromUtil::eeprom_write_string(15, sbujur);
  }

  if (mode == 0) {
    if (currentMillis - previousMillis < 15000) {
      normalMode();
    }
    else if (tjam == subuhH && tmenit == subuhM) {
      adzan(0);
    }
    else if (tdow == 5 && tjam == dzuhurH && tmenit == dzuhurM) {
      jumat();
    }
    else if (tjam == dzuhurH && tmenit == dzuhurM) {
      adzan(1);
    }
    else if (tjam == asarH && tmenit == asarM) {
      adzan(2);
    }
    else if (tjam == magribH && tmenit == magribM) {
      adzan(3);
    }
    else if (tjam == isyaH && tmenit == isyaM) {
      adzan(4);
    }
    else {
      runningtext();
    }
  }

}
///// END LOOOOOP///////////////////////////////////////////////////////////////////

unsigned long jumlahhari() {
  unsigned long d = ttanggal;
  unsigned long m = tbulan;
  unsigned long y = ttahun;
  unsigned long hb[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
  unsigned long ht = (y - 1970) * 365 - 1;
  unsigned long hs = hb[m - 1] + d;
  unsigned long kab = 0;
  unsigned long i;
  if (y % 4 == 0) {
    if (m > 2) {
      hs++;
    }
  }
  for (i = 1970; i < y; i++) {
    if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)) {
      kab++;
    }
  }
  return (ht + hs + kab);
}

/////////////////////untuk nambahi 0 di depan jika angka <10 //////////////////
String Konversi(int sInput) {
  if (sInput < 10)
  {
    return"0" + String(sInput);
  }
  else
  {
    return String(sInput);
  }
}

void normalMode() {

  dmd.selectFont(angka6x13);
  // Tampilan jam
  String xjam = Konversi(tjam);
  int pjg = xjam.length() + 1;
  char sjam[pjg];
  xjam.toCharArray(sjam, pjg);
  dmd.drawString(0, 0, sjam, pjg, GRAPHICS_NORMAL);

  //tampilan detikan
  dmd.selectFont(SystemFont5x7);
  dmd.drawChar(14, 5, separator[currentMillis / 500 % 2], GRAPHICS_NORMAL);

  // tampilan menit
  dmd.selectFont(angka6x13);
  String xmenit = Konversi(tmenit);
  int pjgmenit = xmenit.length() + 1;
  char smenit[pjgmenit];
  xmenit.toCharArray(smenit, pjgmenit);
  dmd.drawString(19, 0, smenit, pjgmenit, GRAPHICS_NORMAL);

  if (((ttahun % 100 == 0) && (ttahun % 400 != 0)) && (tbulan == 2) && (ttanggal == 29)){   //penyesuaian tahun kabisat 
    rtc.setDate(1, 3, ttahun);
  }
}

void runningtext() {
  //dmd.clearScreen(true);
  dmd.selectFont(SystemFont5x7);
  // Tampilan jam
  String xjam = Konversi(tjam);
  int pjg = xjam.length() + 1;
  char sjam[pjg];
  xjam.toCharArray(sjam, pjg);
  dmd.drawString(1, 0, sjam, pjg, GRAPHICS_NORMAL);

  //tampilan detikan
  dmd.drawChar(14, 0, separator[currentMillis / 500 % 2], GRAPHICS_NORMAL);

  // tampilan menit
  String xmenit = Konversi(tmenit);
  int pjgmenit = xmenit.length() + 1;
  char smenit[pjgmenit];
  xmenit.toCharArray(smenit, pjgmenit);
  dmd.drawString(20, 0, smenit, pjgmenit, GRAPHICS_NORMAL);
  dmd.selectFont(font4x7);
  String teks;
  teks =  String(hari[tdow - 1]) +
          " " + Konversi(ttanggal) + "-" + Konversi(tbulan) + "-" + String(ttahun) +
          " SUBUH " + Konversi(subuhH) + ":" + Konversi(subuhM) +
          " TERBIT " + Konversi(terbitH) + ":" + Konversi(terbitM) +
          " DZUHUR " + Konversi(dzuhurH) + ":" + Konversi(dzuhurM) +
          " 'ASHAR " + Konversi(asarH) + ":" + Konversi(asarM) +
          " MAGHRIB " + Konversi(magribH) + ":" + Konversi(magribM) +
          " ISYA' " + Konversi(isyaH) + ":" + Konversi(isyaM) +
          " IMSAK " + Konversi(imsakH) + ":" + Konversi(imsakM);
  int pjgteks = teks.length() + 1;
  char cteks[pjgteks];
  pos = pos - 1;
  delay(15);
  teks.toCharArray(cteks, pjgteks);
  dmd.drawString(15 + pos, 8, cteks, pjgteks, GRAPHICS_NORMAL);
  if (currentMillis - previousMillis > 49000) {
    currentMillis = millis();
    previousMillis = currentMillis;
    dmd.clearScreen(true);
    pos = 0;
  }
}

void getjadwal() {
  currentMillis = millis();
  t = rtc.getTime();
  ttanggal = t.date;
  tbulan  = t.mon;
  ttahun  = t.year;
  tjam    = t.hour;
  tmenit  = t.min;
  tdetik  = t.sec;
  tdow    = t.dow;
  set_calc_method(ISNA);
  set_asr_method(Shafii);
  set_high_lats_adjust_method(AngleBased);
  set_fajr_angle(20);
  set_isha_angle(18);
  get_prayer_times(ttahun, tbulan, ttanggal, lintang , bujur , zonawaktu, times); // jadwal sholat di masukkan ke variabel times
  get_float_time_parts(times[0] + 0.05, subuhH, subuhM);
  get_float_time_parts(times[1] , terbitH, terbitM);
  get_float_time_parts(times[2] + 0.05, dzuhurH, dzuhurM);
  get_float_time_parts(times[3] + 0.05, asarH, asarM);
  get_float_time_parts(times[4] + 0.05, magribH, magribM);
  get_float_time_parts(times[6] + 0.05, isyaH, isyaM);
  get_float_time_parts(times[0] - 0.117, imsakH, imsakM);
}

void persiapan(int number, String teks){
  
}

void adzan(int number) {
  dmd.clearScreen( true );
  dmd.selectFont(SystemFont5x7);
  dmd.drawString(2, 0, "ADZAN ", 5, 0); //koordinat tampilan
  dmd.selectFont(font4x7);
  dmd.drawString(0, 8, waktusholat[number], strlen(waktusholat[number]), 0); //koordinat tampilan
  digitalWrite(ALARM, HIGH);//alarm sholat
  delay(1000);
  digitalWrite(ALARM, LOW);//alarm sholat
  delay(1000);
  digitalWrite(ALARM, HIGH);//alarm sholat
  delay(1000);
  digitalWrite(ALARM, LOW);//alarm sholat
  delay(1000);
  digitalWrite(ALARM, HIGH);//alarm sholat
  delay(1000);
  digitalWrite(ALARM, LOW);//alarm sholat
  delay(1000);
  digitalWrite(ALARM, HIGH);//alarm sholat
  delay(1000);
  digitalWrite(ALARM, LOW);//alarm sholat
  delay(1000);
  delay(150000);                //waktu adzan 150000 = 2,5 menit

  // IQOMAH
  dmd.clearScreen( true );
  dmd.drawString(2, 0, "IQOMAH", 6, 0);
  int tampil;
  int detik = 60, menit = jedaiqomah - 1; // waktu jeda iqomah 9 menit 60 detik
  for (detik = 60; detik >= 0; detik--) {
    delay(1000);
    String iqomah = Konversi(menit) + ":" + Konversi(detik);
    int panjang_iqomah = iqomah.length() + 1;
    char waktu_iqomah[panjang_iqomah];
    iqomah.toCharArray(waktu_iqomah, panjang_iqomah);
    dmd.selectFont(SystemFont5x7);
    dmd.drawString(1, 9, waktu_iqomah, panjang_iqomah, 0);
    if (detik <= 0) {
      detik = 60;
      menit = menit - 1;
    }
    if (menit <= 0 && detik <= 1) {
      digitalWrite(ALARM, HIGH);//alarm sholat
      delay(1000);
      digitalWrite(ALARM, LOW);//alarm sholat
      delay(1000);
      digitalWrite(ALARM, HIGH);//alarm sholat
      delay(500);
      digitalWrite(ALARM, LOW);//alarm sholat
      delay(1000);
      for (tampil = 0; tampil < 600 ; tampil++) {  // waktu sholat 600 = 5 menit
        menit = 0;
        detik = 0;
        dmd.clearScreen( true );
        dmd.selectFont(font4x7);
        dmd.drawString(1, 0, "SHOLAT", 6, 0); //koordinat tampilan
        ///////////////////////
        //now = rtc.now();
        t = rtc.getTime();
        String xjam = Konversi(t.hour) + String(separator[millis() / 500 % 2]) + Konversi(t.min) ; //tampilan jam
        int pjg = xjam.length() + 1;
        char sjam[pjg];
        xjam.toCharArray(sjam, pjg);
        dmd.selectFont(SystemFont5x7);
        dmd.drawString(2, 9, sjam, pjg, 0);
        /////////////////////
        delay (500);
      }
    }
  }
}

void jumat() {
  digitalWrite(ALARM, HIGH);//alarm sholat
  delay(1000);
  digitalWrite(ALARM, LOW);//alarm sholat
  delay(1000);
  digitalWrite(ALARM, HIGH);//alarm sholat
  delay(1000);
  digitalWrite(ALARM, LOW);//alarm sholat
  delay(1000);
  int tampil;
  for (tampil = 0; tampil < 30100 ; tampil++) {  // waktu sholat jumat 1550 = 25 menit 
    dmd.clearScreen( true );
    dmd.selectFont(font4x7);
    dmd.drawString(1, 0, "JUM'AT", 6, 0); //koordinat tampilan
    ///////////////////////
    //now = rtc.now();
    t = rtc.getTime();
    String xjam = Konversi(t.hour) + String(separator[millis() / 500 % 2]) + Konversi(t.min) ; //tampilan jam
    int pjg = xjam.length() + 1;
    char sjam[pjg];
    xjam.toCharArray(sjam, pjg);
    dmd.selectFont(SystemFont5x7);
    dmd.drawString(2, 9, sjam, pjg, 0);
    /////////////////////
    delay (500);
  }
}