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.semesin.com/project"));
  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
Bagikan Link halaman ini :

14 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. Mas..admin,saya sudah buat,sudah berjalan hampir 2 hari.Tapi kemaren pas listrik pln mati,kok nggak tersimpan..ya.Ada solusinya mas..?

    1. Sketch/koding ini bersifat trigger pada waktu sesuai setting,
      jadi tidak melakukan pengecekan jadwal saat mulai/reset (sama seperti kondisi mati lampu => mulai ulang/reboot).

  4. 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

    1. set variabel setting.
      contoh :
      setting = {
      08,00,00,15, //waktu 1 = jam, menit, durasi menit, durasi detik
      09,00,00,30, //waktu 2 = jam, menit, durasi menit, durasi detik

      };

  5. 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

  6. 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.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.