Joystick Controlling LED's

I have a line of 8 LED's that I am trying to control with a joystick that can turn a series of 3 LED's on at a time. I am also trying to have a "kill switch" that when the button of the joystick is pushed it turns all the lights off. I can accomplish the previous two configurations separately but when I try to combine the sketches I am not successful. In a sketch where I just want to turn LED's on and off by the push of the button I am successful and the LED's stay on or off. When I add that sketch to my joystick sketch the button flips between 0 and 1 and stays in said true or false state but the lights will only turn off if I hold the button instead of clicking the button to turn on or off.

int sensorPin = A0;
int ledPins2 = 2;
int ledPins3 = 3;
int ledPins4 = 4;
int ledPins5 = 5;
int ledPins6 = 6;
int ledPins7 = 7;
int ledPins8 = 8;
int ledPins9 = 9;
int sensorValue = 0;
int ButtonValue = 10;
int status = true;

void setup() {
Serial.begin(9600);

pinMode(ledPins2, OUTPUT);
pinMode(ledPins3, OUTPUT);
pinMode(ledPins4, OUTPUT);
pinMode(ledPins5, OUTPUT);
pinMode(ledPins6, OUTPUT);
pinMode(ledPins7, OUTPUT);
pinMode(ledPins8, OUTPUT);
pinMode(ledPins9, OUTPUT);
pinMode(ButtonValue, INPUT_PULLUP);

digitalWrite(ledPins2, HIGH);
digitalWrite(ledPins3, HIGH);
digitalWrite(ledPins4, HIGH);
digitalWrite(ledPins5, HIGH);
digitalWrite(ledPins6, HIGH);
digitalWrite(ledPins7, HIGH);
digitalWrite(ledPins8, HIGH);
digitalWrite(ledPins9, HIGH);

}

void loop() {
sensorValue = analogRead(sensorPin);
Serial.print("Potentiometer = ");
Serial.print(sensorValue);
Serial.print(" Button Value = ");
Serial.println(status);
delay(100);

if (digitalRead(ButtonValue) == false) {
status = !status;
digitalWrite(ledPins2, HIGH);
digitalWrite(ledPins3, HIGH);
digitalWrite(ledPins4, HIGH);
digitalWrite(ledPins5, HIGH);
digitalWrite(ledPins6, HIGH);
digitalWrite(ledPins7, HIGH);
digitalWrite(ledPins8, HIGH);
digitalWrite(ledPins9, HIGH);
} while(digitalRead(ButtonValue) == false);{

if (sensorValue >=0 && sensorValue <172){
//turn the ledPin on
digitalWrite(ledPins2, LOW);
digitalWrite(ledPins3, LOW);
digitalWrite(ledPins4, LOW);
digitalWrite(ledPins5, HIGH);
digitalWrite(ledPins6, HIGH);
digitalWrite(ledPins7, HIGH);
digitalWrite(ledPins8, HIGH);
digitalWrite(ledPins9, HIGH);
}

if (sensorValue >= 172 && sensorValue <342){
//turn the ledPin on
digitalWrite(ledPins2, HIGH);
digitalWrite(ledPins3, LOW);
digitalWrite(ledPins4, LOW);
digitalWrite(ledPins5, LOW);
digitalWrite(ledPins6, HIGH);
digitalWrite(ledPins7, HIGH);
digitalWrite(ledPins8, HIGH);
digitalWrite(ledPins9, HIGH);
}

if (sensorValue >= 342 && sensorValue <512){
//turn the ledPin on
digitalWrite(ledPins2, HIGH);
digitalWrite(ledPins3, HIGH);
digitalWrite(ledPins4, LOW);
digitalWrite(ledPins5, LOW);
digitalWrite(ledPins6, LOW);
digitalWrite(ledPins7, HIGH);
digitalWrite(ledPins8, HIGH);
digitalWrite(ledPins9, HIGH);
}

if (sensorValue >= 512 && sensorValue <682){
//turn the ledPin on
digitalWrite(ledPins2, HIGH);
digitalWrite(ledPins3, HIGH);
digitalWrite(ledPins4, HIGH);
digitalWrite(ledPins5, LOW);
digitalWrite(ledPins6, LOW);
digitalWrite(ledPins7, LOW);
digitalWrite(ledPins8, HIGH);
digitalWrite(ledPins9, HIGH);
}

if (sensorValue >= 682 && sensorValue <852){
//turn the ledPin on
digitalWrite(ledPins2, HIGH);
digitalWrite(ledPins3, HIGH);
digitalWrite(ledPins4, HIGH);
digitalWrite(ledPins5, HIGH);
digitalWrite(ledPins6, LOW);
digitalWrite(ledPins7, LOW);
digitalWrite(ledPins8, LOW);
digitalWrite(ledPins9, HIGH);
}

if (sensorValue >= 852 && sensorValue <1024){
//turn the ledPin on
digitalWrite(ledPins2, HIGH);
digitalWrite(ledPins3, HIGH);
digitalWrite(ledPins4, HIGH);
digitalWrite(ledPins5, HIGH);
digitalWrite(ledPins6, HIGH);
digitalWrite(ledPins7, LOW);
digitalWrite(ledPins8, LOW);
digitalWrite(ledPins9, LOW);
}
}

}

