Hi everyone! I have a project that I'm sort of working backwards on... I started it 7 or 8 years ago, and am finally getting to finishing it up. I'm good at understanding and figuring out, but am a total noob with code.
Using an Arduino Mega, this project uses 9 DPDT single coil latched relays to create 9 "loops" to effect pedals when engaged, and just have the audio pass through when not engaged.
I found the initial code in an instructable - and it works! But it used the Arduino relay modules, which I'm not using - I've created my own relay setup using TQ2-L-5V relays. To engage the relay, it needs positive to one side / negative to the other, but to disengage the relay, I have to flip the voltage. I've attached my method for doing that, which utilizes a transistor setup for NOT gate. (I've attached that schematic). I've tested that, and it works.
My issue is that the code, as is, which uses the keypad library/setup and sets each relay's status from EEPROM preset, only has one pin for engaging the relays. (In the code, lines 100 to 107 are where the relays are engaged, I think).
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 */
}
With my relay setup, I need a "resetPin" to go HIGH while the relayPin goes LOW - and I'd like that to be more of a "pulse" - 100ms maybe; enough to engage the relayPin LOW (then HIGH after 100ms) / resetPin HIGH, and when it's time to disengage relayPin HIGH / resetPin LOW (then high after 100ms).
I hope that makes sense... Basically, instead of one pin for the relay just being ON - I need it to pulse on and then off - and I need another pin to work opposite the relays.
Any thoughts? I appreciate it in advance!
#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;
/******************************************************/
void setup()
{
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);
}
delay(2000);
for(int d=0; d<numberOfPedal; d++)
{
digitalWrite(relayPin[d], HIGH);
digitalWrite(ledPin[d], HIGH);
}
readPreset(11, 1, 0); /* initiate default mode */
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 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();
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 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;
}
}
}
