// Dont Forget to Support My Channel
// Electro Pemula on Youtube and TikTok
// https://www.youtube.com/channel/UCa8eHXL2aL6lc1UN_bcge7A/
// https://www.tiktok.com/@elektropemula/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS SSD1306_SWITCHCAPVCC, 0x3C // Alamat I2C untuk OLED SSD1306
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int ledPins[11] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
const int buttonPin = 2;
const int potPin = A0;
int currentAnimation = 0; // Menyimpan animasi saat ini
const int totalAnimations = 5; // Jumlah animasi yang tersedia
unsigned long previousMillis = 0; // Waktu untuk animasi
int animationSpeed = 100; // Kecepatan animasi
const int debounceDelay = 200; // Delay debounce untuk tombol
unsigned long lastButtonPress = 0; // Waktu terakhir tombol ditekan
void setup() {
// Inisialisasi LED
for (int i = 0; i < 11; i++) {
pinMode(ledPins[i], OUTPUT);
}
// Inisialisasi tombol
pinMode(buttonPin, INPUT_PULLUP);
// Inisialisasi OLED
display.begin(SCREEN_ADDRESS);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("LED Animation");
display.display();
}
void loop() {
// Membaca nilai potensiometer dan mengatur kecepatan animasi
int potValue = analogRead(potPin);
animationSpeed = map(potValue, 0, 1023, 1000, 50); // Kecepatan dari 1000 ms (lambat) hingga 50 ms (cepat)
// Mengatur status LED berdasarkan animasi yang aktif
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= animationSpeed) {
previousMillis = currentMillis;
switch (currentAnimation) {
case 0: breathingAnimation(); break; // Animasi 1
case 1: blinkingAnimation(); break; // Animasi 2
case 2: bouncingAnimation(); break; // Animasi 3
case 3: runningLightAnimation(); break; // Animasi 4
case 4: theaterChaseAnimation(); break; // Animasi 5
}
}
// Membaca status tombol
if (digitalRead(buttonPin) == LOW && (millis() - lastButtonPress > debounceDelay)) {
currentAnimation = (currentAnimation + 1) % totalAnimations; // Ubah animasi
lastButtonPress = millis(); // Update waktu terakhir tombol ditekan
}
// Menampilkan informasi pada OLED
display.clearDisplay();
display.setCursor(30, 0);
display.print("Animasi LED : ");
display.setCursor(20, 15);
display.print(currentAnimation + 1);
display.print(". ");
// Menampilkan nama animasi
switch (currentAnimation) {
case 0: display.println("Breathing"); break;
case 1: display.println("Blinking"); break;
case 2: display.println("Bouncing"); break;
case 3: display.println("Running Light"); break;
case 4: display.println("Theater Chase"); break;
}
// Menampilkan bar indikator volume
int volumeLevel = map(potValue, 0, 1023, 0, 100); // Mengubah nilai potensiometer menjadi persentase
display.setCursor(0, 30);
display.print("---------------------");
display.setCursor(25, 40);
display.print("Kecepatan LED : ");
display.fillRect(0, 50, (volumeLevel * 128) / 100, 10, SSD1306_WHITE); // Menggambar bar dengan persentase
display.display();
}
void breathingAnimation() {
static int brightness = 0; // Kecerahan LED
static int fadeAmount = 11; // Jumlah perubahan kecerahan
// Ubah kecerahan LED untuk semua LED
for (int i = 0; i < 11; i++) {
analogWrite(ledPins[i], brightness); // Mengatur kecerahan LED
}
// Perbarui kecerahan
brightness += fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount; // Ubah arah perubahan kecerahan
}
}
void blinkingAnimation() {
static bool ledState = false; // Status LED
// Nyalakan atau matikan semua LED
ledState = !ledState;
for (int i = 0; i < 11; i++) {
digitalWrite(ledPins[i], ledState ? HIGH : LOW);
}
}
void bouncingAnimation() {
static int ledIndex = 0; // Indeks LED yang aktif
static int direction = 1; // Arah gerakan (1 = maju, -1 = mundur)
// Matikan semua LED
for (int i = 0; i < 11; i++) {
digitalWrite(ledPins[i], LOW);
}
// Nyalakan LED sesuai indeks
digitalWrite(ledPins[ledIndex], HIGH);
// Update indeks LED
ledIndex += direction;
if (ledIndex >= 10) {
direction = -1; // Ubah arah ke mundur
} else if (ledIndex <= 0) {
direction = 1; // Ubah arah ke maju
}
}
void runningLightAnimation() {
static int ledIndex = 0; // Indeks LED yang aktif
// Matikan semua LED
for (int i = 0; i < 11; i++) {
digitalWrite(ledPins[i], LOW);
}
// Nyalakan LED sesuai indeks
digitalWrite(ledPins[ledIndex], HIGH);
// Update indeks LED
ledIndex++;
if (ledIndex >= 11) {
ledIndex = 0; // Reset indeks jika sudah sampai akhir
}
}
void theaterChaseAnimation() {
static int chaseIndex = 0; // Indeks untuk LED yang sedang menyala
// Matikan semua LED
for (int i = 0; i < 11; i++) {
digitalWrite(ledPins[i], LOW);
}
// Nyalakan LED sesuai dengan indeks chase
for (int i = 0; i < 11; i += 3) {
digitalWrite(ledPins[(i + chaseIndex) % 11], HIGH); // Nyalakan LED ke-i
}
chaseIndex++; // Ubah indeks chase
if (chaseIndex >= 3) chaseIndex = 0; // Reset indeks chase
}