#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};
const int NUM_SLIDERS = 5;
const int analogInputs[NUM_SLIDERS] = {A0, A1, A2, A3, A4};
const int SLIDER_MAX_VALUE = 4095;
int analogSliderValues[NUM_SLIDERS];
void setup() {
for (int i = 0; i < NUM_SLIDERS; i++)
pinMode(analogInputs[i], INPUT);
Serial.begin(9600);
u8g2.begin();
u8g2.clear();
u8g2.setFontMode(1);
u8g2.setBitmapMode(1);
u8g2.setFont(u8g2_font_4x6_tr);
}
void loop() {
updateSliderValues();
printSerialSliderValues(); // Actually send data (all the time)
u8g2.clearBuffer();
sendSliderValues();
u8g2.sendBuffer();
}
void updateSliderValues() {
for (int i = 0; i < NUM_SLIDERS; i++)
analogSliderValues[i] = analogRead(analogInputs[i]);
}
void printSerialSliderValues() {
String builtString = String("");
for (int i = 0; i < NUM_SLIDERS; i++) {
builtString += String((int)analogSliderValues[i]);
if (i < NUM_SLIDERS - 1) builtString += String("|");
}
Serial.println(builtString);
}
void sendSliderValues() {
for(uint8_t i = 0; i < NUM_SLIDERS; i++) {
switch (i) {
case 0:
slider_0(analogSliderValues[i]);
break;
case 1:
slider_1(analogSliderValues[i]);
break;
case 2:
slider_2(analogSliderValues[i]);
break;
case 3:
slider_3(analogSliderValues[i]);
break;
case 4:
slider_4(analogSliderValues[i]);
break;
}
}
}
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(const int slider_value) {
const uint8_t volume = constrain(map(slider_value, 0, SLIDER_MAX_VALUE, 0, 100), 0, 100);
// SLIDER_0
u8g2.drawRFrame(11, 3, 5, 45, 2); // slider_frame_0
drawSlider(9, volume); // 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(const int slider_value) {
const uint8_t volume = constrain(map(slider_value, 0, SLIDER_MAX_VALUE, 0, 100), 0, 100);
// SLIDER_1
u8g2.drawRFrame(36, 3, 5, 45, 2); // slider_frame_1
drawSlider(34, volume); // 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(const int slider_value) {
const uint8_t volume = constrain(map(slider_value, 0, SLIDER_MAX_VALUE, 0, 100), 0, 100);
// SLIDER_2
u8g2.drawRFrame(61, 3, 5, 45, 2); // slider_frame_2
drawSlider(59, volume); // 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(const int slider_value) {
const uint8_t volume = constrain(map(slider_value, 0, SLIDER_MAX_VALUE, 0, 100), 0, 100);
// SLIDER_3
u8g2.drawRFrame(86, 3, 5, 45, 2); // slider_frame_3
drawSlider(84, volume); // 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(const int slider_value) {
const uint8_t volume = constrain(map(slider_value, 0, SLIDER_MAX_VALUE, 0, 100), 0, 100);
// SLIDER_4
u8g2.drawRFrame(111, 3, 5, 45, 2); // slider_frame_4
drawSlider(109, volume); // slider_4
// botom indicator
u8g2.drawStr(107, 58, "100%"); // slider_4 volume status
// Levels Indicators
drawLevelsIndicators(106, 107); // left
drawLevelsIndicators(119, 120); // right
}