#include <EEPROM.h>
#include <Keypad.h>
const byte rows = 3;
const byte cols = 3;
char keys[rows][cols] = {
{'a','f','k'},
{'b','g','l'},
{'c','h','m'}
};
byte rowPins[rows] = {2,3,4}; /* buttons or momentary switches */
byte colPins[cols] = {5,6,7}; /* rotary switch - pin 7 is read/use, pin 5 is program/choose effects, pin 6 is save to a preset. */
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
int OneRelayPin[3] = {8,9,10}; /* pin 1 on relay - reset/default has pin 1 at 0v - RED */
int TenRelayPin[3] = {11,12,13}; /* pin 10 on relay - reset/default has pin 10 at 5v - BLUE */
int presetLEDPin[3] = {A0,A1,A2}; /* shows which preset is engaged - GREEN */
int effectLEDPin[3] = {A3,A4,A5}; /* shows which effects are engaged - YELLOW */
byte midiChannel = 0;
int numberOfPedal = 3;
/******************************************************/
void setup()
{
for(int cc=0; cc<numberOfPedal; cc++) /* setup device */
{
pinMode(OneRelayPin[cc], OUTPUT);
pinMode(TenRelayPin[cc], OUTPUT);
pinMode(presetLEDPin[cc], OUTPUT);
pinMode(effectLEDPin[cc], OUTPUT);
digitalWrite(OneRelayPin[cc], LOW);
digitalWrite(TenRelayPin[cc], LOW);
digitalWrite(presetLEDPin[cc], LOW);
digitalWrite(effectLEDPin[cc], LOW);
delay(100);
}
delay(100);
for(int dd=0; dd<numberOfPedal; dd++)
{
digitalWrite(OneRelayPin[dd], HIGH);
delay(100);
}
delay(100);
for(int ee=0; ee<numberOfPedal; ee++)
{
digitalWrite(TenRelayPin[ee], HIGH);
digitalWrite(presetLEDPin[ee], HIGH);
digitalWrite(effectLEDPin[ee], HIGH);
delay(100);
}
delay(1000);
readPreset(11, 1, 0); /* pulls first saved preset in memory */
Serial.begin(31250); /* for midi communication - pin 1 TX */
/*for (int i = 0; i < 10; i++) // erase eeprom (optional)
// EEPROM.write(i, 0); */
}
/*********************************************************/
void midiProg(byte status, int data)
{
Serial.write(status);
Serial.write(data);
}
/*********************************************************/
void memory(int addr, int led)
{
for(int ff=0; ff<numberOfPedal; ff++)
{
EEPROM.write((addr) + ff, digitalRead(effectLEDPin[ff]));
digitalWrite(presetLEDPin[ff], HIGH); // turns off all preset LEDs
}
/* Preset LED will flash when saving effects loops */
delay(100);
digitalWrite(presetLEDPin[led], LOW);
delay(100);
digitalWrite(presetLEDPin[led], HIGH);
delay(100);
digitalWrite(presetLEDPin[led], LOW);
delay(100);
digitalWrite(presetLEDPin[led], HIGH);
delay(100);
digitalWrite(presetLEDPin[led], LOW);
delay(100);
digitalWrite(presetLEDPin[led], HIGH);
delay(100);
digitalWrite(presetLEDPin[led], LOW);
delay(100);
digitalWrite(presetLEDPin[led], HIGH);
}
/*********************************************************/
void resetAllRelays()
{
for(int gg=0; gg<numberOfPedal; gg++)
{
digitalWrite(OneRelayPin[gg], HIGH);
digitalWrite(TenRelayPin[gg], LOW);
}
delay(1000);
for(int hh=0; hh<numberOfPedal; hh++)
{
digitalWrite(TenRelayPin[hh], HIGH);
}
}
/*********************************************************/
void resetAllLeds()
{
for(int ii=0; ii<numberOfPedal; ii++)
{
digitalWrite(presetLEDPin[ii], HIGH);
}
}
/*********************************************************/
void writeOut(int relay)
{
resetAllLeds();
digitalWrite(effectLEDPin[relay], !digitalRead(effectLEDPin[relay]));
/*digitalWrite(ledPin[relay], !digitalRead(relayPin[relay]));
/* thanks to anton.efremoff.1 for this tip */
}
/*********************************************************/
void readPreset(int addr, int pcNum, int led)
{
for(int jj=0; jj<numberOfPedal; jj++)
{
digitalWrite(effectLEDPin[jj], EEPROM.read((addr)+jj));
digitalWrite(presetLEDPin[jj], HIGH);
digitalWrite(presetLEDPin[led], LOW);
if (EEPROM.read((addr)+jj)) {
digitalWrite(OneRelayPin[jj], HIGH);
digitalWrite(TenRelayPin[jj], LOW);
}
else {
digitalWrite(OneRelayPin[jj], LOW);
digitalWrite(TenRelayPin[jj], HIGH);
}
}
delay(1000);
for(int kk=0; kk<numberOfPedal; kk++)
{
digitalWrite(OneRelayPin[kk], HIGH);
digitalWrite(TenRelayPin[kk], HIGH);
}
}
/*********************************************************/
void loop()
{
char key = keypad.getKey();
if(key) // Check for a valid key.
{
switch (key)
{
case 'a': // a to x
writeOut(0); // relay
break;
case 'b':
writeOut(1);
break;
case 'c':
writeOut(2);
break;
case 'd':
writeOut(3);
break;
case 'e':
writeOut(4);
break;
/****************************** STORE PRESET MODE */
case 'f':
memory(11,0); //addr, led
break;
case 'g':
memory(21,1);
break;
case 'h':
memory(31,2);
break;
case 'i':
memory(41,3);
break;
case 'j':
memory(51,4);
break;
/****************************** READ PRESET MODE */
case 'k':
readPreset(11, 1, 0); // addr, pcNum, relay
break;
case 'l':
readPreset(21, 2, 1);
break;
case 'm':
readPreset(31, 3, 2);
break;
case 'n':
readPreset(41, 4, 3);
break;
case 'o':
readPreset(51, 5, 4);
break;
}
}
}