Ciao a tutti,
scrivo perchè sono un po in panne con un codice...
ho 10 sensori che possono essere esclusi (sensoreNescluso == 1) oppure no (== 0 )e in questo ultimo caso rilevano la pressione tipo ON/OFF scrivendone lo stato nella variabile (statosensoreN == HIGH) o LOW...
sostanzialmente nella fase di un ciclo vado avanti solo se ogni singolo sensore:
- o è escluso
- o in stato HIGH
è corretta questa sintassi:
if ( ((sensores1escluso == 1) || (statosensore1 == HIGH)) && ((sensores2escluso == 1) || (statosensore2 == HIGH)) && ((sensores3escluso == 1) || (statosensore3 == HIGH)) && ......... ((sensores10escluso == 1) || (statosensore10 == HIGH)) ) {
faseciclo = faseciclo + 1; // se ogni sensore è HIGH o escluso, passa alla fase successiva
}
perchè purtroppo vedo molti esempi di condizioni "semplici", scusate non sono un bravo ricercartore.
grazie a tutti per il tempo speso.
a presto
Potrebbe andare bene
Ma è lunga, illeggibile e non mantenibile
Ti conviene fare in maniera differente
Il meglio sarebbe invece di avere tante variabili per tanti sensori avere degli array, che scorri in poche righe
Per adesso nell'immediato ti direi di nidificare le if
Ogni sensore nidificato nella if del precedente
Sarà bruttissimo da vedere, ma almeno ha dimensioni umane ogni singloa riga
Se non ti è chiaro chiedi
ciao!
no è chiaro... lasciando perdere la sintassi intendi dire
if (..... sensore1 high || sensore1escluso ==1) {
if (sensore2 high || sensore2escluso ==1 {
if nsensori {
}
}
}
forse come dici te è lunga... il programma è interfacciato con megunolink e vedo che effettivamente stato sensori e variabili sono corrette...solo che quella istruzione lunga di if con 10 sensori non me la vede...
probabilmente sbaglio io..domani provo a verificare meglio e provo eventualmente la soluzione proposta....
purtroppo per gli array non sono molto tecnico col codice di arduino!
ti aggiorno!
È corretta, ma meglio scriverla più compatta:
// se ogni sensore è HIGH o escluso, passa alla fase successiva
if( (sensores1escluso || statosensore1) &&
(sensores2escluso || statosensore2) &&
(sensores3escluso || statosensore3) &&
.........
(sensores10escluso || statosensore10) ) {
faseciclo++;
}
Io userei un array, anzi 2, mi pare più pulito:
byte escluso[10];
byte stato[10];
bool proseguo=true;
//lettura stato e set esclusione
for(uint8_t i=0;i<10;i++){
if(!escluso[i] || !stato[i]){
proseguo=false;
break;
}
}
if(proseguo){
//fai qualcosa
}
Dovrebbe funzionare, ma controlla, perchè è tardi(perlomeno per me), sono stanco, e quindi prone a scrivere minchiate.
Ciao, Ale.
edit: infatti ho scritto una fesseria, non ci va un or ma un and:
if(!escluso[i] && !stato[i])
perlomeno mi pare, ma mi sa che è meglio se vado a letto...
Io eventualmente userei un'array di struct così puoi tenere tutto ordinato e compatto
typedef struct {
uint8_t pin;
bool value;
bool excluded;
bool getValue() {
return value || excluded;
}
} Sensor_t;
Sensor_t sensors[10];
// Oppure
// Sensor_t sensor1, sensor2, sensor3, sensor4 etc etc
//////////
sensors[0].value = digitalRead(sensors[0].pin);
sensors[1].excluded = true;
etc etc
// If concatenato oppure la logica più smart con il ciclo for già mostrata da @ilguargua
if (sensors[0].getValue() && sensors[1].getValue()
//etc etc)
Ciao a tutti!
la sintassi era corretta, era un problema di variabile e di conseguenza la condizione non si avverava.
Ad ogni modo vi ringrazio tutti quanti per il vostro supporto!! Ho imparato anche cose nuove grazie a voi!
E' ben per questo che i programmi devono essere chiari e ben leggibili
Per discernere subito tra le possibili cause di malfunzionamento
ERGO: sempre Array di strutture ciclate