ciao atutti volevo chiedere se questa istruzione e scritta correttemente.
sono tutte variabili bool
se cand e' true, candel e' false
quando il tempo e' superiore a interval se cand e' sempre true candel diventa false .
e corretto come lo ho scritto?
cand = (analogRead(CAND) <= 400);
if (cand==true)
{
(candel = false);
prevmillis = millis();
}
else if (millis() - prevmillis <= Interval)
{
(candel = true);
}
else
(candel = false);
}
Non so se è corretto, per come l'hai descritto non riesco a capire se quello è il codice giusto.
Comunque chiarisco alcuni punti.
if (cond) else if (cond1) else
Il ramo "else" viene eseguito se quando sia "cond" che "cond1" sono false.
Il ramo "else if" viene eseguito quando "cond" è false e quando "cond1" è vera.
il ramo "if" viene eseguito quando "cond" è vera.
Detto in altri termini se "cond" è sempre vera "else if" e "else" non verranno mai eseguite.
prevmillis contiene l'ultimo valore di millis(), questo può essere usato nel momento in cui cand è false, in questo caso se si verifica la condizione "cond1" candel da false diventa true. Se invece cond1 è false si esegue il ramo "else" che assegna a candel il valore false.
Spero possa essere utile questa analisi.
Ciao.
grazie del tuo tempo nel rispondermi. vedo se riesco a essere piu chiaro
se cand e' inferiore a 400 e' true se superiore a 400 e' false.
se cand e' vera, candel diventa false
se cand e' false , candel diventa vera
cand = (analogRead(CAND) <= 400);
if ( cand == true) {
(candel = false);
}
else {
(candel = true);
fino a qui dovrebbe essere giusta.
la devo modificare in modo che :
candel resti false per un tot tempo,passato il tempo candel diventa true, se lo stato di cand resta true
quando cand diventa false candel diventa subito true
incomincio a correggere
scusami ma la mia ignoranza non ci arriva,
cosa intendi dire con ;
se hai di continuo
cand = (analogRead(CAND) <= 400); ??
cand = (analogRead(CAND) <= 400);
if ( cand == true) {
candel = false;
}
else {
candel = true;
forse e'piu' corretto cosi'
boolean boo;
int cand = (analogRead(CAND));
if(val <= 400){
candel = false;
}
else {
candel = true;
}
pero' forse e' un po' piu' lento di come e' scritto sopra , ma forse e' una mia impressione
Questo è un pezzo di codice ? E' solo una bozza ?
Sta dentro alla loop() ??
Io mi riferisco al tuo primo codice, NON è possibile che ad ogni post lo cambi. Oltretutto con solo un pezzetto. I due ultimi codici sono corretti (a parte le troppe tonde) ma... la tua domanda era sul primo codice, che di può essere corretto ma non fa quello che vuoi (probabilmente) e non è chiaro quel che vuoi fare.
Inoltre: la loop() viene chiamata di continuo, è dentro a un ciclo infinito... quindi ANCHE la lettura analogRead(CAND) viene fatta di continuo, a meno che la lettura non sia dentro ad un if
Secondo me è meglio se spieghi cosa vuoi fare.
Leggo l'analogico, se <= 400 ... che devi fare ? far partire un tempo dettato dal valore Interval ?!?
Quando il tempo finisce, allora deve rileggere ? O mentre il tempo è in quel intervallo leggi comunque ancora l'analogico e allora che deve fare ?
P.S. non capisco perchè insisti a mettere tonde ovunque. int cand = analogRead(CAND);
Per abbreviare la sintassi basta la lettura nell'if:
if (analogRead(CAND) <= 400)
{ candel = false;
}
else
{ candel = true;
}
Ma il resto ? Ripartiamo da questo allora ?
e un pezzo di codice,che devo modificare, si e ' dentro al loop(),e quindi viene letto ad ogni giro.
leggo il pin analogico, se e' <= a 400 la variabile diventa false
parte il tempo e quando il tempo e arrivato al valore interval la variabile diventa true
se il pin analogico e >400 diventa true
Scusa, non ti offedere, ma della tua variabile boolean che diventa true/false non mi interessa nulla.
Quello che ti chiedo è l'analisi di quel che devi fare.
Se la lettura analogica è <=400 devi far partire un timer, che sia con un boolean non importa.
Durante questo timer è importante analizzare ancora l'analogico ? se per caso >400 durante il timer, il timer comunque finisce ? Serve capire questo.
non mi devo offendere per nulla , perche' mai?
se sono ignorante in materia ed una persona mi aiuta non si ci deve offendere,
si deve leggere ancora il valore del pin analogico ,ed il timer parte quando e' <=400 e finisce quando arriva a interval
Non sono sicurissimo di aver capito quel che devi fare.
Per quel che ho capito io:
...
boolean candel=true;
...
void loop() {
if( analogRead(CAND) <= 400 )
{ if(candel==true) prevmillis = millis();
candel = false;
}
else
{ candel = true;
}
if( candel == false )
{ if (millis() - prevmillis > Interval)
{ candel = true;
}
}
}
Fatto cosi non è detto che arrivi a fine timer, perchè durante il timer se >400 termina il ciclo
se analog<=400 --> stato candel=false, parte timer
se analog >400 --> stato candel=true (eventuale timer partito "finisce")
se stato candel=false, timer attivo, e se arrivi a fine timer --> stato candel=true (timer finisce)
non cambia resta false,o fore sbaglio io qualcosa?
cambia la variabile in base a val ma non se val persiste <=400 non prende l interval
funziona se e' alta o se e basso la lettura del pin analogica,tipo pulsante
ho messo un serial print sul prevmillis e memorizza il tempo,
non cambia dopo il tempo impostato
boh ho riavviato il pc e ora funziona....chissa il perche
un ultima domanda sicuramente stupida, a livello di impegno del processore come tempo quale delle 2 e' piu' veloce emeno dispendiosa
int val=analogRead(CAND);
if( val <= 400 )
if( analogRead(CAND) <= 400 )
Ho fatto una correzione, primo la candel deve partire a true (la devi inizializzare a true)
Poi il prevmillis lo devi settare solo se non è già partito il timer, altrimenti finchè <400 oltre a mettere candel di continuo a false (inutile ma va bene) mette di continuo prevmillis a nuovo millis e non va bene
pippero1979:
un ultima domanda sicuramente stupida, a livello di impegno del processore come tempo quale delle 2 e' piu' veloce e meno dispendiosa
In teoria la riga unica, senza uso di variabile, ma non è detto. Il compilatore ottimizza il codice e magari in questo caso, visto che val non viene poi usata altrove, fa già il test in unica riga. Inoltre il codice C viene convertito in linguaggio macchina, ci sono dei passaggi che non vedi, la MCU usa dei registri interni, non sappiamo effettivamente le due forme come vengono tradotte in assembly (linguaggio della MCU)
perfetto, ho corretto come mi hai consigliato, grazie mille di tutto e buona serata
Di nulla. Prego. Buona serata anche a te. 