Inspiration
I wanted to create a moving spotlight using a potentiometer that work as if you are pointing at a light bulb and turning it on. I also wanted to create two different modes that would alternate between analog and digital signals using a button.
Implementation
First, I had to create the logic for the analog and digital switches based on the potentiometer value. I did this with the following code:
const int LEDpins[] = {3, 5, 6, 10, 11};
double mapf(float value, float fromLow, float fromHigh, float toLow, float toHigh) {
return (value - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow;
}
double mappedD(float mapValue, int currPin){
double absDist = abs(mapValue - currPin);
return mapf(absDist, 0, PIN_LENGTH-1, 255, 0);
}
//code for analog write
double mapValue = mapf(potValue, 0, 1023.0, 0, PIN_LENGTH-1);
for(int i = 0; i < PIN_LENGTH; i++){
analogWrite(LEDpins[i], max(0,mappedD(mapValue, i)-100));
}
//code for digital write
int intMapVal = map(potValue, 0, 1023, 0, PIN_LENGTH-1);
for(int i = 0; i < PIN_LENGTH; i++){
digitalWrite(LEDpins[i], intMapVal==i);
}
By creating my own map functions, I was able to have a floating point value that determined how much each light bulb should light up. For the analog setting, the light was too bright at most values, so I decreased the values by 100 and constrained them to prevent integer underflow.
I also did added some logic for the button handling, and a light show would play while holding the button down, and would switch between analog and digital on release.
if(buttonState == LOW && prevState == HIGH){
toggled = !toggled;
for(int i = 0; i < PIN_LENGTH; i++){
analogWrite(LEDpins[i], false);
}
}
if(buttonState == HIGH && prevState == HIGH){
if(millis() > timer){
timer=millis()+interval;
for(int i = 0; i < PIN_LENGTH; i++){
LEDOn[i] = random(2);
}
}
for(int i = 0; i < PIN_LENGTH; i++){
digitalWrite(LEDpins[i], LEDOn[i]);
}
}
In doing this, I was able to create a light show dependent on the switch, which takes in a digital input, and potentiometer, which takes in a continuous input.
Reflection
Moving forwards, I would like to experiment with different mathematical functions for displaying luminosity as a linear scale may not have been best. I would also like to explore different ways to turn the knob as it was very difficult to turn and observe the effects without blocking the view.