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 :
- lampu teras
- lampu taman
- pompa pengisi air tandon
- kran/solenoid Penyiram tanaman
- 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 :
- Arduino uno
- rtc ds3231
- lcd 16×02 i2c
- 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(); }