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();
}
- LiquidCrystal-I2C.zip
- Sodaq_DS3231.zip