// '7', 30x30px
const uint16_t epd_bitmap_7 [] PROGMEM = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3800,
0x6000, 0x6000, 0x6000, 0x6000, 0x0800, 0x4000, 0x7000, 0x7800, 0x7000, 0x6800, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000,
0x6000, 0x6000, 0x5000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0xd800, 0xd800,
0xd800, 0xd800, 0x3800, 0xc800, 0xf000, 0xf800, 0xf800, 0xe000, 0xc800, 0xa800, 0x7800, 0x6800, 0x7000, 0xc800, 0xd800, 0xd800,
0xb000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9800, 0xf800, 0xf800, 0xf800, 0xf800,
0xc000, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xe800, 0xf800, 0xf800, 0xf800, 0xf800, 0xb800, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800,
0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0x9800, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800,
0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0x7000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800,
0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xd800, 0x4800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x9800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xc800, 0xc800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800,
0xa800, 0xd800, 0xf800, 0xf800, 0xf800, 0xa000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x9800, 0xf800, 0xf800, 0xf800, 0xf800, 0x9800, 0x0000, 0x0000, 0x3000, 0x7800, 0x9800, 0x9800, 0x5000, 0x8800, 0xf800,
0xf800, 0xf800, 0xe000, 0x5800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9800,
0xf800, 0xf800, 0xf800, 0xf800, 0x5000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0xb800, 0xf800, 0xf800, 0xf800, 0xf800,
0x7000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0xd800, 0xd800,
0xd800, 0xd800, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3800, 0xb800, 0xf800, 0xf800, 0xf800, 0xf800, 0xc000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3000, 0x5000, 0x5000, 0x5000, 0x5000,
0x0800, 0x0000, 0x0000, 0x0000, 0x4800, 0xb800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0x6800, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x5000, 0xc000, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xb000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0xc000,
0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0x4800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0xc800, 0xf800, 0xf800, 0xf800,
0xf800, 0xf800, 0xf800, 0xa800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800,
0xf800, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5000, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xd800, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0x9800, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x2800, 0xf000, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0x6800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000,
0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xf800, 0xf800,
0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xb800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb000, 0xf800, 0xf800, 0xf800, 0xf800,
0xf800, 0xf800, 0xf800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800,
0xf800, 0x7000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0xf800, 0x6000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9800, 0xa800, 0xa800, 0xa800, 0xa800, 0xa800, 0xa800, 0xa800, 0x4000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000
};
// Common
#include <SPI.h>
// OLED
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#define TFT_CS 10
#define TFT_RST 8
#define TFT_DC 9
#define OLED_HEIGHT 160
#define OLED_WIDTH 128
Adafruit_ST7735 oled = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
// Keypad
#include <Keypad.h>
const int ROW_NUM = 4;
const int COLUMN_NUM = 4;
char keys[ROW_NUM][COLUMN_NUM] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pin_rows[ROW_NUM] = {7, 6, 5, 4};
byte pin_column[COLUMN_NUM] = {3, 2, 1, 0};
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);
// UI
#define UI_RECT_Y 62
#define UI_RECT_WIDTH 36
#define UI_RECT_R 2
int UI_RECT_SPACE = (OLED_WIDTH - (3 * UI_RECT_WIDTH)) / 4;
int UI_RECT0_X = UI_RECT_SPACE;
int UI_RECT1_X = UI_RECT0_X + UI_RECT_WIDTH + UI_RECT_SPACE;
int UI_RECT2_X = UI_RECT1_X + UI_RECT_WIDTH + UI_RECT_SPACE;
int UI_RECTS[] = {UI_RECT0_X, UI_RECT1_X, UI_RECT2_X};
#define UI_ITEM_WIDTH 30
// Logic
int balance = 1500;
void setup(void) {
Serial.begin(9600);
Serial.println("setup");
SPI.begin();
// TODO: blacktab, redtab, greentab
oled.initR(INITR_BLACKTAB);
Serial.println("done");
delay(1000);
printUI();
}
void loop() {
char key = keypad.getKey();
Serial.println(key);
if (key == '*') {
Serial.println("Generating...");
int RND_ITEMS = 4;
balance = balance - 20;
printUI();
int rnds[3] = {random(0,RND_ITEMS), random(0,RND_ITEMS), random(0,RND_ITEMS)};
for (int i = 0; i < 3; i++) {
int rnd = rnds[i];
if (rnd == 0) {
printCircle(i);
} else if (rnd == 1) {
printRectangle(i);
} else if (rnd == 2) {
printTriangle(i);
} else if (rnd == 3) {
print7(i);
}
}
if (rnds[0] == rnds[1] && rnds[0] == rnds[2]) {
printWin();
}
} else if (key == '7') {
balance = 1500;
printUI();
} else if (key == '1') {
printAuthors();
}
Serial.println(key);
delay(5);
}
void printUI() {
oled.fillScreen(ST7735_BLACK);
oled.setCursor(0, 0);
oled.setTextColor(ST77XX_YELLOW);
oled.setTextSize(1);
oled.print("SLOT MACHINE");
oled.setCursor(90, 0);
oled.print(balance);
oled.drawRoundRect(UI_RECT0_X, UI_RECT_Y, UI_RECT_WIDTH, UI_RECT_WIDTH, UI_RECT_R, ST77XX_WHITE);
oled.drawRoundRect(UI_RECT1_X, UI_RECT_Y, UI_RECT_WIDTH, UI_RECT_WIDTH, UI_RECT_R, ST77XX_WHITE);
oled.drawRoundRect(UI_RECT2_X, UI_RECT_Y, UI_RECT_WIDTH, UI_RECT_WIDTH, UI_RECT_R, ST77XX_WHITE);
}
void printRectangle(int position) {
int x0 = UI_RECTS[position] + 3;
int y0 = UI_RECT_Y + 3;
oled.fillRect(x0, y0, UI_ITEM_WIDTH, UI_ITEM_WIDTH, ST77XX_RED);
}
void printCircle(int position) {
int radius = UI_ITEM_WIDTH / 2;
int x0 = UI_RECTS[position] + 3 + radius;
int y0 = UI_RECT_Y + 3 + radius;
oled.fillCircle(x0, y0, radius, ST77XX_GREEN);
}
void printTriangle(int position) {
int x0 = UI_RECTS[position] + 3;
int y0 = UI_RECT_Y + 3;
int x1 = x0 + UI_ITEM_WIDTH / 2;
int y1 = y0 + UI_ITEM_WIDTH;
int x2 = x0 + UI_ITEM_WIDTH;
int y2 = y0;
oled.fillTriangle(x0, y0, x1, y1, x2, y2, ST77XX_BLUE);
}
void print7(int position) {
int x0 = UI_RECTS[position] + 3;
int y0 = UI_RECT_Y + 3;
oled.drawRGBBitmap(x0, y0, epd_bitmap_7, UI_ITEM_WIDTH, UI_ITEM_WIDTH);
}
void printWin() {
int x0 = 0;
int y0 = 140;
oled.setCursor(x0, y0);
oled.setTextColor(ST77XX_BLUE);
oled.setTextSize(2);
oled.print("YO'VE WON!");
// TODO; print line
balance = balance + 5000;
}
void printAuthors() {
Serial.println("test");
oled.fillScreen(ST7735_BLACK);
oled.setCursor(0, 0);
oled.setTextColor(ST77XX_BLUE);
oled.setTextSize(1);
oled.println("Paul Braun\n");
oled.println("Dennis Baetzel\n");
oled.println("Bernd Storath");
}