#include <SPI.h>
#include <Wire.h>
#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>
#include <RotaryEncoder.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
RotaryEncoder encoder(A2, A3);
LiquidCrystal_I2C lcd(0x27, 16, 2);
uint8_t j = 0;
uint8_t midi_on_off = 0;
uint8_t modo = 0;
uint8_t pressionado = 0;
const uint8_t BT[] = {5, 6, 7, 2, 3, 4};
const uint8_t x[] = {8, 6, 13};
const uint8_t y[] = {0, 1, 1};
uint8_t xyi = 0;
uint8_t valor[] = {0, 0, 127};
int8_t supLim [3] = {77, 127, 127};
int8_t infLim [3] = {-1, 0, 0};
uint8_t banco_atual = 1;
uint8_t fx = 0;
uint8_t index = 0;
uint8_t Name[3] = {32, 32, 32};
uint8_t disp = 0;
long inicioTempo;
MIDI_CREATE_DEFAULT_INSTANCE();
//==================================================
// the 8 arrays that form each segment of the custom numbers
byte PRI[8] =
{
B00111,
B00101,
B00101,
B00111,
B00111,
B00111,
B00111,
B00111
};
byte SEG[8] =
{
B00111,
B00111,
B00111,
B00111,
B00111,
B00101,
B00101,
B00111
};
byte TER[8] =
{
B00111,
B00111,
B00111,
B00111,
B00111,
B00111,
B00111,
B00111
};
//====================================================
void inicio()
{
lcd.setCursor(0, 0);
lcd.print("MVS");
uint8_t i;
for (i = 0; i < 7; i++)
{
lcd.scrollDisplayRight();//Deslocamento para direita
delay(100);
}
for (i = 0; i < 3; i++)
{
delay(500);
lcd.clear();
delay(500);
lcd.setCursor(7, 0);
lcd.print("MVS");
}
for (i = 0; i < 9; i++) {
lcd.scrollDisplayRight();//Deslocamento para esquerda
delay(100);
}
lcd.clear();
}
void handleError(int8_t err)
{
digitalWrite(LED_BUILTIN, (err == 0) ? LOW : HIGH);
}
void setup() //*************************************************************************************************************
{
Serial.begin(31250);
//Serial.begin(9600);
MIDI.setHandleError(handleError);
MIDI.begin(MIDI_CHANNEL_OMNI);
Wire.begin();
/*
if(!lcd.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
*/
lcd.init(); // Inicializando o LCD
lcd.backlight(); // Ligando o BackLight do LCD
for (uint8_t i = 0; i < 6; i++) pinMode(BT[i], INPUT_PULLUP);
pinMode(8, INPUT);
for (uint8_t i = 0; i < 80; i++) EEPROM.write(i, 0);// ***** 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, 0);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 24; i++) EEPROM.write(400 + i, i + 65);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 24; i++) EEPROM.write(500 + i, 32);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 24; i++) EEPROM.write(600 + i, 32);// ***** 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);
//FOOT 5: P +
EEPROM.write(4, 27);
EEPROM.write(104, 1);
EEPROM.write(204, 1);
EEPROM.write(404, 80);
EEPROM.write(504, 32);
EEPROM.write(604, 43);
//FOOT 6: MOD
EEPROM.write(5, 29);
EEPROM.write(105, 0);
EEPROM.write(205, 127);
EEPROM.write(405, 77);
EEPROM.write(505, 79);
EEPROM.write(605, 68);
// assignes each segment a write number
lcd.createChar(1, PRI);
lcd.createChar(2, SEG);
lcd.createChar(3, TER);
//delay(100);
lcd.clear();
inicio();
showdisplay();
}
// BT ENVIA SINAL PARA PEDALEIRA
void Envia_Sinal() //*************************************************************************************************************
{
if (modo == 0 && pressionado == 0)
{
if (midi_on_off == 0)
{
MIDI.sendControlChange(EEPROM.read(index + j),
EEPROM.read(200 + index + j), 1);
midi_on_off = 1;
}
else
{
MIDI.sendControlChange(EEPROM.read(index + j),
EEPROM.read(100 + index + j), 1);
midi_on_off = 0;
}
lcd.clear();
lcd.setCursor(7, 0);
lcd.write(EEPROM.read(400 + index + j));//1° letra do nome
lcd.write(EEPROM.read(500 + index + j));//2° letra do nome
lcd.write(EEPROM.read(600 + index + j));//3° letra do nome
pressionado = 1;
inicioTempo = millis();
}
}
void showdisplay() //*************************************************************************************************************
{
lcd.clear();
if (banco_atual == 1)
{
lcd.setCursor(15, 0);
lcd.write(1);
lcd.setCursor(15, 1);
lcd.write(3);
}
if (banco_atual == 2)
{
lcd.setCursor(15, 0);
lcd.write(2);
lcd.setCursor(15, 1);
lcd.write(3);
}
if (banco_atual == 3)
{
lcd.setCursor(15, 0);
lcd.write(3);
lcd.setCursor(15, 1);
lcd.write(1);
}
if (banco_atual == 4)
{
lcd.setCursor(15, 0);
lcd.write(3);
lcd.setCursor(15, 1);
lcd.write(2);
}
lcd.setCursor(0, 1);
lcd.write(EEPROM.read(400 + index + 0));//1° letra do nome
lcd.write(EEPROM.read(500 + index + 0));//2° letra do nome
lcd.write(EEPROM.read(600 + index + 0));//3° letra do nome
lcd.setCursor(6, 1);
lcd.write(EEPROM.read(400 + index + 1));//1° letra do nome
lcd.write(EEPROM.read(500 + index + 1));//2° letra do nome
lcd.write(EEPROM.read(600 + index + 1));//3° letra do nome
lcd.setCursor(12, 1);
lcd.write(EEPROM.read(400 + index + 2));//1° letra do nome
lcd.write(EEPROM.read(500 + index + 2));//2° letra do nome
lcd.write(EEPROM.read(600 + index + 2));//3° letra do nome
lcd.setCursor(0, 0);
lcd.write(EEPROM.read(400 + index + 3));//1° letra do nome
lcd.write(EEPROM.read(500 + index + 3));//2° letra do nome
lcd.write(EEPROM.read(600 + index + 3));//3° letra do nome
lcd.setCursor(6, 0);
lcd.write(EEPROM.read(400 + index + 4));//1° letra do nome
lcd.write(EEPROM.read(500 + index + 4));//2° letra do nome
lcd.write(EEPROM.read(600 + index + 4));//3° letra do nome
lcd.setCursor(12, 0);
lcd.write(EEPROM.read(400 + index + 5));//1° letra do nome
lcd.write(EEPROM.read(500 + index + 5));//2° letra do nome
lcd.write(EEPROM.read(600 + index + 5));//3° letra do nome
disp = 1;
}
void showmenu() //*************************************************************************************************************
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("<<"));
lcd.setCursor(14, 0);
lcd.print(F(">>"));
lcd.setCursor(5, 0);
lcd.print(F("CC:"));
lcd.setCursor(0, 1);
lcd.print(F("Valor:"));
//lcd.setCursor(8, 1);
//lcd.print(F(">"));
lcd.setCursor(8, 0);
lcd.print(valor[0]);
lcd.setCursor(6, 1);
lcd.print(valor[1]);
lcd.setCursor(13, 1);
lcd.print(valor[2]);
lcd.setCursor(10, 1);
lcd.print(F(">"));
lcd.setCursor(x[xyi], y[xyi]);
lcd.blink();
}
void showSave()//*************************************************************************************************************
{
lcd.clear();
lcd.setCursor(14, 0);
lcd.print(F(">>"));
lcd.setCursor(0, 0);
lcd.print(F("<<"));
lcd.setCursor(4, 1);
lcd.print(F("Name:"));
lcd.setCursor(9, 1);
lcd.write(Name[0]);
lcd.write(Name[1]);
lcd.write(Name[2]);
lcd.setCursor(xyi + 9, 1);
lcd.blink();
}
void showoptions() //*************************************************************************************************************
{
lcd.clear();
char* banco;
if (banco_atual == 1)
{
banco = "A";
lcd.setCursor(15, 0);
lcd.write(1);
lcd.setCursor(15, 1);
lcd.write(3);
}
if (banco_atual == 2)
{
banco = "B";
lcd.setCursor(15, 0);
lcd.write(2);
lcd.setCursor(15, 1);
lcd.write(3);
}
if (banco_atual == 3)
{
banco = "C";
lcd.setCursor(15, 0);
lcd.write(3);
lcd.setCursor(15, 1);
lcd.write(1);
}
if (banco_atual == 4)
{
banco = "D";
lcd.setCursor(15, 0);
lcd.write(3);
lcd.setCursor(15, 1);
lcd.write(2);
}
lcd.setCursor(0, 1);
lcd.print(banco);
lcd.print(F("-1"));
lcd.setCursor(6, 1);
lcd.print(banco);
lcd.print(F("-2"));
lcd.setCursor(12, 1);
lcd.print(banco);
lcd.print(F("-3"));
lcd.setCursor(0, 0);
lcd.print(banco);
lcd.print(F("-4"));
lcd.setCursor(6, 0);
lcd.print(banco);
lcd.print(F("-5"));
lcd.setCursor(12, 0);
lcd.print(banco);
lcd.print(F("-6"));
}
void loop() //*************************************************************************************************************
{
static uint8_t pos = 0;
encoder.tick();
uint8_t newPos = encoder.getPosition();
unsigned long buttonPressTime;
if (digitalRead(BT[0]) == HIGH && digitalRead(BT[1]) == HIGH && digitalRead(BT[2]) == HIGH && digitalRead(BT[3]) == HIGH && digitalRead(BT[4]) == HIGH && digitalRead(BT[5]) == HIGH && digitalRead(8) == HIGH)
{
pressionado = 0;
}
for (uint8_t l = 0; l < 6; l++)
{
if (digitalRead(BT[l]) == LOW && pressionado == 0) // PINO 2
{
j = l;
}
}
//********************************* MODO 0 *********************************
if (modo == 0)
{
if (pressionado == 0)
{
if (digitalRead(BT[0]) == LOW || digitalRead(BT[1]) == LOW || digitalRead(BT[2]) == LOW || digitalRead(BT[3]) == LOW || digitalRead(BT[4]) == LOW || digitalRead(BT[5]) == LOW) // PINO 2
{
Envia_Sinal();
pressionado = 1;
disp = 0;
delay(200);
}
}
if (digitalRead(8) == LOW && pressionado == 0)
{
buttonPressTime = millis();
}
while (digitalRead(8) == LOW)
{
if (digitalRead(8) == LOW && millis() - buttonPressTime >= 3000 && pressionado == 0)
{
modo = 1;
pressionado = 1;
showoptions();
}
}
if (millis() - inicioTempo >= 1000 && disp == 0)
{
showdisplay();
}
// BANCO DOWN - MODO DE OPERAÇÃO
if (newPos > pos && banco_atual > 1)
{
banco_atual--;
index = ((banco_atual - 1) * 6);
showdisplay();
}
// BANCO UP - MODO DE OPERAÇÃO
if (newPos < pos && banco_atual < 4)
{
banco_atual++;
index = ((banco_atual - 1) * 6);
showdisplay();
}
}
//********************************* MODO 1 *********************************
if (modo == 1)
{
//TELA DE ESCOLHA DO BOTÃO A CONFIGURAR
if (digitalRead(BT[j]) == LOW && pressionado == 0)
{
fx = index + j;
valor[0] = EEPROM.read(fx);
valor[1] = EEPROM.read(100 + fx);
valor[2] = EEPROM.read(200 + fx);
xyi = 0;
modo = 2;
pressionado = 1;
showmenu();
delay(200);
}
// BANCO DOWN - MODO DE CONFIGURAÇÃO
if (newPos > pos && banco_atual > 1)
{
banco_atual--;
index = ((banco_atual - 1) * 6);
pressionado = 1;
showoptions();
}
// BANCO UP - MODO DE CONFIGURAÇÃO
if (newPos < pos && banco_atual < 4)
{
banco_atual++;
index = ((banco_atual - 1) * 6);
pressionado = 1;
showoptions();
}
//BT VOLTAR
if (digitalRead(8) == LOW && pressionado == 0)
{
modo = 0;
pressionado = 1;
showdisplay();
delay(200);
}
}
//********************************* MODO 2 *********************************
//BT scroll para baixo
if (modo == 2)
{
if (digitalRead(8) == LOW && pressionado == 0)
{
pressionado = 1;
xyi = (xyi + 1) % 3;
showmenu();
delay(200);
}
if (newPos < pos && valor[xyi] < supLim[xyi])
{
valor[xyi]++;
lcd.clear();
showmenu();
}
if (newPos > pos && valor[xyi] > infLim[xyi])
{
valor[xyi]--;
lcd.clear();
showmenu();
}
//BT SAVE
if (digitalRead(BT[5]) == LOW && pressionado == 0)
{
pressionado = 1;
Name[0] = EEPROM.read(400 + fx);
Name[1] = EEPROM.read(500 + fx);
Name[2] = EEPROM.read(600 + fx);
xyi = 0;
modo = 3;
showSave();
delay(200);
}
// BT VOLTAR
if (digitalRead(BT[3]) == LOW && pressionado == 0)
{
pressionado = 1;
modo = 1;
showoptions();
lcd.noBlink();
delay(200);
}
}
//********************************* MODO 3 *********************************
if (modo == 3) //32 a 122
{
if (newPos > pos)
{
Name[xyi]--;
if (Name[xyi] < 32) Name[xyi] = 122;
lcd.clear();
showSave();
}
if (newPos < pos)
{
Name[xyi]++;
if (Name[xyi] > 122) Name[xyi] = 32;
lcd.clear();
showSave();
}
//BT Seleciona
if (digitalRead(8) == LOW && pressionado == 0)
{
pressionado = 1;
xyi = (xyi + 1) % 3;
lcd.clear();
showSave();
delay(200);
}
//BT SAVE
if (digitalRead(BT[5]) == LOW && pressionado == 0)
{
for (uint8_t i = 0; i < 3; i++)
{
EEPROM.update(400 + i * 100 + fx, Name[i]);
EEPROM.update(i * 100 + fx, valor[i]);
}
modo = 0;
pressionado = 1;
lcd.noBlink();
showdisplay();
delay(200);
}
// BT VOLTAR
if (digitalRead(BT[3]) == LOW && pressionado == 0)
{
delay(200);
xyi = 0;
modo = 2;
pressionado = 1;
showmenu();
}
}
delay(5);
pos = newPos;
}