#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int buttonPin = 9;
const int potPin = A0;
int prevMaxValue = 0;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
// Show startup message
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(5, 25);
display.println("DiceRoller");
display.display();
delay(2000); // Show message for 2 seconds
randomSeed(analogRead(0)); // Seed for random number generation
}
void loop() {
int potValue = analogRead(potPin);
int maxValue = map(potValue, 0, 1023, 2, 100); // Max dice value (2 to 20)
if (maxValue != prevMaxValue) {
prevMaxValue = maxValue;
displayMaxValue(maxValue);
}
if (digitalRead(buttonPin) == LOW) {
displayRollingSquare(); // Simulate rolling
int diceRoll = random(1, maxValue + 1); // Roll the dice
displayDice(diceRoll); // Show result
delay(1000);
clearDisplay();
}
}
void displayRollingSquare() {
display.clearDisplay();
// Coordinates for a tilted square (diamond shape)
int cx = SCREEN_WIDTH / 2;
int cy = SCREEN_HEIGHT / 2;
int size = 20;
display.drawLine(cx, cy - size, cx + size, cy, WHITE); // Top-right
display.drawLine(cx + size, cy, cx, cy + size, WHITE); // Bottom-right
display.drawLine(cx, cy + size, cx - size, cy, WHITE); // Bottom-left
display.drawLine(cx - size, cy, cx, cy - size, WHITE); // Top-left
display.display();
delay(1500); // Show the tilted square for 1.5 seconds
}
void displayDice(int number) {
display.clearDisplay();
int textSize = 4;
int charWidth = 6 * textSize;
int numDigits = (number < 10) ? 1 : 2;
int textWidth = charWidth * numDigits;
int x = (SCREEN_WIDTH - textWidth) / 2;
int y = (SCREEN_HEIGHT - 8 * textSize) / 2;
display.setTextSize(textSize);
display.setTextColor(WHITE);
display.setCursor(x, y);
display.print(number);
display.display();
}
void displayMaxValue(int maxVal) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 20);
display.print("Max: ");
display.print(maxVal);
display.display();
}
void clearDisplay() {
display.clearDisplay();
display.display();
}