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);
}
}
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.
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.
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.
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;