#include <U8g2lib.h>
#include "Button_SL.hpp"
struct DicePip {
uint16_t xPos;
uint16_t yPos;
uint16_t radius;
};
DicePip dicePips[] {
{112, 14, 8},
{112, 50, 8},
{60, 14, 8},
{60, 32, 8},
{60, 50, 8},
{14, 14, 8},
{14, 50, 8}
};
byte pipVals[6][6] {
{3},
{0, 6},
{0, 3, 6},
{0, 1, 5, 6},
{0, 1, 3, 5, 6},
{0, 1, 2, 4, 5, 6}
};
constexpr byte MIN_VALUE {1};
constexpr byte MAX_VALUE {6};
constexpr byte MAX_ANIMATION_COUNT {24};
constexpr byte ANIMATIONDELAY_MS {50};
uint8_t BUTTON_PIN {2};
// OLED initialisieren
// Controller: SH1106 oder SSD1306
// es wird der Page buffer mode verwendet
// 1,3 Zoll SH1106
// U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// 0,96 Zoll SSD1306
U8G2_SSD1306_128X64_NONAME_2_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
// Bounce initialisieren
Btn::Button diceBtn(BUTTON_PIN);
void drawPips(uint8_t number) {
u8g2.firstPage();
do {
u8g2.drawRFrame(0, 0, 128, 64, 5);
uint8_t idx = number - 1;
for (uint8_t i = 0; i < number; ++i) {
u8g2.drawDisc(dicePips[pipVals[idx][i]].xPos,
dicePips[pipVals[idx][i]].yPos,
dicePips[pipVals[idx][i]].radius);
}
} while (u8g2.nextPage());
}
void showHint() {
u8g2.setDisplayRotation(U8G2_R1);
u8g2.setFlipMode(1); // enable 180 degree rotation
u8g2.firstPage();
do {
u8g2.drawStr(2, 20, "Start");
u8g2.drawStr(2, 50, "->");
u8g2.drawStr(2, 80, "Taste");
} while (u8g2.nextPage());
u8g2.setDisplayRotation(U8G2_R0);
u8g2.setFlipMode(1); // rotate back
}
void setup() {
// Assign the button to the bounce object
diceBtn.begin();
u8g2.begin();
u8g2.setDrawColor(1); // Color white
u8g2.clearDisplay(); // Position 90 degree
//u8g2.setFont(u8g2_font_t0_22_tr);
u8g2.setFont(u8g2_font_t0_17_tr);
showHint();
}
void loop() {
if (diceBtn.tick()) {
// Dice effect: Display random numbers in quick succession.
// Not very fast due to the page buffer mode
uint8_t counter {1};
for (uint8_t i = 0; i < MAX_ANIMATION_COUNT; ++i) {
drawPips(counter);
counter = (counter < MAX_VALUE) ? counter + 1 : 1;
delay(ANIMATIONDELAY_MS);
}
randomSeed(millis());
drawPips(static_cast<uint8_t>(random(MIN_VALUE, (MAX_VALUE+1))));
}
}