#include <SPI.h>
#include <Wire.h>
#include <RotaryEncoder.h>
#include <EEPROM.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSansBold9pt7b.h>
Adafruit_SSD1306 display(128, 64, &Wire, -1);
RotaryEncoder encoder(26, 27);
uint8_t j = 0;
uint8_t l = 0;
uint8_t ligado[4] = {1};
uint8_t midi_on_off[16] = {0};
uint8_t modo = 0;
uint8_t pressionado = 0;
const uint8_t BT[] = {4, 0, 2, 15};
const uint8_t LED[] = {32, 33, 25, 12};
int8_t configline[4][3] = {0};
int8_t CC_lim [2] = {-1, 77};
uint8_t position[2] = {0};
uint8_t modPosition = 0;
uint8_t page = 0;
uint8_t banco_atual = 1;
uint8_t fx = 0;
uint8_t index_ = 0;
uint8_t selecionado[2] = {0};
uint8_t Name[3] = {32, 32, 32};
uint8_t disp = 0;
uint8_t limiteFx[2] = {15 , 4};
long inicioTempo;
void setup() //*************************************************************************************************************
{
//Serial.begin(31250);
Serial.begin(115200);
//MIDI.setHandleError(handleError);
Wire.begin();
EEPROM.begin(1024);
/*
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
*/
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
attachInterrupt(digitalPinToInterrupt(26), updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(27), updateEncoder, CHANGE);
for (uint8_t i = 0; i < 4; i++)
{
pinMode(BT[i], INPUT_PULLUP);
pinMode(LED[i], OUTPUT);
}
pinMode(14, INPUT_PULLUP);
for (uint8_t i = 0; i < 80; i++) EEPROM.write(i, 10);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 80; i++) EEPROM.write(100 + i, 0);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 80; i++) EEPROM.write(200 + i, 127);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 16; i++) EEPROM.write(400 + i, i + 49);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 16; i++) EEPROM.write(500 + i, 105);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 16; i++) EEPROM.write(600 + i, 110);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
//FOOT 1: SN1
EEPROM.write(0, 25);
EEPROM.write(100, 1);
EEPROM.write(200, 1);
EEPROM.write(400, 83);
EEPROM.write(500, 78);
EEPROM.write(600, 49);
//FOOT 2: SN2
EEPROM.write(1, 25);
EEPROM.write(101, 2);
EEPROM.write(201, 2);
EEPROM.write(401, 83);
EEPROM.write(501, 78);
EEPROM.write(601, 50);
//FOOT 3: SN3
EEPROM.write(2, 25);
EEPROM.write(102, 3);
EEPROM.write(202, 3);
EEPROM.write(402, 83);
EEPROM.write(502, 78);
EEPROM.write(602, 51);
//FOOT 4: P -
EEPROM.write(3, 26);
EEPROM.write(103, 1);
EEPROM.write(203, 1);
EEPROM.write(403, 80);
EEPROM.write(503, 32);
EEPROM.write(603, 45);
EEPROM.commit();
showmenu();
}
// BT ENVIA SINAL PARA PEDALEIRA
void updateEncoder() {
encoder.tick(); // Atualiza o estado do encoder dentro da interrupção
}
void showmenu() //*************************************************************************************************************
{
uint8_t cursor[4] = {0};
//display.setFont(&FreeSans9pt7b);
display.setFont(&FreeSans9pt7b);
display.setTextSize(2);
display.setCursor(0, 33);
display.print(page + 1);
cursor[0] = (25 - display.getCursorX()) / 2;
display.setTextSize(1);
for (uint8_t i = 1; i < 4; i++)
{
display.setCursor(0, 33);
display.print(configline[page][i - 1]);
cursor[i] = 120 - display.getCursorX();
}
display.setTextColor(WHITE);
display.setFont(&FreeSansBold9pt7b);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 14);
display.print(F("BACK"));
display.setCursor(76, 14);
display.print(F("NEXT"));
display.display();
display.drawRect(124, 20, 4, 44, WHITE);
display.fillRect(124, 20 + ceil(2.8333 * position[0]), 4, 8, WHITE);
display.setFont(&FreeSans9pt7b);
display.setTextSize(2);
/*
display.setCursor(cursor[0], 52);
display.print(page + 1);
*/
display.setTextSize(1);
display.drawRect(2, 30, 26, 12, WHITE);
if (ligado[page] == 1)
{
display.fillRect(2, 30, 13, 12, WHITE);
display.setCursor(3, 40);
display.setTextColor(BLACK);
display.print("s ");
display.setTextColor(WHITE);
display.print("n");
}
else
{
display.fillRect(15, 30, 13, 12, WHITE);
display.setCursor(3, 40);
display.setTextColor(WHITE);
display.print("s ");
display.setTextColor(BLACK);
display.print("n");
}
if (selecionado[0] == 0)
{
if (modPosition == 0)
{
display.drawRect(0, 28, 30, 16, WHITE);
}
else
{
display.drawRoundRect(28, 16 + (modPosition - 1) * 15, 95, 17, 3, WHITE);
}
display.setTextColor(WHITE);
display.setCursor(30, 30);
display.print(F("CC#"));
display.setCursor(70, 30);
display.print(F(":"));
display.setCursor(cursor[1], 30);
display.print(configline[page][0]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 45);
display.print(F("Start"));
display.setCursor(70, 45);
display.print(F(":"));
display.setCursor(cursor[2], 45);
display.print(configline[page][1]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 60);
display.print(F("End"));
display.setCursor(70, 60);
display.print(F(":"));
display.setCursor(cursor[3], 60);
display.print(configline[page][2]);
display.display();
}
if (selecionado[0] == 1)
{
if (modPosition == 0)
{
display.drawRoundRect(28, 16 + (modPosition - 1) * 15, 95, 17, 3, WHITE);
display.setTextColor(WHITE);
display.setCursor(30, 30);
display.print(F("CC#"));
display.setCursor(70, 30);
display.print(F(":"));
display.setCursor(cursor[1], 30);
display.print(configline[page][0]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 45);
display.print(F("Start"));
display.setCursor(70, 45);
display.print(F(":"));
display.setCursor(cursor[2], 45);
display.print(configline[page][1]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 60);
display.print(F("End"));
display.setCursor(70, 60);
display.print(F(":"));
display.setCursor(cursor[3], 60);
display.print(configline[page][2]);
display.display();
}
if (modPosition == 1)
{
display.fillRoundRect(28, 16, 98, 17, 3, WHITE);
display.setTextColor(BLACK);
display.setCursor(30, 30);
display.print(F("CC#"));
display.setCursor(70, 30);
display.print(F(":"));
display.setCursor(cursor[1], 30);
display.print(configline[page][0]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 45);
display.print(F("Start"));
display.setCursor(70, 45);
display.print(F(":"));
display.setCursor(cursor[2], 45);
display.print(configline[page][1]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 60);
display.print(F("End"));
display.setCursor(70, 60);
display.print(F(":"));
display.setCursor(cursor[3], 60);
display.print(configline[page][2]);
display.display();
}
if (modPosition == 2)
{
display.setTextColor(WHITE);
display.setCursor(30, 30);
display.print(F("CC#"));
display.setCursor(70, 30);
display.print(F(":"));
display.setCursor(cursor[1], 30);
display.print(configline[page][0]);
display.display();
display.fillRoundRect(28, 31, 98, 17, 3, WHITE);
display.setTextColor(BLACK);
display.setCursor(30, 45);
display.print(F("Start"));
display.setCursor(70, 45);
display.print(F(":"));
display.setCursor(cursor[2], 45);
display.print(configline[page][1]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 60);
display.print(F("End"));
display.setCursor(70, 60);
display.print(F(":"));
display.setCursor(cursor[3], 60);
display.print(configline[page][2]);
display.display();
}
if (modPosition == 3)
{
display.setTextColor(WHITE);
display.setCursor(30, 30);
display.print(F("CC#"));
display.setCursor(70, 30);
display.print(F(":"));
display.setCursor(cursor[1], 30);
display.print(configline[page][0]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 45);
display.print(F("Start"));
display.setCursor(70, 45);
display.print(F(":"));
display.setCursor(cursor[2], 45);
display.print(configline[page][1]);
display.display();
display.fillRoundRect(28, 46, 98, 17, 3, WHITE);
display.setTextColor(BLACK);
display.setCursor(30, 60);
display.print(F("End"));
display.setCursor(70, 60);
display.print(F(":"));
display.setCursor(cursor[3], 60);
display.print(configline[page][2]);
display.display();
}
}
display.display();
}
void loop() //*************************************************************************************************************
{
static uint8_t pos = 0;
encoder.tick();
uint8_t newPos = encoder.getPosition();
unsigned long buttonPressTime;
if (selecionado[0] == 0)
{
if (newPos > pos && position[0] > 0)
{
position[0] = position[0] - 1;
modPosition = position[0] % 4;
page = floor(position[0] / 4);
if (ligado[page] == 0 && page > 0)
{
limiteFx[1] = page;
limiteFx[0] = position[0];
}
else {
limiteFx[1] = 4;
limiteFx[0] = 15;
}
display.clearDisplay();
showmenu();
}
//BT scroll para cima
else if (newPos < pos && position[0] < limiteFx[0])
{
position[0] = position[0] + 1;
modPosition = position[0] % 4;
page = floor(position[0] / 4);
if (ligado[page] == 0 && page > 0)
{
limiteFx[1] = page;
limiteFx[0] = position[0];
}
else {
limiteFx[1] = 4;
limiteFx[0] = 15;
}
display.clearDisplay();
showmenu();
}
else if (digitalRead(14) == LOW)
{
if (modPosition == 0)
{
ligado[page] = !ligado[page];
selecionado[0] = 0;
pressionado = 1;
showmenu();
delay(200);
}
else
{
selecionado[0] = 1;
pressionado = 1;
showmenu();
delay(200);
}
if (ligado[page] == 0 && page > 0)
{
limiteFx[1] = page;
limiteFx[0] = position[0];
}
else {
limiteFx[1] = 4;
limiteFx[0] = 15;
}
}
}
else
{
if (newPos > pos && configline[page][modPosition] > CC_lim[0])
{
configline[page][modPosition] = configline[page][modPosition] - 1;
if (ligado[page] == 0 && page > 0)
{
limiteFx[1] = page;
limiteFx[0] = position[0];
}
else {
limiteFx[1] = 4;
limiteFx[0] = 15;
}
display.clearDisplay();
showmenu();
}
else if (newPos < pos && configline[page][modPosition] < CC_lim[1])
{
configline[page][modPosition] = configline[page][modPosition] + 1;
if (ligado[page] == 0 && page > 0)
{
limiteFx[1] = page;
limiteFx[0] = position[0];
}
else {
limiteFx[1] = 4;
limiteFx[0] = 15;
}
display.clearDisplay();
showmenu();
}
else if (digitalRead(14) == LOW)
{
if (modPosition == 0)
{
ligado[page] = !ligado[page];
selecionado[0] = 1;
pressionado = 1;
showmenu();
delay(200);
}
else
{
selecionado[0] = 0;
pressionado = 1;
showmenu();
delay(200);
}
if (ligado[page] == 0 && page > 0)
{
limiteFx[1] = page;
limiteFx[0] = position[0];
}
else {
limiteFx[1] = 4;
limiteFx[0] = 15;
}
}
}
if (modPosition == 1)
{
CC_lim[1] = 77;
CC_lim[0] = -1;
}
else
{
CC_lim[1] = 127;
CC_lim[0] = 0;
}
//BT SAVE
if (digitalRead(BT[3]) == LOW)
{
uint8_t u = 0;
for (uint8_t i = 0; i < 4; i++)
{
EEPROM.write(u + 0 + fx, configline[i][0]);
EEPROM.write(u + 100 + fx, configline[i][1]);
EEPROM.write(u + 200 + fx, configline[i][2]);
u = u + 20;
}
EEPROM.commit();
Name[0] = EEPROM.read(400 + fx);
Name[1] = EEPROM.read(500 + fx);
Name[2] = EEPROM.read(600 + fx);
selecionado[1] = 0;
position[1] = 0;
modPosition = position[0] % 4;
modo = 3;
pressionado = 1;
delay(200);
}
// BT VOLTAR
if (digitalRead(BT[0]) == LOW)
{
modo = 1;
pressionado = 1;
delay(200);
}
pos = newPos;
delay(10);
}