// https://wokwi.com/projects/386642553613511681
// https://forum.arduino.cc/t/effect-switcher-and-relays-eeprom-question/1209660
#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 */
byte colPins[cols] = {5,6,7}; /* rotary switch */
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
int relayPin[3] = {8,9,10};
int resetPin[3] = {11,12,13};
int ledPin[3] = {A0,A1,A2};
byte midiChannel = 0;
int numberOfPedal = 3;
// for testing dual relay thing
const byte leftPin[3] = {2, 4, 6}; //
const byte rightPin[3] = {3, 5, 7}; //
const byte tellTale[3] = {A3, A4, A5};//
/******************************************************/
void setup()
{
Serial.begin(115200); // not using midi communication in this demo
Serial.println("Jello Whirled!\n");
for(int c=0; c<numberOfPedal; c++) /* setup test phase */
{
pinMode(relayPin[c], OUTPUT);
pinMode(resetPin[c], OUTPUT);
pinMode(ledPin[c], OUTPUT);
digitalWrite(resetPin[c], HIGH);
digitalWrite(relayPin[c], LOW);
digitalWrite(ledPin[c], LOW);
pinMode(leftPin[c], OUTPUT);
pinMode(rightPin[c], OUTPUT);
pinMode(tellTale[c], OUTPUT);
digitalWrite(leftPin[c], LOW);
digitalWrite(rightPin[c], LOW);
digitalWrite(tellTale[c], HIGH); // startup condition?
}
delay(2000);
for(int d=0; d<numberOfPedal; d++)
{
digitalWrite(relayPin[d], HIGH);
digitalWrite(ledPin[d], HIGH);
}
readPreset(11, 1, 0); /* initiate default mode */
/*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 i=0; i<numberOfPedal; i++)
{
EEPROM.write((addr) + i, digitalRead(relayPin[i]));
digitalWrite(ledPin[i], LOW); // all leds reset
}
delay(100);
digitalWrite(ledPin[led], HIGH);
delay(100);
digitalWrite(ledPin[led], LOW);
delay(100);
digitalWrite(ledPin[led], HIGH);
delay(100);
digitalWrite(ledPin[led], LOW);
delay(100);
digitalWrite(ledPin[led], HIGH);
delay(100);
digitalWrite(ledPin[led], LOW);
delay(100);
digitalWrite(ledPin[led], HIGH);
}
/*********************************************************/
void resetAllRelays()
{
for(int i=0; i<numberOfPedal; i++)
{
digitalWrite(relayPin[i], HIGH);
}
}
/*********************************************************/
void resetAllLeds()
{
for(int i=0; i<numberOfPedal; i++)
{
digitalWrite(ledPin[i], HIGH);
}
}
/*********************************************************/
void writeOut(int relay)
{
resetAllLeds();
// test the latching coil function
switchRelay(relay, !digitalRead(relayPin[relay]));
digitalWrite(relayPin[relay], !digitalRead(relayPin[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 i=0; i<numberOfPedal; i++)
{
digitalWrite(relayPin[i], EEPROM.read((addr)+i));
digitalWrite(ledPin[i], HIGH);
digitalWrite(ledPin[led], LOW);
}
midiProg(0xC0 | midiChannel , pcNum); /* send midi change program 1 */
}
/*********************************************************/
void switchRelay(int relayNumber, int onOff)
{
if (onOff) { // close the contacts
digitalWrite(leftPin[relayNumber], LOW);
digitalWrite(rightPin[relayNumber], HIGH);
delay(500);
digitalWrite(tellTale[relayNumber], HIGH);
}
else { // open the contacts
digitalWrite(rightPin[relayNumber], LOW);
digitalWrite(leftPin[relayNumber], HIGH);
delay(500);
digitalWrite(tellTale[relayNumber], LOW);
}
delay(100);
digitalWrite(leftPin[relayNumber], LOW);
digitalWrite(rightPin[relayNumber], LOW);
}
void loop()
{
// char key = keypad.getKey();
// use serial input instead of figuring out the keypad
char key = 0;
if (Serial.available()) key = Serial.read();
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;
}
}
}RELAY
LED
RESET
NEG
TELL
POS