You should format your code and post it in a <CODE> block. To do this, click the <CODE> button, and paste your code between the three backticks, over the words that say:
```
type or paste your code here
```

It should look like this... and here is your answer...

  if (digitalRead(ButtonValue) == false) {
    status = !status;
    digitalWrite(ledPins2, LOW);
    digitalWrite(ledPins3, LOW);
    digitalWrite(ledPins4, LOW);
    digitalWrite(ledPins5, LOW);
    digitalWrite(ledPins6, LOW);
    digitalWrite(ledPins7, LOW);
    digitalWrite(ledPins8, LOW);
    digitalWrite(ledPins9, LOW);

const byte sensorPin = A0;
const byte ledPins2 = 2;
const byte ledPins3 = 3;
const byte ledPins4 = 4;
const byte ledPins5 = 5;
const byte ledPins6 = 6;
const byte ledPins7 = 7;
const byte ledPins8 = 8;
const byte ledPins9 = 9;
const byte ButtonPin = 10;
bool status = true;

void setup() {
pinMode(ledPins2, OUTPUT);
pinMode(ledPins3, OUTPUT);
pinMode(ledPins4, OUTPUT);
pinMode(ledPins5, OUTPUT);
pinMode(ledPins6, OUTPUT);
pinMode(ledPins7, OUTPUT);
pinMode(ledPins8, OUTPUT);
pinMode(ledPins9, OUTPUT);
pinMode(ButtonPin, INPUT_PULLUP);

digitalWrite(ledPins2, HIGH);
digitalWrite(ledPins3, HIGH);
digitalWrite(ledPins4, HIGH);
digitalWrite(ledPins5, HIGH);
digitalWrite(ledPins6, HIGH);
digitalWrite(ledPins7, HIGH);
digitalWrite(ledPins8, HIGH);
digitalWrite(ledPins9, HIGH);
}

void loop() {
if (digitalRead(ButtonValue) == false) {
status = !status;
digitalWrite(ledPins2, HIGH);
digitalWrite(ledPins3, HIGH);
digitalWrite(ledPins4, HIGH);
digitalWrite(ledPins5, HIGH);
digitalWrite(ledPins6, HIGH);
digitalWrite(ledPins7, HIGH);
digitalWrite(ledPins8, HIGH);
digitalWrite(ledPins9, HIGH);
Serial.println("Killed");
delay(100);
}
if (status) {
int sensorValue = analogRead(sensorPin);

if ( sensorValue < 172) {
  digitalWrite(ledPins2, LOW);
  digitalWrite(ledPins3, LOW);
  digitalWrite(ledPins4, LOW);
  digitalWrite(ledPins5, HIGH);
  digitalWrite(ledPins6, HIGH);
  digitalWrite(ledPins7, HIGH);
  digitalWrite(ledPins8, HIGH);
  digitalWrite(ledPins9, HIGH);
} else if (sensorValue < 342) {
  digitalWrite(ledPins2, HIGH);
  digitalWrite(ledPins3, LOW);
  digitalWrite(ledPins4, LOW);
  digitalWrite(ledPins5, LOW);
  digitalWrite(ledPins6, HIGH);
  digitalWrite(ledPins7, HIGH);
  digitalWrite(ledPins8, HIGH);
  digitalWrite(ledPins9, HIGH);
} else   if (sensorValue < 512) {
  digitalWrite(ledPins2, HIGH);
  digitalWrite(ledPins3, HIGH);
  digitalWrite(ledPins4, LOW);
  digitalWrite(ledPins5, LOW);
  digitalWrite(ledPins6, LOW);
  digitalWrite(ledPins7, HIGH);
  digitalWrite(ledPins8, HIGH);
  digitalWrite(ledPins9, HIGH);
} else if (sensorValue < 682) {
  digitalWrite(ledPins2, HIGH);
  digitalWrite(ledPins3, HIGH);
  digitalWrite(ledPins4, HIGH);
  digitalWrite(ledPins5, LOW);
  digitalWrite(ledPins6, LOW);
  digitalWrite(ledPins7, LOW);
  digitalWrite(ledPins8, HIGH);
  digitalWrite(ledPins9, HIGH);
} else if ( sensorValue < 852) {
  digitalWrite(ledPins2, HIGH);
  digitalWrite(ledPins3, HIGH);
  digitalWrite(ledPins4, HIGH);
  digitalWrite(ledPins5, HIGH);
  digitalWrite(ledPins6, LOW);
  digitalWrite(ledPins7, LOW);
  digitalWrite(ledPins8, LOW);
  digitalWrite(ledPins9, HIGH);
} else {
  digitalWrite(ledPins2, HIGH);
  digitalWrite(ledPins3, HIGH);
  digitalWrite(ledPins4, HIGH);
  digitalWrite(ledPins5, HIGH);
  digitalWrite(ledPins6, HIGH);
  digitalWrite(ledPins7, LOW);
  digitalWrite(ledPins8, LOW);
  digitalWrite(ledPins9, LOW);
}

}
}

more properly formatted

    }

    while(digitalRead(ButtonValue) == false)
        ;

    {
        if (sensorValue >=0 && sensorValue <172)  {

is there an extra ';'?

  • using an array of LED pins could significantly reduce the size of the program

not quite what you're doing.

const byte PinButton  = 10;
const byte PinLeds [] = { 2, 3, 4, 5, 6, 7, 8, 9, 10 };

const byte PinSensor = A0;
const int  Nled      = sizeof(PinLeds);

byte butState;
bool status;

enum { Off = HIGH, On = LOW };

// -----------------------------------------------------------------------------
void
ledsOn (
    int idx )
{
    for (int n = 0; n < Nled; n++)  {
        if (n == idx)
            digitalWrite (PinLeds [n], On);
        else
            digitalWrite (PinLeds [n], Off);
    }
}
// -----------------------------------------------------------------------------
void loop ()
{
    // monitor button press
    byte but = digitalRead (PinButton);
    if (butState != but)  {
        butState  = but;
        delay (20);

        if (LOW == but)
            status = !status;
    }

    if (! status)  {
        ledsOn (-1);
        return;
    }

    int sensorValue = analogRead (PinSensor);
    Serial.println (sensorValue);

    ledsOn (sensorValue * Nled / 400);

    delay (500);
}


// -----------------------------------------------------------------------------
void setup() {
    Serial.begin(9600);

    pinMode (PinButton, INPUT_PULLUP);
    butState = digitalRead (PinButton);

    for (int n = 0; n < Nled; n++)  {
        pinMode      (PinLeds [n], OUTPUT);
        digitalWrite (PinLeds [n], Off);
    }
}

Hi @elecarchitect,

here is a formatted version of your sketch:

int sensorPin = A0;
int ledPins2 = 2;
int ledPins3 = 3;
int ledPins4 = 4;
int ledPins5 = 5;
int ledPins6 = 6;
int ledPins7 = 7;
int ledPins8 = 8;
int ledPins9 = 9;
int sensorValue = 0;
int ButtonValue = 10;
int status = true;

void setup() {
  Serial.begin(9600);

  pinMode(ledPins2, OUTPUT);
  pinMode(ledPins3, OUTPUT);
  pinMode(ledPins4, OUTPUT);
  pinMode(ledPins5, OUTPUT);
  pinMode(ledPins6, OUTPUT);
  pinMode(ledPins7, OUTPUT);
  pinMode(ledPins8, OUTPUT);
  pinMode(ledPins9, OUTPUT);
  pinMode(ButtonValue, INPUT_PULLUP);

  digitalWrite(ledPins2, HIGH);
  digitalWrite(ledPins3, HIGH);
  digitalWrite(ledPins4, HIGH);
  digitalWrite(ledPins5, HIGH);
  digitalWrite(ledPins6, HIGH);
  digitalWrite(ledPins7, HIGH);
  digitalWrite(ledPins8, HIGH);
  digitalWrite(ledPins9, HIGH);

}

void loop() {
  sensorValue = analogRead(sensorPin);
  Serial.print("Potentiometer = ");
  Serial.print(sensorValue);
  Serial.print(" Button Value = ");
  Serial.println(status);
  delay(100);

  if (digitalRead(ButtonValue) == false) {
    status = !status;
    digitalWrite(ledPins2, HIGH);
    digitalWrite(ledPins3, HIGH);
    digitalWrite(ledPins4, HIGH);
    digitalWrite(ledPins5, HIGH);
    digitalWrite(ledPins6, HIGH);
    digitalWrite(ledPins7, HIGH);
    digitalWrite(ledPins8, HIGH);
    digitalWrite(ledPins9, HIGH);
  } while (digitalRead(ButtonValue) == false); {

    if (sensorValue >= 0 && sensorValue < 172) {
      //turn the ledPin on
      digitalWrite(ledPins2, LOW);
      digitalWrite(ledPins3, LOW);
      digitalWrite(ledPins4, LOW);
      digitalWrite(ledPins5, HIGH);
      digitalWrite(ledPins6, HIGH);
      digitalWrite(ledPins7, HIGH);
      digitalWrite(ledPins8, HIGH);
      digitalWrite(ledPins9, HIGH);
    }

    if (sensorValue >= 172 && sensorValue < 342) {
      //turn the ledPin on
      digitalWrite(ledPins2, HIGH);
      digitalWrite(ledPins3, LOW);
      digitalWrite(ledPins4, LOW);
      digitalWrite(ledPins5, LOW);
      digitalWrite(ledPins6, HIGH);
      digitalWrite(ledPins7, HIGH);
      digitalWrite(ledPins8, HIGH);
      digitalWrite(ledPins9, HIGH);
    }

    if (sensorValue >= 342 && sensorValue < 512) {
      //turn the ledPin on
      digitalWrite(ledPins2, HIGH);
      digitalWrite(ledPins3, HIGH);
      digitalWrite(ledPins4, LOW);
      digitalWrite(ledPins5, LOW);
      digitalWrite(ledPins6, LOW);
      digitalWrite(ledPins7, HIGH);
      digitalWrite(ledPins8, HIGH);
      digitalWrite(ledPins9, HIGH);
    }

    if (sensorValue >= 512 && sensorValue < 682) {
      //turn the ledPin on
      digitalWrite(ledPins2, HIGH);
      digitalWrite(ledPins3, HIGH);
      digitalWrite(ledPins4, HIGH);
      digitalWrite(ledPins5, LOW);
      digitalWrite(ledPins6, LOW);
      digitalWrite(ledPins7, LOW);
      digitalWrite(ledPins8, HIGH);
      digitalWrite(ledPins9, HIGH);
    }

    if (sensorValue >= 682 && sensorValue < 852) {
      //turn the ledPin on
      digitalWrite(ledPins2, HIGH);
      digitalWrite(ledPins3, HIGH);
      digitalWrite(ledPins4, HIGH);
      digitalWrite(ledPins5, HIGH);
      digitalWrite(ledPins6, LOW);
      digitalWrite(ledPins7, LOW);
      digitalWrite(ledPins8, LOW);
      digitalWrite(ledPins9, HIGH);
    }

    if (sensorValue >= 852 && sensorValue < 1024) {
      //turn the ledPin on
      digitalWrite(ledPins2, HIGH);
      digitalWrite(ledPins3, HIGH);
      digitalWrite(ledPins4, HIGH);
      digitalWrite(ledPins5, HIGH);
      digitalWrite(ledPins6, HIGH);
      digitalWrite(ledPins7, LOW);
      digitalWrite(ledPins8, LOW);
      digitalWrite(ledPins9, LOW);
    }
  }

}

I have created a Wokwi version of your application:

https://wokwi.com/projects/410824037311785985

and also an updated version that might do what you intend to do:

https://wokwi.com/projects/410824564717321217

Sketch:

/*
  Forum: https://forum.arduino.cc/t/joystick-controlling-leds/1307844
  Wokwi: https://wokwi.com/projects/410824564717321217
  Original Version see Wokwi: https://wokwi.com/projects/410824037311785985

*/

const byte sensorPin = A0;
const byte buttonPin = 10;
const byte minLedPin = 2;
const byte maxLedPin = 9;

int sensorValue = 0;
int oldSensorValue = -1;
byte status = false;

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT_PULLUP);
  for (int i = minLedPin; i <= maxLedPin; i++) {
    pinMode(i, OUTPUT);
  }
  allLedsOn();
}

