Penjadwalan dan durasi aktif relay dengan setting melalui tombol berbasis arduino

Pengontrolan waktu hidup dan mati peralatan sebagai otomasi yang mengurangi ketergantungan dari kontrol operator, bisa dilakukan dengan penjadwalan beban/peralatan. Contohnya dalam pengaturan beban dalam rumah tangga, misalkan terdapat beban yang akan dikontrol seperti berikut :

  1. lampu teras
  2. lampu taman
  3. pompa pengisi air tandon
  4. kran/solenoid Penyiram tanaman
  5. electric water heater

adalah beban-beban listrik yang biasanya hidup dan mati-nya terjadwal.

Untuk mengatur jadwalnya, pada contoh ini menggunakan 3 tombol yaitu set, up dan down. adapun komponen yang digunakan adalah :

  1. Arduino uno
  2. rtc ds3231
  3. lcd 16×02 i2c
  4. relay 8 channel

Skema penjadwalan relay menggunakan arduino :

koding arduino penjadwalan relay :


#define pinTombolSet        A0
#define pinTombolUp         A1
#define pinTombolDown       A2

#define pinRelay1           2
#define pinRelay2           3
#define pinRelay3           4
#define pinRelay4           5
#define pinRelay5           6
#define pinRelay6           7
#define pinRelay7           8
#define pinRelay8           9

#define relayOn             LOW
#define jumlahRelay         8

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "Sodaq_DS3231.h"
#include "EEPROM.h"

LiquidCrystal_I2C lcd(0x3F, 16, 2);//coba juga 0x27

byte setting[jumlahRelay * 4];
byte menu = 0;
char buf[32];
DateTime now;
byte detikSebelumnya = 60;
byte pinRelay[] = {pinRelay1, pinRelay2, pinRelay3, pinRelay4, pinRelay5, pinRelay6, pinRelay7, pinRelay8};

void setup()
{
  pinMode(pinTombolSet, INPUT_PULLUP);
  pinMode(pinTombolUp, INPUT_PULLUP);
  pinMode(pinTombolDown, INPUT_PULLUP);

  for (byte i = 0; i < jumlahRelay; i++)
  {
    digitalWrite(pinRelay[i], !relayOn);
    pinMode(pinRelay[i], OUTPUT);
  }

  Serial.begin(9600);
  Serial.println(F("Penjadwalan dan durasi aktif relay dengan setting melalui tombol berbasis arduino"));
  Serial.println(F("https://www.project.semesin.com"));
  Serial.println();
  
  Wire.begin();
  rtc.begin();
  DateTime dt(2011, 11, 10, 15, 18, 0, 5); // set tanggal dan waktu (format): tahun, bulan tanggal, jam, menit, detik, hari (1=minggu, 7=sabtu)
  rtc.setDateTime(dt);

  Wire.beginTransmission(0x3F);
  if (Wire.endTransmission())
  {
    lcd = LiquidCrystal_I2C(0x27, 16, 2);
  }
  lcd.begin();

  lcd.backlight();
  lcd.print("Jadwal relay");
  lcd.setCursor(0, 1);
  lcd.print("www.Semesin.com");
  delay(3000);

  lcd.clear();

  if (EEPROM.read(0) != 12)
  {
    EEPROM.update(0, 12);
    for (byte i = 0; i < jumlahRelay * 4; i++)
    {
      setting[i] = 0;
    }
    EEPROM.put(1, setting);
  }
  EEPROM.get(1, setting);

  Serial.println("Sistem mulai");

}


