#include <Keypad.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
const byte ROWS = 4; // four rows
const byte COLS = 4; // four columns
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; // connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; // connect to the column pinouts of the keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
const int numLEDs = 4;
const int ledPins[] = {10, 11, 12, 13};
int currentPattern = 0;
int delayTime = 50;
void setup() {
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
for (int i = 0; i < numLEDs; i++) {
pinMode(ledPins[i], OUTPUT);
}
displayMenu();
}
void loop() {
char key = keypad.getKey();
if (key) {
Serial.print("Key Pressed: ");
Serial.println(key);
switch (key) {
case '1': currentPattern = 0; break;
case '2': currentPattern = 1; break;
case '3': currentPattern = 2; break;
case '4': currentPattern = 3; break;
case '5': currentPattern = 4; break;
case 'A': delayTime = max(50, delayTime - 50); break;
case 'B': delayTime += 50; break;
}
displayPattern();
}
switch (currentPattern) {
case 0: allBlink(); break;
case 1: chasingBlink(); break;
case 2: alternatingBlink(); break;
case 3: reverseBlink(); break;
case 4: randomBlink(); break;
}
}
void displayMenu() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Select Pattern:");
display.println("1: All Blink");
display.println("2: Chasing");
// display.println("3: Alternating");
display.println("4: Reverse");
display.println("5: Random");
display.display();
}
void displayPattern() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("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.print("Speed: ");
display.print(delayTime);
display.println("ms");
display.display();
}
void allBlink() {
for (int i = 0; i < numLEDs; i++) digitalWrite(ledPins[i], HIGH);
delay(delayTime);
for (int i = 0; i < numLEDs; i++) digitalWrite(ledPins[i], LOW);
delay(delayTime);
}
void chasingBlink() {
for (int i = 0; i < numLEDs; i++) {
digitalWrite(ledPins[i], HIGH);
delay(delayTime);
digitalWrite(ledPins[i], LOW);
}
}
void alternatingBlink() {
for (int i = 0; i < numLEDs; i++) digitalWrite(ledPins[i], i % 2 == 0 ? HIGH : LOW);
delay(delayTime);
for (int i = 0; i < numLEDs; i++) digitalWrite(ledPins[i], i % 2 == 0 ? LOW : HIGH);
delay(delayTime);
}
void reverseBlink() {
for (int i = numLEDs - 1; i >= 0; i--) {
digitalWrite(ledPins[i], HIGH);
delay(100);
digitalWrite(ledPins[i], LOW);
}
}
void randomBlink() {
for (int i = 0; i < numLEDs; i++) {
int randPin = random(0, numLEDs);
digitalWrite(ledPins[randPin], HIGH);
delay(delayTime);
digitalWrite(ledPins[randPin], LOW);
}
}