#include <Keypad.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED width, in pixels
#define SCREEN_HEIGHT 64 // OLED height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// LED pin definitions
const int ledPins[] = {10, 11, 12, 13, 3}; // 5 LED pins
const int numPins = sizeof(ledPins) / sizeof(ledPins[0]); // Correct number of LED pins
int currentPattern = 0;
int delayTime = 500; // Initial delay time (speed)
// Keypad setup
byte rowPins[4] = {2, 4, 5, 6};
byte colPins[4] = {7, 8, 9, 10};
// Keypad map: '1'-'5' to select patterns, '*' to increase speed, '#' to decrease speed
const char keys[4][4] = {
{'1', '2', '3', ' '},
{'4', '5', ' ', ' '},
{'*', '0', '#', ' '},
{' ', ' ', ' ', ' '}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, 4, 4);
void setup() {
Serial.begin(9600);
// Initialize OLED display
if (!display.begin(SSD1306_PAGEADDR, 0x3C)) {
Serial.println("SSD1306 allocation failed");
for (;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("LED Jukebox Ready!");
display.display();
delay(1000);
// Initialize LED pins
for (int i = 0; i < numPins; i++) {
pinMode(ledPins[i], OUTPUT);
}
}
void loop() {
// Read keypad input
char key = keypad.getKey();
if (key >= '1' && key <= '5') {
currentPattern = key - '1'; // Map '1'-'5' to pattern index 0-4
stopAllLEDs(); // Stop all LEDs before starting a new pattern
displayPattern(); // Display the new pattern and speed
}
else if (key == '*') {
// Increase speed (decrease delay time)
if (delayTime > 100) {
delayTime -= 100;
displayPattern();
}
}
else if (key == '#') {
// Decrease speed (increase delay time)
delayTime += 100;
displayPattern();
}
// Execute the current pattern
switch (currentPattern) {
case 0: allBlink(); break;
case 1: chasingBlink(); break;
case 2: alternatingBlink(); break;
case 3: reverseBlink(); break;
case 4: randomBlink(); break;
}
}
void displayPattern() {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Pattern:");
switch (currentPattern) {
case 0: display.println("All Blink"); break;
case 1: display.println("Chasing"); break;
case 2: display.println("Alternating"); break;
case 3: display.println("Reverse"); break;
case 4: display.println("Random"); break;
}
// Display current speed (delay time)
display.setCursor(0, 20);
display.print("Speed: ");
display.print(1000 / delayTime); // Display speed as "blinks per second"
display.display();
}
void stopAllLEDs() {
// Turn off all LEDs
for (int i = 0; i < numPins; i++) {
digitalWrite(ledPins[i], LOW);
}
}
void allBlink() {
for (int i = 0; i < numPins; i++) {
digitalWrite(ledPins[i], HIGH);
}
delay(delayTime); // blink all at once
for (int i = 0; i < numPins; i++) {
digitalWrite(ledPins[i], LOW);
}
delay(delayTime); // delay to control blink speed
}
void chasingBlink() {
for (int i = 0; i < numPins; i++) {
digitalWrite(ledPins[i], HIGH);
delay(delayTime);
digitalWrite(ledPins[i], LOW);
}
}
void alternatingBlink() {
for (int i = 0; i < numPins; i++) {
digitalWrite(ledPins[i], (i % 2 == 0) ? HIGH : LOW);
}
delay(delayTime);
}
void reverseBlink() {
for (int i = numPins - 1; i >= 0; i--) {
digitalWrite(ledPins[i], HIGH);
delay(delayTime);
digitalWrite(ledPins[i], LOW);
}
}
void randomBlink() {
for (int i = 0; i < numPins; i++) {
int randPin = random(0, numPins);
digitalWrite(ledPins[randPin], HIGH);
delay(delayTime);
digitalWrite(ledPins[randPin], LOW);
}
}