void loop()
{
  now = rtc.now();
  if (detikSebelumnya != now.second())
  {
    detikSebelumnya = now.second();
    if (now.second() == 0)
    {
      for (byte i = 0; i < jumlahRelay; i++)
      {
        uint16_t unixNow = (now.hour() * 60) +  now.minute();
        uint16_t unixWaktu = ((setting[(i * 4) + 0] * 60) +  setting[(i * 4) + 1]);
        uint16_t unixDurasi = ((setting[(i * 4) + 2] * 60) +  setting[(i * 4) + 3]);
        if (unixNow == unixWaktu)
        {
          digitalWrite(pinRelay[i], LOW);
          Serial.print("Relay ");
          Serial.print(i + 1);
          Serial.println(" aktif");
        }
        if (unixNow == unixWaktu + unixDurasi)
        {
          digitalWrite(pinRelay[i], HIGH);
          Serial.print("Relay ");
          Serial.print(i + 1);
          Serial.println(" tidak aktif");
        }
      }
    }
    if (!menu)
    {
      sprintf(buf, "%02d/%02d/%04d", now.date(), now.month(), now.year());
      lcd.setCursor(3, 0);
      lcd.print(buf);
      sprintf(buf, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
      lcd.setCursor(4, 1);
      lcd.print(buf);
    }
  }

  if (menu)
  {
    if (!digitalRead(pinTombolUp))
    {
      delay(50);
      while (!digitalRead(pinTombolUp))
      {
        setting[menu - 1]++;
        if ((menu - 1) % 2)
        {
          if (setting[menu - 1] >= 60)
          {
            setting[menu - 1] = 0;
          }
        }
        else
        {
          if (setting[menu - 1] >= 24)
          {
            setting[menu - 1] = 0;
          }
        }

        tampilanMenu();
        delay(100);
      }
    }
    if (!digitalRead(pinTombolDown))
    {
      delay(50);
      while (!digitalRead(pinTombolDown))
      {

        if ((menu - 1) % 2)
        {
          if (setting[menu - 1] == 0)
          {
            setting[menu - 1] = 59;
          }
          else
          {
            setting[menu - 1]--;
          }
        }
        else
        {
          if (setting[menu - 1] == 0)
          {
            setting[menu - 1] = 23;
          }
          else
          {
            setting[menu - 1]--;
          }
        }

        tampilanMenu();
        delay(100);
      }
    }
  }

  if (!digitalRead(pinTombolSet))
  {
    delay(50);
    if (!digitalRead(pinTombolSet))
    {
      menu++;

      if (menu == jumlahRelay * 4 + 1)
      {
        menu = 0;
        lcd.clear();
        lcd.noCursor();
        EEPROM.put(1, setting);
      }
      else
      {
        lcd.clear();
        lcd.setCursor(2, 0);
        lcd.print("Set Relay ");
        lcd.print(((menu - 1) / 4) + 1);
        tampilanMenu();
      }
      
      long miliisTekanPanjang = millis() + 3000;
      while (!digitalRead(pinTombolSet))
      {
        if (miliisTekanPanjang < millis())
        {
          menu = 0;
          lcd.clear();
          lcd.noCursor();
          EEPROM.put(1, setting);

        }
      }
    }
  }
}
void tampilanMenu()
{
  sprintf(buf, "%s : %02d:%02d", ((menu - 1) % 4) / 2 ? "Durasi" : "Waktu ", setting[(menu - 1) & 0xFE], setting[((menu - 1) & 0xFE) + 1]);
  lcd.setCursor(0, 1);
  lcd.print(buf);

  lcd.setCursor(((menu - 1) % 2) ? 12 : 9, 1);
  lcd.cursor();
}
  1. LiquidCrystal-I2C.zip
  2. Sodaq_DS3231.zip

32 thoughts on “Penjadwalan dan durasi aktif relay dengan setting melalui tombol berbasis arduino

  1. @Admin,I have followed your instructions, and how to fix this problem. Clock is inaccurate.chek this https: //youtu.be/tACWCoelwgU
    thank’s for share..

    1. Sketch diupdate pada baris 50: untuk pengaturan waktu

      DateTime dt(2011, 11, 10, 15, 18, 0, 5); // set tanggal dan waktu (format): tahun, bulan tanggal, jam, menit, detik, hari (1=minggu, 7=sabtu)
      rtc.setDateTime(dt);

  2. Assalamualaikum
    Mas gimana cara buat aplikasi di mit app invertor menyalakan led via bloetooth dengan fungsi delay 1 detik..
    Di apk saat di klik led nyala dalam waktu 1 detik kemudian mati.
    Hnya nyala 1 detik saat di klik
    Sebelumnya saya ucapkan terimah kasih

    1. jika delay dijalankan di app inventor bisa menggunakan fungsi seperti :
      fungsi delay app inventor

      jika delay dijalankan di arduino

      if(perintah == ledOn)
      {
      digitalWrite(pinLED, HIGH);
      delay(1000);
      digitalWrite(pinLED, LOW);
      }

  3. makasih bang tutorialnya. saya mau bikin yg begini persis 8 channel, dan terhubung ke solenoid valve tapi tanpa lcd dan tombol setting bisa ga bang? jadi settingnya di coding nya langsung. Soalnya waktu nyala dan mati nya tiap valve tiap hari sudah fix jadi gak perlu tombol untuk setting. Saya awam sama dunia arduino, beberapa hari ini nyari2 di internet dan youtube, yg paling mirip tutorial abang ini. Mohon pencerahannya ya bang

  4. bang mau tanya untuk bagian
    sprintf(buf, “%s : %02d:%02d”, ((menu – 1) % 4) / 2 ? “Durasi” : “Waktu “, setting[(menu – 1) & 0xFE], setting[((menu – 1) & 0xFE) + 1]);

    yang 0xFE itu buat apa yah? alamat eeprom yang digunakan untuk menyimpan data yang disetting atau yang lain?
    coba memahami masih gantung aja nih
    Terimakasih

    1. 0xFE = 1111 1110
      (menu – 1) & 0xFE :: hanya mengambil 7 bit msb (bit ke-8 diabaikan)
      setting[(menu – 1) & 0xFE] :: merujuk ke variabel setting di alamat : (menu – 1) & 0xFE = menit, (menu – 1) & 0xFE = detik

  5. Bang Asep bisa minta tolong ditambahkan sketch untuk setting Durasinya sampai detik ya, itu kan cuman jam dan menit, sedangkan jika mau menghidupkan relay selama kurang dari 1 menit kesulitan kalau tidak ada setting detiknya,,, makasih banyak bang atas ilmunya semoga barokah dunia akherat amiin.

  6. Bang mau nanya, kalau nggak mau pakai lcd bisa kan? Gimana dengan programnya apa aja yang di ubah?
    Terima kasih sebelumnya

  7. assalamu’alaikum….
    bang asep saya sudah coba program diatas dan masih error
    ‘A1’ was not declare in this scope

    library diatas sudah saya masukkan semua…
    dan menghapus library sebelumnya tapi masih jg error..kira2 kesalahannya di mana ya…

  8. numpang tanya bos…kalau mengatur timer otomatic dalam satu alat selama 24 jam semisalnya setting awalp adalah 15 menit on 10 menit off bekerja dari jam 6 pagi sampai jam 6 sore…sesudah itu 15 menit on dan 30 menit off sampai jam 6 pagi berikutnya bagaimana caranya?

  9. assalamualaikum …
    bang mw nanya jika saya mengkombinasikan antara sketh jadwal sholat dgn relay;
    sy ingin membuat relay aktif 30 menit sebelum dan sesudah azan ,yg berlaku utk 5 waktu azan dalam sehari .
    gmana ,apa kodingan yg harus sy tambah bang .? mohon pencerahan ny

    1. tentukan waktu aktif relay tersebut dengan formula
      waktuRelayAktif1 = SebelumShalat – 30;
      waktuRelayAktif2 = SesudahShalat + 30;
      contoh program penambahan/pengurangan waktu:

      uint16_t waktuShalat = waktuShalat_jam * 60 + waktuShalat_menit;
      uint16_t waktuRelay = waktuShalat - 30;
      byte waktuRelay_jam = waktuRelay / 60;
      byte waktuRelay_menit = waktuRelay % 60;

      kemudian lakukan pengecekan waktu dalam loop

      if ((now.hour() == waktuRelay_jam ) && (now.minute() == waktuRelay_menit ))
      {
      ...
      }

  10. bg izin tanya .. kalau mau buat lama durasi aktif relay on tanpa menggunakan delay .. namun make RTC .. kira kira programnya gimana ya ? saya masih baru banget megang RTC.. ke

  11. untuk waktu hitung gmna gan,
    dimana waktu itung saya atur pke push button yang di tampilkan di lcd, ktika waktu mundur hbis di tmpilan lcd, makan relay otomatis akan menyala,, gimnna gan?

    1. beberapa permasalahan berkaitan relay:

      • indikator nyala tetapi kontak tidak terhubung, indikasi relay bekerja adalah terdengar suara ctek dari kontak relay, maka 1) sesuaikan tegangan power supply input relay (misal 5v, 12v, 220v) 2) periksa ‘kapasitas arus’ power supply ke relay, 3) sesuaikan tegangan sinyal input, sering terjadi relay input sinyal 5v diberi tegangan sinyal 3.3v (misal dari nodemcu) yang mana pada beberapa model menyebabkan relay tidak bekerja
      • Indikator nyala dan suara ctek terdengar jelas tetapi kontak tidak terhubung, maka periksa kontak dengan avo/multitester apakah terhubung atau tidak (baik NO atau NC nya) karena ada kemungkinan kontaknya sudah rusak atau ber-arang akibat pemakaian sebelumnya

      kesalahan yang sering ditemui adalah penggukaan power supply yang tidak sesuai seperti pemaiakan power supply 3.3v pada relay 5v

Leave a Reply to arudam Cancel reply

Your email address will not be published. Required fields are marked *