led e array

buongiorno tutti,

essendo circa alle prime armi con arduino, mi interessava sapere se e possibile comandare un array di led in base allo stato di un altro array, ossia, ponendo l condizione che in un array di “stato” ci siano 1 o 0, far accendere e poi spegnere i led associati ad un altro array in base al valore 0 o 1 dell altro array.
Quindi se nella posizione 1 dell array di “controllo” è presente 1 il relativo led del dell altro array in posione 1 ledArray [1] si accenda; questo e il ciclo che ho tentato di imbastire

int ledpins = {39,41,43};

for (p=0; p<lednum; p++){
pinMode(ledpins[p], OUTPUT);}

.
.
.

for (n=0; n<=blocks; n++)
{
for (r=0; r<= 8; r++)
{
if (arraycontrollo[n] > 0){
arraycontrollo[n] = ledpins[r];
digitalWrite(ledpins[r], HIGH);
}
else {digitalWrite(ledpins[r], LOW);}
}

L’importante è che i pin ed i relativi stati siano in posizioni fisse all’interno dei rispettivi array.

Nel tuo esempio, dichiarerai gli array più o meno così:

int ledpins[] = {39,41,43};
int ledvalue[] ={0,1,1};

for (p=0; p<lednum; p++) {
  pinMode(ledpins[p], OUTPUT);
}

E così li vai a richiamare

for (p=0; p<lednum; p++) {
  digitalWrite(ledpins[p], ledvalue[p]);
}

Così, utilizzando sizeof(), automaticamente ti calcola la dimensione dell’array.

int ledpins[] = {39,41,43};
int ledvalue[] ={0,1,1};

for (p=0; p<sizeof(ledpins); p++) {
  pinMode(ledpins[p], OUTPUT);
}
for (p=0; p<sizeof(ledpins); p++) {
  digitalWrite(ledpins[p], ledvalue[p]);
}

Scusa @Brado, ma la sizeof() ti dice quanti byte occupa in totale ledpins. Quindi 3 celle * 2 byte ogni int = 6 "When sizeof is applied to the name of a static array (not allocated through malloc), the result is the size in bytes of the whole array" Quindi devi ancora dividere per due sizeof(ledpins)/2

oppure diviso dimensione della prima cella sizeof(ledpins)/sizeof(ledpins[0])

chiaro, il mio problema e che i valori del mio array di controllo non sono fissi ma variano in base a quello che la camera mi rileva, quindi quando mi rileva l oggetto mette a uno una delle posizioni relative nel array di controllo, per esempio

if((a4 >= vm6)&&(a4<= vm7)){

arraycontrollo[4] = 1;}

else {arraycontrollo[4] = 0;}

Quindi ? :fearful: Basta che non inizializzi l'array ledvalue a valori a caso ma tutto a zero. Poi decidi tu da codice cosa metterci dentro.

int ledvalue[] ={0,0,0};

L'importante è che ledvalue e ledpins abbiano lo stesso numero di celle L'indice che usi su ledpins così è lo stesso di ledvalue, hai una corrispondenza 1 a 1

scusa mi sono espresso male, il fatto e che non mi scrive nulla nell arraycontrollo perchè quando vado a stamparlo con:

for(s=0; s<=15; s++){
Serial.println(“valori vettore:”);}
Serial.println (array~~);~~
il risultato e:
Detected 2:
~~ block 0: sig: 1 x: 95 y: 120 width: 68 height: 62 angle 0~~
~~ block 1: sig: 2 x: 160 y: 124 width: 69 height: 65 angle 0~~
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
2
quindi:
if((a4 >= vm6)&&(a4<= vm7)){

~~ array[4] = 1;}~~

else {array[4] = 0;}
non mi scrive nulla nellarray!!!

Ma era voluto tutto quel codice barrato, o è un errore risolvibile usando i tag "code"?

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare. Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

nid69ita: Scusa @Brado, ma la sizeof() ti dice quanti byte occupa in totale ledpins. Quindi 3 celle * 2 byte ogni int = 6 "When sizeof is applied to the name of a static array (not allocated through malloc), the result is the size in bytes of the whole array" Quindi devi ancora dividere per due sizeof(ledpins)/2

oppure diviso dimensione della prima cella sizeof(ledpins)/sizeof(ledpins[0])

Hai ragione Nid, mi sono perso che erano byte! Mannaggia mannaggia! :sweat_smile:

scusate mancavano i tag!

comunque, con questo codice non mi carica i valori nell array:

.
.
.


 if((a3 >= vm4)&&(a3<= vm5)){
       array[3] = 1;}

else {array[3] = 0;}

if((a4 >= vm6)&&(a4<= vm7)){
        
       array[4] = 1;}
else {array[4] = 0;}
     
      
.
.
.

for(s=0; s<=15; s++){
     Serial.println("valori vettore:");}
     Serial.println (array[s]);

mi restituisce solo “valori vettore:” senza il valore sbaglio qualcosa?

ossia questo :

Detected 1:
  block 0: sig: 1 x: 111 y: 197 width: 36 height: 4 angle 0
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
valori vettore:
2

con quel 2 finale che ignoro cosa sia!

uhh risolto (in parte) era colpa di una graffa galeotta in posizione sbalgiata :grinning:

ecco che risolvo un problema e ne esce un altro, ora il risultato dell array lo stampa ma ne stampa uno solo anche se dovrebbero essere due

Detected 2:
  block 0: sig: 1 x: 56 y: 132 width: 14 height: 11 angle 0
  block 1: sig: 1 x: 3 y: 126 width: 7 height: 13 angle 0
valori vettore:
1
valori vettore:
0
valori vettore:
0
valori vettore:
0

essendoci due intervalli di x soddisfatti quindi x=56 e x =3 pone a 1 nell array solo quello del tre....

@gianni, senza vedere il codice come è adesso, che possiamo dirti ?

:smiley:

 int mat[16][2] = {

                {2,19},//0-20
                {22,39},//20-40
                {44,59},//40-60
                {62,79},//60-80
};

int vm0 = mat[0][0];
int vm1 = mat[0][1];

int vm2 = mat[1][0];
int vm3 = mat[1][1];

int vm4 = mat[2][0];
int vm5 = mat[2][1];

int vm6 = mat[3][0];
int vm7 = mat[3][1];
.
.
.
if((a1 >= vm0)&&(a1<= vm1)){
       array[0] = 1;
     
    }
else {array[0] = 0;}



///////////////////////////////////////////////////////////////////////////////////////

if((a2 >= vm2)&&(a2<= vm3)){
       array[1] = 1;}
     

else {array[1] = 0;}

///////////////////////////////////////////////////////////////////////////////////////

if((a3 >= vm4)&&(a3<= vm5)){
       array[2] = 1;}
     

else {array[2] = 0;
}

//Serial.print("valore c: %d\n", c);

///////////////////////////////////////////////////////////////////////////////////////
if((a4 >= vm6)&&(a4<= vm7)){
        
       array[3] = 1;}
     
       
else {array[3] = 0;}
     


//////////////////////////////////////////////////////////////////////////////////////



for(s=0; s<=3; s++){
     Serial.println("valori vettore:");
     Serial.println (array[s]);}
     
     
         }

 
 
     
     }

