#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED display width and height
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Define OLED reset pin
#define OLED_RESET -1
// Define I2C address for the OLED display
#define OLED_I2C_ADDRESS 0x3C
// Create display object
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Define PIR sensor pin
#define PIR_SENSOR_PIN 14
// Define LED pin
#define LED_PIN 18
// Slot machine symbols
const char* symbols[] = { "C", "L", "M", "B", "W", "A", "O" };
void setup() {
pinMode(PIR_SENSOR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW); // Ensure the LED is off initially
Serial.begin(115200);
// Initialize the display
if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Slot Machine");
display.display();
delay(2000);
}
void loop() {
// Check if motion is detected
if(digitalRead(PIR_SENSOR_PIN) == HIGH) {
spinSlots();
delay(3000); // Delay to prevent multiple triggers in quick succession
}
}
void drawSymbol(int x, int y, int size, const char* symbol) {
display.setTextSize(size);
int16_t x1, y1;
uint16_t w, h;
display.getTextBounds(symbol, 0, 0, &x1, &y1, &w, &h);
display.setCursor(x - w / 2, y - h / 2);
display.print(symbol);
}
void spinSlots() {
int finalSymbols[3];
int topSymbols[3];
int bottomSymbols[3];
int numSymbols = sizeof(symbols) / sizeof(symbols[0]);
for (int i = 0; i < 3; i++) {
finalSymbols[i] = random(0, numSymbols);
topSymbols[i] = (finalSymbols[i] + 1) % numSymbols;
bottomSymbols[i] = (finalSymbols[i] + numSymbols - 1) % numSymbols;
}
for (int j = 0; j < 20; j++) { // Adjust the number of iterations for longer spin
display.clearDisplay();
// Draw separator lines
display.drawLine(42, 0, 42, SCREEN_HEIGHT, SSD1306_WHITE);
display.drawLine(84, 0, 84, SCREEN_HEIGHT, SSD1306_WHITE);
for (int i = 0; i < 3; i++) {
int mainSymbol = random(0, numSymbols);
int topSymbol = (mainSymbol + 1) % numSymbols;
int bottomSymbol = (mainSymbol + numSymbols - 1) % numSymbols;
drawSymbol(i * 42 + 21, 20, 1, symbols[topSymbol]); // Smaller top symbol
drawSymbol(i * 42 + 21, 40, 2, symbols[mainSymbol]); // Main symbol
drawSymbol(i * 42 + 21, 60, 1, symbols[bottomSymbol]); // Smaller bottom symbol
if (j == 19) { // Save the final symbols on the last iteration
finalSymbols[i] = mainSymbol;
topSymbols[i] = topSymbol;
bottomSymbols[i] = bottomSymbol;
}
}
display.display();
delay(100); // Adjust the delay for animation speed
}
// Display the final symbols and check for jackpot
bool jackpot = (finalSymbols[0] == finalSymbols[1]) && (finalSymbols[1] == finalSymbols[2]);
for (int k = 0; k < (jackpot ? 6 : 1); k++) { // Flicker effect if jackpot
display.clearDisplay();
// Draw separator lines
display.drawLine(42, 0, 42, SCREEN_HEIGHT, SSD1306_WHITE);
display.drawLine(84, 0, 84, SCREEN_HEIGHT, SSD1306_WHITE);
for (int i = 0; i < 3; i++) {
drawSymbol(i * 42 + 21, 20, 1, symbols[topSymbols[i]]); // Smaller top symbol
drawSymbol(i * 42 + 21, 40, 2, symbols[finalSymbols[i]]); // Main symbol
drawSymbol(i * 42 + 21, 60, 1, symbols[bottomSymbols[i]]); // Smaller bottom symbol
}
if (jackpot && (k % 2 == 0)) {
display.setCursor(15, 0);
display.setTextSize(2);
display.println("JACKPOT!");
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
display.display();
delay(200); // Flicker delay
}
digitalWrite(LED_PIN, LOW); // Ensure the LED is off after the flicker effect
}
Loading
ssd1306
ssd1306