pilotaggio led con joystick analogico

salve a tutti!
ho problemi con parte del mio codice. l'obiettivo del mio progetto è abbastanza semplice. volevo creare un quadrato di led (per iniziare, ho creato un quadrato 2x2 ) all'interno del quale poter "spostare" il led acceso utilizzando un joystick analogico. sono riuscita a scrivere e a far funzionare il comando "sotto" e "sinistra"
i comandi "sopra" e "destra" invece, per qualche motivo, fanno succedere cose impreviste come far accendere o spegnere i led a caso..

di seguito il mio codice:

int i;
void setup() {
pinMode(24, OUTPUT);
pinMode(25, OUTPUT); 
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(24, LOW);
i = random(24,27); //si parte con un led acceso random
digitalWrite(i, HIGH);
delay(500);
}

void loop() {

 int direz_x = analogRead(14);
 int direz_y = analogRead(15); 

if(direz_x<496 && direz_x>0) { //sopra
    digitalWrite(i,LOW);
    digitalWrite(i=i-2,HIGH);
    delay(1000);
    }
 if(direz_x<1024 && direz_x>496) { //sotto
    digitalWrite(i,LOW);
    digitalWrite(i=i+2,HIGH);
    delay(1000);
  }
if(direz_y<1023 && direz_y>515) { //sinistra
   digitalWrite(i,LOW);
    digitalWrite(i=i-1,HIGH);
    delay(1000);
}
if(direz_y<516 && direz_y>0 ) { // destra
  digitalWrite(i,LOW);
    digitalWrite(i=i+1,HIGH);
}
  
 }

grazie per l'aiuto

Vedo diverse cose che non vanno bene. Intanto :

digitalWrite(i=i-2,HIGH);

Questo, anche se formalmente non è un errore, è perlomeno brutto e inutile, puoi scrivere semplicemente:

digitalWrite(i-2,HIGH);

Poi, i viene assegnato random qui :

i = random(24,27); //si parte con un led acceso random

con un valore da 24 a 27. Cosa succede al codice riportato sopra se i è ad esempio 24?
Devi fare un controllo dei limiti e della coerenza del valore che assegni.

Ciao, Ale.

salve, grazie per la risposta

ilguargua:
Questo, anche se formalmente non è un errore, è perlomeno brutto e inutile, puoi scrivere semplicemente:

l'ho scritto in quel modo per far si che la nuova posizione del led acceso sia memorizzata nella variabile i, in modo da tenerla aggiornata.. ottengo lo stesso risultato se scrivo solo i-2?

ilguargua:
con un valore da 24 a 27. Cosa succede al codice riportato sopra se i è ad esempio 24?

i valori da 24 a 27 corrispondono ai pin digitali a cui è collegato ogni led. quindi in questo modo faccio accendere uno dei miei 4 led in modo casuale

giu_:
l'ho scritto in quel modo per far si che la nuova posizione del led acceso sia memorizzata nella variabile i,

Allora fallo prima del digitalWrite(), scrivi i -= 2; in una riga separata

giu_:
i valori da 24 a 27 corrispondono ai pin digitali a cui è collegato ogni led. quindi in questo modo faccio accendere uno dei miei 4 led in modo casuale

Si questo l'ho capito, ma se i == 24, i - 2 == 22, che mi sembra fuori dal range dei pin collegati ai LED, è questo che volevo farti notare.

Ciao, Ale.

ilguargua:
ma se i == 24, i - 2 == 22, che mi sembra fuori dal range dei pin collegati ai LED, è questo che volevo farti notare.

se il led acceso fosse il 24 (il primo in alto a sinistra nel mio quadrato) mi sposterei solo a destra e sotto, quindi non andrei fuori range
ovviamente dovrò programmare anche il caso in cui decido di spostarmi fuori dal quadrato di led, ma volevo procedere per gradi

giu_:
se il led acceso fosse il 24 (il primo in alto a sinistra nel mio quadrato) mi sposterei solo a destra e sotto, quindi non andrei fuori range

Questo nelle tue intenzioni, ma insisto, se al pin 22 non hai niente collegato non credo che otterrai ciò che vuoi.
In pratica i nel tuo caso dovrà essere sempre compreso tra 24 e 27, come effettuare lo spostamento del led acceso sommando o sottraendo un valore dipende da come sono disposti i led, ma se sono 4, collegati ai pin 24-25-26-27 devi sempre controllare che i rimanga entro questi valori.

Ciao, Ale.

if (i < 24) 
   i = 24;
else if (i > 27)
   i = 27;

Ti serve qualcosa di simile al codice sopra. Se te la senti poco per volta modifichi il codice in modo che sia più flessibile e comprensibile, ad esempio:

24 e 27 sono "costanti manifeste" e possono essere sostituite da variabili o macro.
Esempio con le macro

#define MAX_PIN_LED 27
#define MIN_PIN_LED 24

La "if" di prima si trasforma cosi:

if (i < MIN_PIN_LED) 
   i = MIN_PIN_LED;
else if (i > MAX_PIN_LED)
   i = MAX_PIN_LED;

Inoltre alla variabile 'i' sarebbe meglio dargli un nome più lungo e più indicativo. Puoi anche pensare di usare un'altra macro
per 'i' così da potere cambiare il nome della variabile 'i' facilmente.
Es:

byte pinLed;
#define LED_PIXEL pinLed

// Lo userai così:
if (LED_PIXEL < MIN_PIN_LED) 
   LED_PIXEL = MIN_PIN_LED;

Il preprocessore C++ risolve le macro e il codice compilato è simile a questo:

if (pinLed < 24) 
   pinLed = 24;
else if (pinLed > 27)
   pinLed = 27;

Ciao.