#include <Adafruit_NeoPixel.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi objek LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C umumnya adalah 0x27
#define pot_speed A0
#define LED_PIN 3
#define LED_COUNT 120
const int LED_ROW = 4;
const int LED_COL = 30;
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
byte mode_seq; // mode animasi
unsigned long mode_speed; // mode kecepatan
char buffer[4];
// variable
int i_led_1 = 0;
int N_LEDS;
byte intensitas; // tingkat cahaya
bool v_mirror; // gerakan arah dari belakang
bool v_reverse; // gerakan arah mundur
byte count_jeda; // jeda animasi
byte rd_r; // code merah sementara
byte rd_g; // code green sementara
byte rd_b; // code blue sementara
byte num_warna = 1;
// variabel waktu
bool stats = 0; // mode blink
unsigned long ws1 = 0; // millis() returns an unsigned long.
int led_from_pixel (byte rows, byte cols)
{
int a = 0;
if (rows % 2 == 0) {
a = (rows * LED_COL) + cols;
} else {
a = ((rows + 1) * LED_COL) - 1 - cols;
}
return a;
}
void setup() {
Serial.begin(9600);
Serial.println("MZF_APL");
Serial.println("by MANDOZAF");
// Inisialisasi LCD
lcd.init();
lcd.backlight(); // Aktifkan backlight LCD
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(255); // Set BRIGHTNESS to about 1/5 (max = 255)
pinMode(pot_speed, INPUT);
mode_speed = 30;
}
void loop() {
mode_speed = map(analogRead(pot_speed), 0, 1023, 1, 20) * 25;
sprintf(buffer, "%4lu", mode_speed);
lcd.setCursor(6, 1);
lcd.print("speed");
lcd.setCursor(12, 1);
lcd.print(buffer);
// Fill along the length of the strip in various colors...
warna(num_warna);
if (num_warna > 13) {
num_warna = 0;
num_warna++;
// Serial.print('\t'); Serial.println(num_warna);
} else {
num_warna++;
}
// colorWipe(0,0);
// colorStatis();
// delay(1000);
// colorWipe_Bar(0,1);
// meteorEffect(0,1);
// colorWipe_Bar_Gradient(0,1);
// colorWipe_Bar_Gradient(1,0);
// colorWipeGradient(0, 0);
// if (stats == 0) {
// colorWipe_Bar(0, 1);
// } else {
// colorWipe_Bar(1, 1);
// }
rainbow();
}
void rainbow() {
unsigned long currentMillis = millis(); // Ambil waktu saat ini
static long firstPixelHue = 0; // Menggunakan static untuk menyimpan nilai dari iterasi sebelumnya
if (millis() > ws1 + mode_speed / 2) {
// Lakukan animasi pelangi
for (int i = 0; i < strip.numPixels(); i++) { // Untuk setiap pixel di strip...
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
}
strip.show(); // Update strip dengan konten baru
// Increment firstPixelHue untuk efek pelangi bergerak
firstPixelHue += 256;
if (firstPixelHue >= 5 * 65536) {
firstPixelHue = 0; // Reset untuk terus looping warna pelangi
}
ws1 = millis();
}
}
void HSVtoRGB(int h, int s, int v, int &r, int &g, int &b) {
float hf, p, q, t;
int i;
hf = h / 60.0;
i = floor(hf);
p = v * (1 - s / 255.0);
q = v * (1 - (hf - i) * s / 255.0);
t = v * (1 - (1 - (hf - i)) * s / 255.0);
switch (i) {
case 0: r = v; g = t; b = p; break;
case 1: r = q; g = v; b = p; break;
case 2: r = p; g = v; b = t; break;
case 3: r = p; g = q; b = v; break;
case 4: r = t; g = p; b = v; break;
case 5: r = v; g = p; b = q; break;
}
}
void colorWipe_Bar(bool rev, bool half) {
if (half == 1) {
N_LEDS = LED_COL / 2;
} else {
N_LEDS = LED_COL;
}
i_led_1 = 0;
while (i_led_1 < N_LEDS) {
if (millis() > ws1 + mode_speed) {
Serial.println(i_led_1);
// Calculate the hue based on i_led_1 (position) and time (millis())
int hue = (i_led_1 + millis() / 10) % 360; // Gradually changing hue
int r, g, b;
// Convert the hue to RGB values (saturation = 255, value = 255)
HSVtoRGB(hue, 255, 255, r, g, b);
if (rev == 0) {
if (half == 0) {
for (int r = 0; r < LED_ROW; r++) {
strip.setPixelColor(led_from_pixel(r, i_led_1), strip.Color(r, g, b));
}
} else {
for (int r = 0; r < LED_ROW; r++) {
strip.setPixelColor(led_from_pixel(r, i_led_1), strip.Color(r, g, b));
strip.setPixelColor(led_from_pixel(r, LED_COL - i_led_1 - 1), strip.Color(r, g, b));
}
}
} else {
if (half == 0) {
for (int r = 0; r < LED_ROW; r++) {
strip.setPixelColor(led_from_pixel(r, LED_COL - 1 - i_led_1), strip.Color(r, g, b));
}
} else {
for (int r = 0; r < LED_ROW; r++) {
strip.setPixelColor(led_from_pixel(r, N_LEDS + i_led_1), strip.Color(r, g, b));
strip.setPixelColor(led_from_pixel(r, N_LEDS - i_led_1 - 1), strip.Color(r, g, b));
}
}
}
strip.show();
i_led_1++;
ws1 = millis();
}
}
stats = !stats;
}
void colorStatis() {
for (int i = 0; i < LED_COUNT; i++) {
strip.setPixelColor(i_led_1, strip.Color(rd_r, rd_g, rd_b));
}
strip.show();
}
void colorWipe(bool rev, bool half) { // rev 0=maju, 1=munndur half 0=line 1=separuh
if (half == 1) {
N_LEDS = LED_COUNT / 2;
} else {
N_LEDS = LED_COUNT;
}
i_led_1 = 0;
while (i_led_1 < N_LEDS) {
if (millis() > ws1 + mode_speed) {
Serial.println(i_led_1);
if (rev == 0) {
if (half == 0) {
strip.setPixelColor(i_led_1, strip.Color(rd_r, rd_g, rd_b));
} else {
strip.setPixelColor(i_led_1, strip.Color(rd_r, rd_g, rd_b));
strip.setPixelColor(LED_COUNT - 1 - i_led_1, strip.Color(rd_r, rd_g, rd_b));
}
} else {
if (half == 0) {
strip.setPixelColor(LED_COUNT - 1 - i_led_1, strip.Color(rd_r, rd_g, rd_b));
} else {
strip.setPixelColor(N_LEDS + i_led_1, strip.Color(rd_r, rd_g, rd_b));
strip.setPixelColor(N_LEDS - 1 - i_led_1, strip.Color(rd_r, rd_g, rd_b));
}
}
strip.show();
i_led_1++;
ws1 = millis();
}
}
stats = !stats;
}
// Fungsi untuk menghitung warna gradiasi
uint32_t calculateGradientColor(float progress) {
int r, g, b;
// Gradient range: cyan (0.0) -> blue (0.33) -> magenta (0.66) -> cyan (1.0)
if (progress < 0.33) {
// Cyan (0,255,255) -> Blue (0,0,255)
float subProgress = progress / 0.33; // Skala ke rentang [0, 1]
r = 0;
g = (int)(255 * (1.0 - subProgress));
b = 255;
} else if (progress < 0.66) {
// Blue (0,0,255) -> Magenta (255,0,255)
float subProgress = (progress - 0.33) / 0.33; // Skala ke rentang [0, 1]
r = (int)(255 * subProgress);
g = 0;
b = 255;
} else {
// Magenta (255,0,255) -> Cyan (0,255,255)
float subProgress = (progress - 0.66) / 0.34; // Skala ke rentang [0, 1]
r = (int)(255 * (1.0 - subProgress));
g = (int)(255 * subProgress);
b = 255;
}
return strip.Color(r, g, b);
}
void warna(int n) {
switch (n) {
case 0: // BLACK
rd_r = 0;
rd_g = 0;
rd_b = 0;
break;
case 1: // WHITE
rd_r = 252;
rd_g = 125;
rd_b = 150;
break;
case 2: // RED
rd_r = 255;
rd_g = 0;
rd_b = 0;
break;
case 3: // ROSE
rd_r = 255;
rd_g = 0;
rd_b = 50;
break;
case 4: // MAGENTA
rd_r = 255;
rd_g = 0;
rd_b = 200;
break;
case 5: // VIOLET
rd_r = 150;
rd_g = 0;
rd_b = 255;
break;
case 6: // BLUE
rd_r = 0;
rd_g = 0;
rd_b = 255;
break;
case 7: // AZURE
rd_r = 0;
rd_g = 75;
rd_b = 255;
break;
case 8: // CYAN
rd_r = 0;
rd_g = 255;
rd_b = 255;
break;
case 9: // AQUAMARINE
rd_r = 0;
rd_g = 255;
rd_b = 75;
break;
case 10: // GREEN
rd_r = 0;
rd_g = 255;
rd_b = 0;
break;
case 11: // CHARTREUSE
rd_r = 100;
rd_g = 255;
rd_b = 0;
break;
case 12: // YELLOW
rd_r = 255;
rd_g = 100;
rd_b = 0;
break;
case 13: // ORANGE
rd_r = 255;
rd_g = 50;
rd_b = 0;
break;
case 100:
break;
default:
rd_r = 255;
rd_g = 255;
rd_b = 255;
break;
}
}