Go Down

Topic: condizioni controllo(if) determinate da analog input,ma lettura istruzioni manca (Read 157 times) previous topic - next topic

iaccaro


 ciao a tutti! presento il mio problema che sicuramente risultera' essere banale, ma al quale al momento non riesco proprio a trovare risposta (posto il primo pezzo dello sketch e poi descrivo il problema):

Code: [Select]

int analogico;


void setup() { // put your setup code here, to run once:

pinMode(A0, INPUT);
pinMode(11, OUTPUT);
pinMode(2, OUTPUT);
pinMode(4, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
Serial.begin(9600);
}

void loop() { // put your main code here, to run repeatedly:

analogico = analogRead(A0);
analogico = map(analogico, 1, 1023, 1, 100);
Serial.println(analogico);
delay(50);

if (0 <= analogico < 10)

{
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(7, LOW);
  digitalWrite(11, LOW);
  digitalWrite(4, LOW);
  digitalWrite(2, LOW);
  digitalWrite(6, HIGH);
}
else if (10 <= analogico < 20)
{
  digitalWrite(10, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(9, LOW);
 


}
else if (20 <= analogico < 30)
{
  digitalWrite(7, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(6, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(2, LOW);
}

1-ok dunque ho "mappato" il segnale analogico in ingresso da 1 a 100 per poter meglio controllare i valori per l'esecuzione dei controlli if.
2-ho posto le condizioni per le quali eseguire le istruzioni che mi servono.
3- il problema risultante al quale non riesco a fare fronte e' che:nonostante il valore letto dal mio potenziometro so essere corretto(ho il serial print sul monitor e posso controllare i valori in entrata che sono giusti) ma le istruzioni della condizione non si verificano in nessun caso...


ps. nello sketch allegato ho messo solo le prime 3 condizioni per non creare un post esageratamente grande.. ma non cambia il fatto che sia pure la prima o l ultima condizione, le istruzioni non vengono mai eseguite!

ringrazio in anticipo chiunque utilizzi del suo tempo per tentare di dare una mano! grazie!

 

gpb01

>iaccaro:   ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie. :)

Guglielmo
Search is Your friend ... or I am Your enemy !

iaccaro

oh credo di esserci riuscito, non sapevo nemmeno di una funzione del genere  :)  grazie! ora dovrebbe andare giusto?

gpb01

... grazie! ora dovrebbe andare giusto?
   giusto !

Guglielmo
Search is Your friend ... or I am Your enemy !

ORSO2001

Ciao,

questo tipo di confronto:
Code: [Select]
if (0 <= analogico < 10)
non va bene.
dovrebbe essere:
Code: [Select]
if (0 <= analogico && analogico < 10)
e vale anche per gli else if.

iaccaro

Ciao,

questo tipo di confronto:
Code: [Select]
if (0 <= analogico < 10)
non va bene.
dovrebbe essere:
Code: [Select]
if (0 <= analogico && analogico < 10)
e vale anche per gli else if.

adesso provo immediatamente!!! grazie!!!

gpb01

In 'C' NON esiste la sintasi che hai usato tu e quello che hai messo tra parentesi fa tutt'altro ...

Immagina analogico = 15 allora ...

if ( 10 <= analogico < 20 ) viene interpretato, partendo da destra a sinistra, comparo analogico con 20, se è minore ho TRUE altrimenti ho false, dopo di che comapro tale valore TRUE o FALSE con 10 ... dato che TRUE su Arduno è 1 e FALSE è 0, con 15 la prima condizione da TRUE la seconda (10 <= TRUE) che sarebbe (10 <= 1) è sempre falsa ;=

Devi usare gli operatori booleani per unire DUE confronti separati ...

if ( (10 <= analogico) && (analogico < 20) ) ... quindi due confronti e un AND che a sua volta confronta i risultati ;)

Guglielmo

P.S.: vedo che nel tempo che io scrivevo tutta la "papparedella" hai avuto già risposte :D :D :D
Search is Your friend ... or I am Your enemy !

iaccaro

In 'C' NON esiste la sintasi che hai usato tu e quello che hai messo tra parentesi fa tutt'altro ...

Immagina analogico = 15 allora ...

if ( 10 <= analogico < 20 ) viene interpretato, partendo da destra a sinistra, comparo analogico con 20, se è minore ho TRUE altrimenti ho false, dopo di che comapro tale valore TRUE o FALSE con 10 ... dato che TRUE su Arduno è 1 e FALSE è 0, con 15 la prima condizione da TRUE la seconda (10 <= TRUE) che sarebbe (10 <= 1) è sempre falsa ;=

Devi usare gli operatori booleani per unire DUE confronti separati ...

if ( (10 <= analogico) && (analogico < 20) ) ... quindi due confronti e un AND che a sua volta confronta i risultati ;)

Guglielmo

P.S.: vedo che nel tempo che io scrivevo tutta la "papparedella" hai avuto già risposte :D :D :D
ahah si infatti era un mio errore banalissimo e non riuscivo a venirne a capo da ieri sera!!! grazie comunque perche' mi mancava l'interpretazione della lettura in true e false in ordine! sara molto molto utile per capire gli errori d'ora in poi! ed ora e' tutto funzionante! grazie!!! che belli questi forum :P

iaccaro

adesso provo immediatamente!!! grazie!!!
siamo andati perfetti!! risolto al primo colpo dopo la delucidazione!!! grazie!

Go Up