This is a Delay guitar effect. One of the easiest in terms of programming.
The main loop of the code does:
- Check if the pedal is ON or OFF, reading the Bypass_detect pin (digitalRead(BYPASS_DETECT) == LOW)
- Read the Encoder: updating the ENC_counter variable. This variables goes from 50 (maximum delay, around 600ms) to 230 (minimum delay, around 60ms)
- Set the delay on the PT2399 chips using "analogWrite(DELAY1, ENC_counter);"
- Update the LED colors: using "digitalWrite(LED1_G,HIGH); etc" you can set the colors you like
- Set the Audio Relays: using "digitalWrite(SWA, LOW), etc..." to the configuration needed. For delay we have:
The complete code looks like this:
// CC-by-www.ElectroSmash.com Delay Effect Pedal.
// More info about the project at www.ElectroSmash.com/Time-Manipulator
// Pin Definitions:
#define DELAY1 10
#define DELAY2 9
#define SWA 3
#define SWB 14
#define SWC 2
#define SWD 4
#define LED1_G 1
#define LED1_R 0
#define LED2_G 5
#define LED2_R 6
#define ENC_A 16
#define ENC_B 18
#define ENC_GND 17
#define ENC_PUSH 19
#define BYPASS_DETECT 8
#define TAP_DETECT 15
//VARIABLES
unsigned int ENC_counter = 100;
int ENC_aState;
int ENC_aLastState;
int ENC_aState_selection=0;
int ENC_aLastState_selection=0;
// the setup function runs once when you press reset or power the board
void setup()
{
//set the pins //init the values
pinMode(DELAY1, OUTPUT); analogWrite(DELAY1, 100);
pinMode(DELAY2, OUTPUT); analogWrite(DELAY2, 100);
pinMode(SWA, OUTPUT); digitalWrite(SWA, LOW);
pinMode(SWB, OUTPUT); digitalWrite(SWB, LOW);
pinMode(SWC, OUTPUT); digitalWrite(SWC, LOW);
pinMode(SWD, OUTPUT); digitalWrite(SWD, LOW);
pinMode(LED1_G, OUTPUT); analogWrite(LED1_G, 0);
pinMode(LED1_R, OUTPUT); analogWrite(LED1_R, 0);
pinMode(LED2_G, OUTPUT); analogWrite(LED2_G, 0);
pinMode(LED2_R, OUTPUT); analogWrite(LED2_R, 0);
pinMode(ENC_A, INPUT_PULLUP);
pinMode(ENC_B, INPUT_PULLUP);
pinMode(ENC_GND, OUTPUT);
pinMode(ENC_PUSH, INPUT_PULLUP);
pinMode(BYPASS_DETECT, INPUT_PULLUP);
pinMode(TAP_DETECT, INPUT_PULLUP);
ENC_aLastState = digitalRead(ENC_A);
void read_encoder(void);
}
void loop() // the loop function runs over and over again forever
{
//detect if the effect is on or off
while((digitalRead(BYPASS_DETECT) == LOW))
{
digitalWrite(LED1_R,LOW);digitalWrite(LED2_R,LOW);digitalWrite(LED1_G,LOW);digitalWrite(LED2_G,LOW);
}
read_encoder();
//update the delay value based on the encoder reading
analogWrite(DELAY1, ENC_counter);
analogWrite(DELAY2, ENC_counter);
//update the LED colors
digitalWrite(LED1_G,HIGH); digitalWrite(LED2_G,HIGH);digitalWrite(LED1_R,LOW); digitalWrite(LED2_R,LOW);
//set the audio relay
digitalWrite(SWA, LOW);digitalWrite(SWB, HIGH);digitalWrite(SWC, HIGH);digitalWrite(SWD, LOW);
}
void read_encoder(void)
{
ENC_aState = digitalRead(ENC_A); // Reads the "current" state
if (ENC_aState != ENC_aLastState)
{
if (digitalRead(ENC_B) != ENC_aState)
{if(ENC_counter>50)ENC_counter-=5;}
else
{if(ENC_counter<230)ENC_counter+=5;}
}
ENC_aLastState = ENC_aState; // Updates the prev. state
}