Pada kesempatan kali ini saya ingin berbagi tutorial bagaimana cara membuat kontroller relay terjadawal, menghidupkan dan mematikan relay berdasarkan waktu tertentu, kali ini saya menggunakan 8 relay sebagai outputnya, dengan 3 tombol sebagai inputnya.
Adapun teknis penggunaan tombolnya ya itu saat tombol menu ditekan sekali akan masuk kemenu untuk setting jadwal relay ke satu untuk berpindah menit dan detik silahkan tekan menu sekali lagi makaa posisi kursor pindah ke bagian menit, kurg lebih seperti itu singkatnya.
saya tidak sempat menambahkan pada contoh wiring nya silhkan teman2 bisa baca dan sesuaikan dengan, koding di bawah ini.
#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://rizkitech.my.id"));
Serial.println();
Wire.begin();
rtc.begin();
DateTime dt(2023, 01, 03, 22, 34, 0, 2); // 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("Relay Terjadwal");
lcd.setCursor(0, 1);
lcd.print("rizkitech.my.id");
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();
}
untuk yang ingin mencoba demonya terlebih dahulu bisa cek di link dibawah ini.
Posting Komentar