#include <EEPROM.h>
#include <WS2812FX.h>
#define LED_COUNT 120
#define LED_PIN 5
#define TOMBOL_SPEED_UP 9
#define TOMBOL_SPEED_DOWN 10
#define TOMBOL_MODE_UP 11
#define TOMBOL_MODE_DOWN 12
#define TOMBOL_RANDOM_MODE 13
WS2812FX ws2812fx = WS2812FX(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
boolean randomModeActive = false; // Apakah mode acak sedang berjalan atau tidak
void setup() {
pinMode(TOMBOL_SPEED_UP, INPUT_PULLUP);
pinMode(TOMBOL_SPEED_DOWN, INPUT_PULLUP);
pinMode(TOMBOL_MODE_UP, INPUT_PULLUP);
pinMode(TOMBOL_MODE_DOWN, INPUT_PULLUP);
pinMode(TOMBOL_RANDOM_MODE, INPUT_PULLUP);
ws2812fx.init();
ws2812fx.setBrightness(255);
// Muat pengaturan tersimpan dari EEPROM
uint8_t savedMode = EEPROM.read(0);
uint16_t savedSpeed = (EEPROM.read(1) << 8) | EEPROM.read(2);
ws2812fx.setMode(savedMode);
ws2812fx.setSpeed(savedSpeed);
ws2812fx.start();
}
void loop() {
// Pembacaan Kondisi Tombol
boolean speedUpButtonState = digitalRead(TOMBOL_SPEED_UP);
boolean speedDownButtonState = digitalRead(TOMBOL_SPEED_DOWN);
boolean modeUpButtonState = digitalRead(TOMBOL_MODE_UP);
boolean modeDownButtonState = digitalRead(TOMBOL_MODE_DOWN);
boolean randomModeButtonState = digitalRead(TOMBOL_RANDOM_MODE);
// Tingkatkan kecepatan saat tombol percepat ditekan
if (speedUpButtonState == LOW) {
ws2812fx.setSpeed(ws2812fx.getSpeed() + 100); // Tingkatkan kecepatan hingga 100
delay(250); // Tambahkan waktu penundaan untuk menghindari penekanan tombol yang cepat
}
// Kurangi kecepatan saat tombol speed down ditekan
if (speedDownButtonState == LOW) {
ws2812fx.setSpeed(max(ws2812fx.getSpeed() - 100, 100)); // Kurangi kecepatan sebanyak 100, dengan minimal 100
delay(250); // Tambahkan waktu penundaan untuk menghindari penekanan tombol yang cepat
}
//Ubah mode saat tombol mode naik ditekan
if (modeUpButtonState == LOW) {
ws2812fx.setMode((ws2812fx.getMode() + 1) % ws2812fx.getModeCount()); // Siklus melalui mode
delay(250); // Tambahkan waktu penundaan untuk menghindari penekanan tombol yang cepat
}
// Ubah mode saat tombol mode turun ditekan
if (modeDownButtonState == LOW) {
ws2812fx.setMode((ws2812fx.getMode() + ws2812fx.getModeCount() - 1) % ws2812fx.getModeCount()); // Cycle through modes in reverse
delay(250); // Tambahkan waktu penundaan untuk menghindari penekanan tombol yang cepat
}
// Aktifkan atau nonaktifkan mode acak saat tombol mode acak ditekan
if (randomModeButtonState == LOW) {
delay(250); // Anti bouncing
if (!randomModeActive) {
randomModeActive = true;
ws2812fx.setMode(random(0, ws2812fx.getModeCount())); // Atur ke mode acak
} else {
randomModeActive = false;
ws2812fx.setMode(FX_MODE_STATIC);
}
delay(250); // Tambahkan waktu penundaan untuk menghindari penekanan tombol yang cepat
}
// Jika mode acak aktif, atur mode secara otomatis berdasarkan interval yang ditentukan
if (randomModeActive) {
unsigned long currentTime = millis();
static unsigned long lastRandomChangeTime = currentTime;
unsigned long randomChangeInterval = 5000; // Interval pergantian mode acak dalam milidetik (contoh: 5 detik)
if (currentTime - lastRandomChangeTime >= randomChangeInterval) {
lastRandomChangeTime = currentTime;
ws2812fx.setMode(random(0, ws2812fx.getModeCount())); // Atur ke mode acak
}
}
ws2812fx.service();
// Simpan mode dan kecepatan saat ini ke EEPROM saat tombol apa saja ditekan
if (speedUpButtonState == LOW || speedDownButtonState == LOW ||
modeUpButtonState == LOW || modeDownButtonState == LOW ||
randomModeButtonState == LOW) {
EEPROM.write(0, ws2812fx.getMode());
EEPROM.write(1, (ws2812fx.getSpeed() >> 8) & 0xFF);
EEPROM.write(2, ws2812fx.getSpeed() & 0xFF);
//EEPROM.commit();
delay(100); // Tambahkan waktu penundaan untuk menghindari penekanan tombol yang cepat
}
}