/*
KYWARE Project
16 Channel Relay Pattern
089665467706
[email protected]
24-04-2024
*/
/*
CARA MENAMBAH PATTERN RELAY
1. Pahami cara menyala/matikan relay :
digitalWrite(relayPins[0], LOW); //Artinya Relay 1 ON
digitalWrite(relayPins[1], LOW); //Artinya Relay 2 ON
digitalWrite(relayPins[2], LOW); //Artinya Relay 3 ON
dan seterusnya ...
digitalWrite(relayPins[13], HIGH); //Artinya Relay 14 OFF
digitalWrite(relayPins[14], HIGH); //Artinya Relay 15 OFF
digitalWrite(relayPins[15], HIGH); //Artinya Relay 16 OFF
2. Buat void gerakan yang akan ditambahkan misal:
void test()
{
digitalWrite(relayPins[0], LOW); //Relay 1 ON
delay(1000);
digitalWrite(relayPins[0], HIGH); //Relay 1 OFF
}
3. Masukan nama void yang dibuat pada array void, misal :
void (*voidFunctions[])() = {blink, test, P1, Pattern1, Pattern2 , Pattern3, Pattern4, Pattern5, Pattern6, Pattern7, Pattern8, Pattern9, Pattern10}; // Masukan daftar nama2 void gerakan
ini artinya void "test" yang telah dibuat akan dijalankan pada urutan ke 2 setelah void "blink" dilakukan.
posisi penulisan void pada array void menentukan urutan dijalankanya pattern tersebut
*/
const int SW1Pin = A0; // Pin SW1
const int SW2Pin = A1; // Pin SW2
const int SW3Pin = A2; // Pin SW3
int SW2_State = 0;
bool systemOn = false; // Status sistem (mati atau hidup)
const int relayPins[] = { // Pin Relay
13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, A5, A4, A3
};
int numRelays = sizeof(relayPins) / sizeof(relayPins[0]); // Jumlah Relay
void blink()
{
int t = 500; //500 ms
digitalWrite(relayPins[0], LOW); //Relay 1 ON
digitalWrite(relayPins[1], LOW); //Relay 2 ON
digitalWrite(relayPins[2], LOW); //Relay 3 ON
digitalWrite(relayPins[3], LOW); //Relay 4 ON
digitalWrite(relayPins[4], LOW); //Relay 5 ON
digitalWrite(relayPins[5], LOW); //Relay 6 ON
digitalWrite(relayPins[6], LOW); //Relay 7 ON
digitalWrite(relayPins[7], LOW); //Relay 8 ON
digitalWrite(relayPins[8], HIGH); //Relay 9 OFF
digitalWrite(relayPins[9], HIGH); //Relay 10 OFF
digitalWrite(relayPins[10], HIGH); //Relay 11 OFF
digitalWrite(relayPins[11], HIGH); //Relay 12 OFF
digitalWrite(relayPins[12], HIGH); //Relay 13 OFF
digitalWrite(relayPins[13], HIGH); //Relay 14 OFF
digitalWrite(relayPins[14], HIGH); //Relay 15 OFF
digitalWrite(relayPins[15], HIGH); //Relay 16 OFF
delay(t);
digitalWrite(relayPins[0], HIGH); //Relay 1 OFF
digitalWrite(relayPins[1], HIGH); //Relay 2 OFF
digitalWrite(relayPins[2], HIGH); //Relay 3 OFF
digitalWrite(relayPins[3], HIGH); //Relay 4 OFF
digitalWrite(relayPins[4], HIGH); //Relay 5 OFF
digitalWrite(relayPins[5], HIGH); //Relay 6 OFF
digitalWrite(relayPins[6], HIGH); //Relay 7 OFF
digitalWrite(relayPins[7], HIGH); //Relay 8 OFF
digitalWrite(relayPins[8], LOW); //Relay 9 ON
digitalWrite(relayPins[9], LOW); //Relay 10 ON
digitalWrite(relayPins[10], LOW); //Relay 11 ON
digitalWrite(relayPins[11], LOW); //Relay 12 ON
digitalWrite(relayPins[12], LOW); //Relay 13 ON
digitalWrite(relayPins[13], LOW); //Relay 14 ON
digitalWrite(relayPins[14], LOW); //Relay 15 ON
digitalWrite(relayPins[15], LOW); //Relay 16 ON
delay(t);
}
void P1() { //Gerakan Relay 1
int z = 8;
int t = 100;
for (int i = 7; i >= 0; i--) {
for (int i = 0; i < z; i++) {
digitalWrite(relayPins[i], LOW); // Nyalakan relay pertama
digitalWrite(relayPins[numRelays - 1 - i], LOW); // Nyalakan relay terakhir
delay(t);
digitalWrite(relayPins[i], HIGH); // Matikan relay pertama
digitalWrite(relayPins[numRelays - 1 - i], HIGH); // Matikan relay terakhir
}
digitalWrite(relayPins[i], LOW); // Nyalakan relay pertama
digitalWrite(relayPins[numRelays - 1 - i], LOW); // Nyalakan relay terakhir
delay(t);
z--;
}
for (int i = 0; i < numRelays / 2; i++) {
digitalWrite(relayPins[i], HIGH); // Matikan relay pertama
digitalWrite(relayPins[numRelays - 1 - i], HIGH); // Matikan relay terakhir
delay(t);
}
for (int i = 7; i >= 0; i--) {
digitalWrite(relayPins[i], LOW); // Nyalakan relay pertama
digitalWrite(relayPins[numRelays - 1 - i], LOW); // Nyalakan relay terakhir
delay(t);
}
for (int i = 0; i < numRelays / 2; i++) {
digitalWrite(relayPins[i], HIGH); // Matikan relay pertama
digitalWrite(relayPins[numRelays - 1 - i], HIGH); // Matikan relay terakhir
delay(t);
}
delay(t);
turnON_all();
delay(t);
turnOFF_all();
delay(t);
turnON_all();
}
void Pattern1() { // Running Snake satu arah
int t = 100;
for (int i = 0; i < 2; i++) { // Ulangi pola dua kali
for (int j = 0; j < numRelays; j++) {
digitalWrite(relayPins[j], LOW); // Nyalakan relay
delay(t);
}
for (int j = 0; j < numRelays; j++) {
digitalWrite(relayPins[j], HIGH); // Matikan relay
delay(t);
}
}
}
void Pattern2() { // Running ON One satu arah
int t = 100;
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], LOW); // Nyalakan relay
delay(t);
digitalWrite(relayPins[i], HIGH); // Matikan relay
delay(t);
}
}
void Pattern3() { //Running OFF One
int t = 100;
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], HIGH); // Matikan relay
delay(t);
digitalWrite(relayPins[i], LOW); // Nyalakan relay
delay(t);
}
}
void Pattern4() { // Blink Ganjil Genap
int t = 100;
// Pola pertama: Nyalakan relay dengan indeks ganjil, matikan relay dengan indeks genap
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], (i % 2 == 0) ? HIGH : LOW);
}
delay(t);
// Pola kedua: Balikkan pola pertama
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], (i % 2 == 0) ? LOW : HIGH);
}
delay(t);
// Matikan semua relay
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], HIGH);
}
}
void Pattern5() { // Running Snake dua arah (bolak balik)
int t = 100;
// Pola pertama: Nyalakan semua relay
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], LOW);
delay(t);
}
// Pola kedua: Matikan semua relay
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], HIGH);
delay(t);
}
// Pola ketiga: Nyalakan semua relay dari belakang ke depan
for (int i = numRelays - 1; i >= 0; i--) {
digitalWrite(relayPins[i], LOW);
delay(t);
}
// Pola keempat: Matikan semua relay dari belakang ke depan
for (int i = numRelays - 1; i >= 0; i--) {
digitalWrite(relayPins[i], HIGH);
delay(t);
}
}
void Pattern6() { //Running Snake 2
int t = 100;
for (int i = 0; i < numRelays / 2; i++) {
digitalWrite(relayPins[i], LOW); // Nyalakan relay pertama
digitalWrite(relayPins[numRelays - 1 - i], LOW); // Nyalakan relay terakhir
delay(t);
}
for (int i = 0; i < numRelays / 2; i++) {
digitalWrite(relayPins[i], HIGH); // Matikan relay pertama
digitalWrite(relayPins[numRelays - 1 - i], HIGH); // Matikan relay terakhir
delay(t);
}
}
void Pattern7() { // Wave Pattern 4
int t = 100;
int waveSize = 4;
for (int offset = 0; offset < waveSize; offset++) {
for (int i = 0; i < numRelays; i++) {
int state = (i + offset) % waveSize == 0 ? LOW : HIGH; // membuat pattern gelombang
digitalWrite(relayPins[i], state);
}
delay(t);
}
}
void Pattern8() { // Blinking
int t = 100;
// Variabel untuk mengontrol status LED (HIGH/LOW)
int ledState = HIGH;
// Loop untuk mengatur pola berkedip
for (int i = 0; i < 5; i++) { // Mengulangi pola berkedip sebanyak lima kali
// Loop untuk mengatur status semua LED
for (int j = 0; j < numRelays; j++) {
digitalWrite(relayPins[j], ledState);
}
// Ubah status LED untuk berikutnya
ledState = (ledState == HIGH) ? LOW : HIGH;
// Beri jeda sebelum mengulangi pola
delay(t);
}
}
void Pattern9() { // Running One dua arah (bolak balik)
int t = 100;
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], LOW);
delay(t);
digitalWrite(relayPins[i], HIGH);
if (i < numRelays - 1) {
delay(t);
}
}
// Ulangi sebaliknya dari belakang
for (int i = numRelays - 1; i >= 0; i--) {
digitalWrite(relayPins[i], LOW);
delay(t);
digitalWrite(relayPins[i], HIGH);
if (i > 0) {
delay(t);
}
}
}
void Pattern10() { // Random Fade
int numSteps = 5;
int minDelay = 100;
int maxDelay = 200;
int steps[numRelays];
for (int i = 0; i < numRelays; i++) {
steps[i] = random(numSteps) + 1;
}
for (int step = 0; step < numSteps; step++) {
for (int i = 0; i < numRelays; i++) {
analogWrite(relayPins[i], map(step, 0, numSteps - 1, 0, 255)); // Fade in
}
delay(random(minDelay, maxDelay));
for (int i = 0; i < numRelays; i++) {
analogWrite(relayPins[i], map(steps[i] - step, 0, numSteps - 1, 0, 255)); // Fade out
}
delay(random(minDelay, maxDelay));
}
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], LOW);
}
}
// Array untuk menyimpan daftar fungsi void
void (*voidFunctions[])() = {blink, P1, Pattern1, Pattern2 , Pattern3, Pattern4, Pattern5, Pattern6, Pattern7, Pattern8, Pattern9, Pattern10}; // Masukan daftar nama2 void gerakan
const int numVoidFunctions = sizeof(voidFunctions) / sizeof(voidFunctions[0]);
int currentVoidIndex = 0;
// Inisialisasi status tombol
int lastSW2_State = LOW;
void setup() {
// Inisialisasi pin untuk tombol dan relay
pinMode(SW1Pin, INPUT_PULLUP); // Set SW1 sebagai input dengan pull-up resistor
pinMode(SW2Pin, INPUT_PULLUP); // Set SW2 sebagai input dengan pull-up resistor
pinMode(SW3Pin, INPUT_PULLUP); // Set SW3 sebagai input dengan pull-up resistor
for (int i = 0; i < 16; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], HIGH); // Pastikan relay dimatikan saat awal
}
}
void loop() {
if (digitalRead(SW1Pin) == LOW) {
systemOn = true;
}
else{
systemOn = false;
turnOFF_all();
currentVoidIndex = -1;
}
// Jika sistem hidup, jalankan void sesuai dengan tombol SW2
if (systemOn) {
// Jika tombol SW3 ditekan relay nyala semua
if (digitalRead(SW3Pin) == LOW) {
turnON_all();
}
else{
SW2_State = digitalRead(SW2Pin);
if (SW2_State != lastSW2_State) {
// Pindah ke void berikutnya
currentVoidIndex = (currentVoidIndex + 1) % numVoidFunctions; // Bergantian antara 0 hingga 11
lastSW2_State = SW2_State;
}
// Panggil fungsi void yang saat ini ditunjuk
voidFunctions[currentVoidIndex]();
}
}
}
void turnON_all () { // Semua relay ON
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], LOW);
}
}
void turnOFF_all () { // Semua relay OFF
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], HIGH);
}
}