#include <LedControl.h>
#define dataPin 11 // Pin data MAX7219
#define clockPin 12 // Pin clock MAX7219
#define csPin 10 // Pin CS (chip select) MAX7219
#define numDevices 1 // Jumlah modul MAX7219 yang digunakan
LedControl lc = LedControl(dataPin, clockPin, csPin, numDevices);
#define pot_speed A0
#define button_switch 2
uint8_t jumlah_lampu = 64;
int led = 0;
uint8_t num = 1;
uint8_t id_num = 0;
uint8_t id_num_loop = 0;
uint8_t id_animasi = 0;
bool stats;
unsigned long waktu;
unsigned long jedaWaktu = 0;
// Variables will change:
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
void setup() {
Serial.begin(9600);
Serial.println("MZF_GAUNG_MERAH__DOT_MATRIX__Ver.2.0");
Serial.println("set jumlah lampu");
Serial.println("by MANDOZAF");
if (jumlah_lampu > 64) {
jumlah_lampu = 64;
}
lc.shutdown(0, false);
lc.setIntensity(0, 15);
lc.clearDisplay(0);
pinMode(button_switch, INPUT_PULLUP);
pinMode(pot_speed, INPUT);
waktu = 200;
}
void loop() {
waktu = map(analogRead(pot_speed), 0, 1023, 100, 1050);
buttonState = digitalRead(button_switch);
if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
buttonPushCounter++;
lc.clearDisplay(0);
led = 0;
delay(300);
if (id_animasi >= 16) {
id_animasi = 1;
} else {
id_animasi++;
}
Serial.print("Animasi = ");
Serial.println(id_animasi);
}
}
lastButtonState = buttonState;
animasi(id_animasi);
// animasi(9);
// animasi_run_halfchase(0, 1); // reverse,strobe
}
void animasi(byte x) {
switch (x) {
case 1:
animasi_run_dot(0, 1);
break;
case 2:
animasi_run_dot(1, 1);
break;
case 3:
animasi_run_dot(0, 0);
break;
case 4:
animasi_run_dot(1, 0);
break;
case 5:
animasi_run_fill(0, 1);
break;
case 6:
animasi_run_fill(1, 1);
break;
case 7:
animasi_run_fill(0, 0);
break;
case 8:
animasi_run_fill(1, 0);
break;
case 9:
animasi_run_chase(0, 1);
break;
case 10:
animasi_run_chase(1, 1);
break;
case 11:
animasi_run_chase(0, 0);
break;
case 12:
animasi_run_chase(1, 0);
break;
case 13:
animasi_run_halfchase(0, 1);
break;
case 14:
animasi_run_halfchase(1, 1);
break;
case 15:
animasi_run_halfchase(0, 0);
break;
case 16:
animasi_run_halfchase(1, 0);
break;
default:
animasi_run_dot(0, 1);
break;
}
}
void animasi_run_dot(bool rev, bool strobe) {
switch (num) {
case 1:
if (rev == 0) {
lc.setLed(0, led / 8, led % 8, true);
lc.setLed(0, (led - 1) / 8, (led - 1) % 8, false);
} else {
lc.setLed(0, ((jumlah_lampu - 1) - led) / 8, ((jumlah_lampu - 1) - led) % 8, true);
lc.setLed(0, ((jumlah_lampu - 1) - led + 1) / 8, ((jumlah_lampu - 1) - led + 1) % 8, false);
}
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
led++;
}
if (led >= jumlah_lampu) {
lc.clearDisplay(0);
led = 0;
if (strobe == 0) {
num = 1;
} else {
num = 2;
}
}
break;
case 2:
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
num = 3;
}
break;
case 3:
set_all(1); // hidup semua
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
id_num++;
}
if (id_num >= 2) {
id_num = 0;
num = 4;
// Serial.println("num > 5");
}
break;
case 4:
set_all(0); // hidup semua
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
id_num++;
}
if (id_num >= 2) {
id_num = 0;
id_num_loop++;
if (id_num_loop > 1) {
num = 5;
id_num_loop = 0;
} else {
num = 3;
}
}
break;
case 5:
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
num = 1;
}
break;
}
}
void animasi_run_fill(bool rev, bool strobe) {
switch (num) {
case 1:
if (rev == 0) {
lc.setLed(0, led / 8, led % 8, true);
} else {
lc.setLed(0, ((jumlah_lampu - 1) - led) / 8, ((jumlah_lampu - 1) - led) % 8, true);
}
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
led++;
}
if (led >= jumlah_lampu) {
// lc.clearDisplay(0);
led = 0;
if (strobe == 0) {
num = 6;
} else {
num = 2;
}
}
break;
case 2:
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
num = 3;
}
break;
case 3:
set_all(1); // hidup semua
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
id_num++;
}
if (id_num >= 2) {
id_num = 0;
num = 4;
// Serial.println("num > 5");
}
break;
case 4:
set_all(0); // hidup semua
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
id_num++;
}
if (id_num >= 2) {
id_num = 0;
id_num_loop++;
if (id_num_loop > 1) {
num = 5;
id_num_loop = 0;
} else {
num = 3;
}
}
break;
case 5:
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
num = 1;
}
break;
case 6:
if (rev == 0) {
lc.setLed(0, ((jumlah_lampu - 1) - led) / 8, ((jumlah_lampu - 1) - led) % 8, false);
} else {
lc.setLed(0, led / 8, led % 8, false);
}
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
led++;
}
if (led >= jumlah_lampu) {
lc.clearDisplay(0);
led = 0;
if (strobe == 0) {
num = 5;
} else {
num = 2;
}
}
break;
}
}
void animasi_run_chase(bool rev, bool strobe) {
switch (num) {
case 1:
if (rev == 0) {
lc.setLed(0, led / 8, led % 8, true);
} else {
lc.setLed(0, ((jumlah_lampu - 1) - led) / 8, ((jumlah_lampu - 1) - led) % 8, true);
}
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
led++;
}
if (led >= jumlah_lampu) {
led = 0;
num = 2;
}
break;
case 2:
if (rev == 0) {
lc.setLed(0, led / 8, led % 8, false);
} else {
lc.setLed(0, ((jumlah_lampu - 1) - led) / 8, ((jumlah_lampu - 1) - led) % 8, false);
}
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
led++;
}
if (led >= jumlah_lampu) {
led = 0;
if (strobe == 0) {
num = 1;
} else {
num = 3;
}
}
break;
case 3:
set_all(1); // hidup semua
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
id_num++;
}
if (id_num >= 2) {
id_num = 0;
num = 4;
// Serial.println("num > 5");
}
break;
case 4:
set_all(0); // hidup semua
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
id_num++;
}
if (id_num >= 2) {
id_num = 0;
id_num_loop++;
if (id_num_loop > 1) {
num = 5;
id_num_loop = 0;
} else {
num = 3;
}
}
break;
case 5:
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
num = 1;
}
break;
}
}
void animasi_run_halfchase(bool rev, bool strobe) {
switch (num) {
case 1:
if (rev == 0) {
lc.setLed(0, led / 8, led % 8, true);
lc.setLed(0, ((jumlah_lampu - 1) - led) / 8, ((jumlah_lampu - 1) - led) % 8, true);
} else {
lc.setLed(0, ((jumlah_lampu / 2) - led - 1) / 8, ((jumlah_lampu / 2) - led - 1) % 8, true);
lc.setLed(0, ((jumlah_lampu / 2) + led) / 8, ((jumlah_lampu / 2) + led) % 8, true);
}
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
led++;
}
if (led >= (jumlah_lampu / 2)) {
led = 0;
num = 2;
}
break;
case 2:
if (rev == 0) {
lc.setLed(0, led / 8, led % 8, false);
lc.setLed(0, ((jumlah_lampu - 1) - led) / 8, ((jumlah_lampu - 1) - led) % 8, false);
} else {
lc.setLed(0, ((jumlah_lampu / 2) - led - 1) / 8, ((jumlah_lampu / 2) - led - 1) % 8, false);
lc.setLed(0, ((jumlah_lampu / 2) + led) / 8, ((jumlah_lampu / 2) + led) % 8, false);
}
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
led++;
}
if (led >= (jumlah_lampu / 2)) {
led = 0;
if (strobe == 0) {
num = 1;
} else {
num = 3;
}
}
break;
case 3:
set_all(1); // hidup semua
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
id_num++;
}
if (id_num >= 2) {
id_num = 0;
num = 4;
// Serial.println("num > 5");
}
break;
case 4:
set_all(0); // hidup semua
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
id_num++;
}
if (id_num >= 2) {
id_num = 0;
id_num_loop++;
if (id_num_loop > 1) {
num = 5;
id_num_loop = 0;
} else {
num = 3;
}
}
break;
case 5:
if ( millis() - jedaWaktu >= waktu) {
jedaWaktu = millis();
num = 1;
}
break;
}
}
void set_all(bool x) {
for (int led = 0; led < jumlah_lampu; led++) {
lc.setLed(0, led / 8, led % 8, x);
}
}