Buongiorno;
Come da titolo dove trovo indicazioni su tutte quelle istruzioni, sempre se ho detto giusto, del tipo =, ==; !=, ecc...
C'è qualche post, articolo dove viene spiegato cosa fanno, come vanno utilizzate e dove?
Ho appena usato S4A per realizzare uno sketch copiato da un libro che non spiega molto bene cosa fanno queste istruzioni.
Usando S4A, programmazione a blocchi, nonostante alla pressione del pulsante collegato sul pin n.2 mi veniva rilevata la condizione true non funzionava il circuito relativo, non si accendeva il LED presente sul pin n.10.
Ho riscritto(copiato) lo stesso esercizio con Arduino IDE caricato sketch fatto test e voilà funziona.
Di seguito riporto scketch relativo dove si fa uso di alcune istruzioni che ancora mi sono poco chiare.
Sono sicuro che i più esperti capiranno subito di cosa si tratta.
(Un pulsante che se premuto permette di accenedere un LED e che quest'ultimo rimanga acceso anche se il pulsante viene rilasciato. Ad un'ulteriore pressione del pulsante il LED si spegne).
//Costanti
const int pulsante = 2;
const int LED = 10;
//variabili
int statoPulsante=0;
int statoPulsantePrec=0;
int statoLED = 0;
void setup()
{//Imposta linea 2 come input
pinMode(pulsante, INPUT);
//Imposta linea 10 come uscita
pinMode(LED, OUTPUT);
}
void loop()
{//Legge il valore di input del pulsante
statoPulsante=digitalRead(pulsante);
//Confronta il valore logico di imput con il precedente
if(statoPulsante!=statoPulsantePrec){
//se è diverso, controlla se è uno stato di salita.
if(statoPulsante==HIGH){
//se lo stato del pulsante è sul fronte di salita
//Commuta l'uscita
statoLED=!statoLED;
digitalWrite(LED, statoLED);
}
}
//salva lo stato attuale in stato precedente per il prossimo confronto
statoPulsantePrec = statoPulsante;
}
Gli operatori si usano all'interno delle "espressioni" in C, giusto? In arduino è la stessa cosa?
Cioè dove possono essere usati, in che sezioni?
IF ed else e poi?
Jamming:
Cioè dove possono essere usati, in che sezioni?IF ed else e poi?
Sintesi operatori:
Aritmetici: + - * / %
Bitwise: >> << ~ & | ^
Relazionali: < > <= >= != ==
Logici: and && or || not !
Con tutti si costruiscono espressioni, il cui risultato dipende dall'operatore e dalla precedenza esistente tra essi (sempre modificabile/impostabile tramite parentesi).
In particolare i relazionali confrontano due cose aritmeticamente, e danno come risultato 1 (vero, true) se il confronto è vero, o 0 (falso, false) se è falso, quindi:
10 == 10 -> risultato 1
10 > 90 -> risultato 0
Ora, le istruzioni di controllo del flusso (quindi if/else e switch per fare delle scelte, e for, while, do/while per realizzare ripetizioni) prevedono tutte una parte in cui "testare" se qualcosa è falso (zero) o vero (uno o comunque diverso da zero).
Questa parte è il posto ideale dove scrivere un confronto tramite operatori relazionali, anche perché ad esempio una if risulta immediatamente corrispondente alla equivalente descrizione in italiano:
if (a > 20) { ..... } else { ..... }
SE a è maggiore di 20 ..... altrimenti .....
Tutta l'apparente complessità deriva dall'applicazione e combinazione di questi due concetti.
nid69ita:
Ripeto, Arduino si programma in C/C++ quindi ovviamente le regole del C valgono in Arduino
gli operatori di confronto li trovi in -> if, while, for
Grazie, nel dubbio chiedo sempre per conferma.
Mi sto informando sugli operatori...
Grazie ancora un passo alla volta miglioro la mia conoscenza su Arduino.
pgiagno:
Quali sono le istruzioni che ti sono poco chiare?
Ciao,
P:
Queste istruzioni != e =!
!= significa diverso da... giusto?
=! invece cosa significa?
Il codice l'ho copiato da un libro quindi non conoscendo ancora bene l'uso degli operatori e loro significato mi confondo un pochino... chiedo perdono!!
if(statoPulsante!=statoPulsantePrec){
//se è diverso, controlla se è uno stato di salita.
if(statoPulsante==HIGH){
//se lo stato del pulsante è sul fronte di salita
//Commuta l'uscita
statoLED=!statoLED;
digitalWrite(LED, statoLED);
Bitwise: >> << ~ & | ^
Relazionali: < > <= >= != ==
Logici: and && or || not !....
[/quote]
Grazie molte, mi sei stato di grande aiuto per capire altri piccoli particolari.
Adesso mi tocca solo trovare un pò di materiale per esercitarmi, esempi pratici a cui mettere mano.
!= è un operatore relazionale (diverso da)
mentre =! è un assegnamento più un operatore logico not scritti appiccicati... per questo consigliano di lasciare sempre uno spazio attorno all'assegnamento, rileggila così:
statoLED = !statoLED;
Che si legge come: assegno alla variabile 'statoLED' la negazione della verità o falsità di 'statoLED'.
Se 'statoLED' vale 1, ai fini della verità o falsità è vera, l'operatore ! calcola l'opposto (cioè falso -> 0), è un modo stringato per passare da 0 a 1 o viceversa.
NOTA: da qualche parte si può trovare scritto true/false, è esattamente la stessa cosa di 1/0. E anche HIGH/LOW sono la stessa cosa di 1/0.
switch() accetta solo valori numerici standard, quindi non ci puoi scrivere test e confronti
potresti trovare calcoli fatti con i bit, sono molto difficili da capire per chi è alle prime armi. Meglio leggere un libro sul C che lo spieghi bene; in Arduino ci sono funzioni per semplificare la gestione dei bit come bitSet(), bitClear() etc.
potresti trovare scritto un if alquanto particolare, var= test ? vero : falso; (operatore ternario)
Ad esempio se hai un if del genere
if( x>5)
{ y=4;
}
else
{ y=10;
}
può essere scritto cosi: y= x>5 ? 4 : 10;
sintetizza molto ma rende anche il codice non molto leggibile. Sarebbe da usare solo in casi eccezionali.
Magari non confondiamo con gli statement di branch
Non servono allo stesso scopo
È cattiva programmazione edit usarli edit al posto di "if" "else"
Il forum comincia a partire per la tangente
Adesso oltre ai logout difficili li fa anche automatici:
Dopo avermi fatto fare il post senza login, mi ha chiesto il login per editarlo 10 secondi dopo
Signori, se l'OP ha bisogno di un corso di C/C++ si iscrive ad un tale corso ...
... NON è lo scopo del forum fare "corsi", ma aiutare su problematiche specifiche quindi, dato che si è detto anche troppo, chiudo il thread.