prima definisco gli intervalli che mi interessano, poi assegno le variabili, vedo se ricadono negli intervalli voluti, e metto a 1 o 0 le posizioni dell array

Se array non contiene degli 1, allora o quello che leggi non è nell'intervallo ( i vari a1,a2, che sono ? ) oppure leggi sbagliato i vari vm2,vm3,etc. Quindi nel codice aggiungi la stampa su seriale di a1,a2, etc. per verificare i valori. Poi quei pezzi di codice potrai commentarli in versione definitiva.

il fatto e che a1 a2 ecc sono degli int assegnati man mano da valori rilevati :

a1 = pixy.blocks[j].x;
 a2 = pixy.blocks[j].x;

nel risultato:

 block 0: sig: 1 x: 67 y: 123 width: 19 height: 19 angle 0
  block 1: sig: 1 x: 7 y: 120 width: 13 height: 18 angle 0
valori vettore:
1
valori vettore:
0
valori vettore:
0
valori vettore:
0

le prime due righe sono i valori relativi ad a1 e a2 quindi quelli me li vede e me li stampa pure, ma poi come si vede non mi salva nell array i valori 1 e 0 o meglio me ne salva soltanto 1!

Ti salva il primo 1 nel primo elemento perchè relativi a a1 e a2. Ma gli altri ?
Perchè allora non c’e’ stampa di a3,a4,etc. ?
Pezzi come questo sono corretti (usa CTRL+T nell’IDE, li incolonna meglio):

if( (a3 >= vm4) && (a3 <= vm5) )
{ array[2] = 1;[/color]
}
else
{ array[2] = 0;
}

Perciò non è li il problema. Stampa anche a2,a3,a4 .