void loop() {
  checkButton();
  handleSensor();
}

void setLeds(byte fromPin, byte toPin, byte state) {
  for (int i = fromPin; i <= toPin; i++) {
    digitalWrite(i, state);
  }
}

void allLedsOff(){
 setLeds(minLedPin, maxLedPin, LOW);    
}

void allLedsOn(){
 setLeds(minLedPin, maxLedPin, HIGH);    
}


void checkButton() {
  static unsigned long lastChange = 0;
  static byte state = HIGH;
  static byte lastState = HIGH;
  byte actState = digitalRead(buttonPin);
  if (actState != lastState) {
    lastChange = millis();
    lastState = actState;
  }
  if (state != actState && millis() - lastChange > 30) {
    state = actState;
    if (state == LOW) {
      status = !status;
      Serial.print(" Button Value = ");
      Serial.println(status);
      if (status) {
        setLeds(minLedPin, maxLedPin, LOW);
      }
    }
  }
}

void handleSensor() {
  if (status) {
    return;
  }
  sensorValue = analogRead(sensorPin);
  if (sensorValue != oldSensorValue) {
    oldSensorValue = sensorValue;
    Serial.print("Potentiometer = ");
    Serial.println(sensorValue);
    handleLeds();
  }
}

void handleLeds() {
  static byte oldMode = 255;
  byte mode = 0;
  if (sensorValue >= 172) {
    mode = 1;
  }
  if (sensorValue >= 342)  {
    mode = 2;
  }
  if (sensorValue >= 512) {
    mode = 3;
  }
  if (sensorValue >= 682) {
    mode = 4;
  }
  if (sensorValue >= 852) {
    mode = 5;
  }
  if (mode != oldMode){
    oldMode = mode;
    allLedsOn();
    setLeds(minLedPin+mode,minLedPin+mode+2,LOW);
  }
}

It's just one of many possibility to solve the issue ...

Have fun!
ec2021

Complete re-writes are a solutions to changing one series of HIGHs to LOWs?

A tree can hide in a forest.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.