array richiamati singolarmente

Saluto tutta la simpatica comunità, come sempre più impariamo più scopriamo la nostra ignoranza e il desiderio di conoscenza.
Sono tre anni che mia moglie dice a tutti che ho l'amante (Arduino) e naturalmente ho in mente un sacco di progetti
con la mia nuova "AMANTE"

Ho setacciato il web e ho visto che esiste la possibilità di mettere tutti gli ingressi in un array che può essere invocato singolarmente (0) (1) ecc
addirittura si può settare in origine lo stato alto o basso per ogni singola entrata e addirittura fare il
debounce dell'intero array.
il massimo quando scopri che puoi mettere una serie di funzioni in un ciclo void che puoi richiamare in esecuzione quando vuoi durante il loop.

purtroppo tutti gli esempi mostrano le solite funzioni con indice vincolato a delle uscite predestinate (1 accende led 1; 2 accende led 2 ecc) oppure le solite cose che vanno a loop.
Ho provato e riprovato ma non riesco a uscirne
Appena tento di modificare qualcosa a degli sketch con queste funzioni, partono gli errori o non funziona niente
Se qualcuno conosce una pubblicazione veramente valida non di quelle scritte dai soliti professori
molto capaci in tutto tranne che di insegnare ( ho una vita di esempi a proposito) o uno sketch di esempio per fare qualcosa di simile a questo potrebbe restituire il marito a una moglie trascurata (almeno per qualche giorno)

array.ino (925 Bytes)

Non avendolo tu ancora fatto, ti chiederei cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

if (ingresso (2)
	        && ingresso (3)) { //lettura agli ingressi
		digitalWrite (ledGIALLO, HIGH);
	} else {
		digitalWrite (ledGIALLO, LOW);
	}

Intanto fai un po' di attenzione all'indentazione, perché aiuta molto a seguire il flusso del programma, quando inizia a diventare complicato. Eventualmente usa la formattazione automatica.
Con gli array devi sempre usare le parentesi quadre, per accedere ad un singolo elemento. Poi, ingresso[2] di per sé rappresenta solo il contenuto dell'elemento, nel tuo caso un byte che vale 11. Se quell'11 rappresenta un pin da leggere, allora deve diventare l'argomento di una digitalRead(), unica funzione in grado di effettuare la lettura di un pin. In conclusione, quel che volevi fare dovrebbe essere:

if (digitalRead (ingresso[2]) && digitalRead (ingresso[3])) { //lettura agli ingressi
		digitalWrite (ledGIALLO, HIGH);
	} else {
		digitalWrite (ledGIALLO, LOW);
	}

Il led sarà quindi acceso se entrambi i pin 11 e 12 (corrispondenti agli elementi 2 e 3 dell'array) sono HIGH.

Per primo i #define nel commento non funzionano

/*
 Esempio da creare per array utilizzabile a chiamata singola evitando il controllo stato HIGH O LOW
 
#define ledGIALLO 4
#define ledROSSO 5
#define ledBLU 6
#define ledBIANCO 7
*/
byte ingresso[]={9,10,11,12};

Qua crei una variabile col nome ingresso di 4 elementi:
ingresso[0], ingresso[1], ingresso[2] e ingresso[3] e metti il valore 9, 10, 11, e 12 dentro.

nel senso che hai 4 scatole rosse che numeri da 0 a 3 e che metti dentro un 9 (rapanelli) , un 10 (biscotti) , un 11 (insalata) e un 12 (patate).

pinMode(ingresso[9], INPUT);  
pinMode(ingresso[10], INPUT);
pinMode(ingresso[11], INPUT);
pinMode(ingresso[12], INPUT);

Qua definisi il pin col valore dell' elemento 9 della variabile come INPUT.

Restando nel esempio definisci il contenuto della scatola rossa numero 9 come fresco.

Adessu Tu non troverai la scatola rossa numero 9 perché non esiste ma il compilatore incomincia a contare dalla prima scatola rossa per arrivare alla nona scatola che é quella dei biscotti sul tavolo in soggiorno e la apre. Immaginerai cosa dice Tua moglie se ci aggiungi il pepe perché pensi che sia la scatola della insalata.
Questo é un tipico errore coi array e si chiama Overflow. Usi un elemento che non hai definito e che in veritá é un altra variabile. Il compilatore non Ti dice questo errore perché non lo puó riconoscere.
Stessa cosa vale per il 10, 11 e 12.

pinMode(ledGIALLO, OUTPUT);

essendo il #define nel commento non esiste il "ledGIALLO".

if (ingresso(2) && ingresso(3))

per primo devi usare le parentesi quadre e non rotonde hai anche l' errore che stai confrontando il numero del pin e non il suo stato.

devi fare digitalRead(ingresso[2])

Ciao Uwe

Non sono in grado di aiutarti, ma puoi dire a tua moglie che anche la mia pensa la stessa cosa....:slight_smile: :slight_smile:
Ciao ciao

Grazie ragazzi per avermi già risposto, mi devo scusare: uno prima di chiedere aiuto deve far capire bene a che livello sta e cosa vuole veramente fare.
In pratica quello che voglio capire è come creare una lettura agli ingressi che restituisca valido in base alla funzione booleana stato[] precedentemente dichiarata
evitando tutta la serie di digitalread e le complicazioni date dal fatto di mettere insieme letture che devono essere alte e basse nello stesso momento; si può certo mettere il simbolo ! ma è più elegante avere il dato già elaborato
sarei già in grado di fare lo stesso con una serie infinita di if else e altro ma quando vedi certi sketch rimani affascinato e ti rendi conto che vuoi di più.
allego in modo più dettagliato quello che vorrei ottenere.
Vi ringrazio e spero un giorno di poter contribuire anch'io.

array.ino (925 Bytes)

Intanto stato è un vettore/array, non una funzione.

Non sono sicuro di capire bene, ma forse basta che metti all'inizio del loop qualcosa tipo:

for (byte b = 0; b < N_SENSORS; b++) {
  stato[b] = digitalRead (ingresso[b]);
}

In questo modo a ogni iterazione del loop hai i valori aggiornati degli ingressi nell'array stato. È questo che intendevi?

N_SENSORS andrà #definito a 4, ti consiglio di usarlo anche per dimensionare i due array.

PS: Correggi anche le altre cose che ti ha indicato da uwe. Volendo, per i pinMode() puoi fare un ciclo for anche lì.

MauriAlb Ti consiglio vivamente di studiarti le basi del C. Ti ho spiegato i 5 errori che stai facendo in 51 righe di codice.
Non ha senso usare delle funzioni degli altri quando fai casino tra parentesi tonde e quadrate.
Ciao Uwe