#include <Arduino.h>
#include <U8g2lib.h>
// initialization for the 128x64px OLED display
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
static const unsigned char volume_high_icon[] = {0x48,0x8c,0xaf,0xaf,0x8c,0x48};
static const unsigned char volume_muted_icon[] = {0x01,0x0a,0x0c,0x0b,0x17,0x2c,0x48};
void drawLevelsIndicators(const uint8_t x1, const uint8_t x2) {
static const uint8_t LEVEL_INDICATOR_MIN = 4;
static const uint8_t LEVEL_INDICATOR_MAX = 46;
for(uint8_t i = LEVEL_INDICATOR_MIN; i <= LEVEL_INDICATOR_MAX; i+=6)
u8g2.drawLine(x1, i, x2, i);
}
void drawSlider(const uint8_t knob_x, const uint8_t volume) {
static const uint8_t SLIDER_KNOB_BOTTOM = 42; // Y do knob em volume 0%
static const uint8_t SLIDER_KNOB_TOP = 5; // Y do knob em volume 100%
static const uint8_t SLIDER_BAR_BOTTOM = 45; // fundo fixo da barra
static const uint8_t SLIDER_BAR_TOP = 10; // topo da barra (volume 100%)
const uint8_t bar_x = knob_x + 4;
const uint8_t vol = (volume > 100) ? 100 : volume;
uint8_t knob_y = SLIDER_KNOB_BOTTOM - (vol * (SLIDER_KNOB_BOTTOM - SLIDER_KNOB_TOP)) / 100;
uint8_t bar_y = knob_y + 5;
if (bar_y > SLIDER_BAR_BOTTOM) bar_y = SLIDER_BAR_BOTTOM;
u8g2.drawRBox(knob_x, knob_y, 9, 4, 1);
u8g2.drawLine(bar_x, bar_y, bar_x, SLIDER_BAR_BOTTOM);
}
void slider_0() {
// SLIDER_0
u8g2.drawRFrame(11, 3, 5, 45, 2); // slider_frame_0
drawSlider(9, 50); // slider_0
// bottom indicator
u8g2.drawXBM(9, 53, 8, 6, volume_high_icon); // slider_0 unmuted
// Levels Indicators
drawLevelsIndicators(6, 7); // left
drawLevelsIndicators(19, 20); // right
}
void slider_1() {
// SLIDER_1
u8g2.drawRFrame(36, 3, 5, 45, 2); // slider_frame_1
drawSlider(34, 9); // slider_1
// bottom indicator
u8g2.drawStr(35, 58, "9%"); // slider_1 volume status
// Levels Indicators
drawLevelsIndicators(31, 32); // left
drawLevelsIndicators(44, 45); // right
}
void slider_2() {
// SLIDER_2
u8g2.drawRFrame(61, 3, 5, 45, 2); // slider_frame_2
drawSlider(59, 70); // slider_2
// bottom indicator
u8g2.drawStr(58, 58, "70%"); // slider_2 volume status
// Levels Indicators
drawLevelsIndicators(56, 57); // left
drawLevelsIndicators(69, 70); // right
}
void slider_3() {
// SLIDER_3
u8g2.drawRFrame(86, 3, 5, 45, 2); // slider_frame_3
drawSlider(84, 0); // slider_3
// bottom indicator
u8g2.drawXBM(85, 52, 7, 7, volume_muted_icon); // slider_3 muted
// Levels Indicators
drawLevelsIndicators(81, 82); // left
drawLevelsIndicators(94, 95); // right
}
void slider_4() {
// SLIDER_4
u8g2.drawRFrame(111, 3, 5, 45, 2); // slider_frame_4
drawSlider(109, 100); // slider_4
// botom indicator
u8g2.drawStr(107, 58, "100%"); // slider_4 volume status
// Levels Indicators
drawLevelsIndicators(106, 107); // left
drawLevelsIndicators(119, 120); // right
}
void setup() {
Serial.begin(9600);
u8g2.begin();
u8g2.clear();
u8g2.setFontMode(1);
u8g2.setBitmapMode(1);
u8g2.setFont(u8g2_font_4x6_tr);
}
void loop() {
u8g2.clearBuffer();
slider_0();
slider_1();
slider_2();
slider_3();
slider_4();
u8g2.sendBuffer();
}