Come è possibile eliminare le oscillazioni nei cicli?

Mi spiego in breve,
devo leggere un valore di tensione analogico che va da 0 a 5v, mi interessa la fascia 2v-4v e in questa fascia faccio accendere il mio led.
Se questo lo implemento con un semplice ciclo ad esempio if avrò
if (V1>2 && V1<4)
{
digitalWrite(Led, HIGH);
}
Il problema è che ai margini avrò un acceso spento che potrebbe essere molto frequente.
Vorrei creare a livello software una specie di isteresi, in modo tale che basta una volta che il valore di tensione sia sotto i 2v o sopra i 4v che il led si spenga.
Non voglio usare delay ecc.
Avete un idea?

ciao.
Potresti controllare il cambio di stato con una variabile e cambiare la "soglia" al cambio di stato :~
cerco di spiegarmi...

soglia min = 2
soglia max = 4
-se V1 compresa tra soglia min e siglia max ===> led acceso (fin qui come hai detto tu...), stato "on" , soglia min = 2, soglia max=4
-se V1 < soglia min e stato = on ===>stato = off e soglia min = 2,2
-se V1 >soglia max e stato =on ===> stato = off e soglia max = 3,8

E soprattutto SE non mi sono bevuto il cervello dovrebbe funzionare XD XD XD

ciao
pippo72

credo di aver capito quello che vuoi dire, in questo modo avrei un 0.2v di range che dovrebbe garantirmi una più stabilità, ma poi le soglie dovrebbero ritornare a 2v e a 4v, magari dopo che soglia minima è sotto 1.8v e soglia max sia sopra i 4.4, questo mi comporterebbe però aggiungere altri cicli di if.
Comunque è una prima soluzione grazie, magari ne esistono altre più''pulite'.

ciao.

Franckx:
...
ma poi le soglie dovrebbero ritornare a 2v e a 4v, magari dopo che soglia minima è sotto 1.8v e soglia max sia sopra i 4.4, questo mi comporterebbe però aggiungere altri cicli di if.
...

Partendo con led spento e stato off è sufficente correggere il primo if:
-se V1 compresa tra soglia min e soglia max e stato "off"===> led acceso , stato "on" , soglia min = 2, soglia max=4
Te la cavi con 3 if.

magari ne esistono altre più''pulite'.

sono perfettamente d'accordo :slight_smile:

ciao
pippo72

Franckx:
Mi spiego in breve,
devo leggere un valore di tensione analogico che va da 0 a 5v, mi interessa la fascia 2v-4v e in questa fascia faccio accendere il mio led.
Se questo lo implemento con un semplice ciclo ad esempio if avrò
if (V1>2 && V1<4)
{
digitalWrite(Led, HIGH);
}
Il problema è che ai margini avrò un acceso spento che potrebbe essere molto frequente.
Vorrei creare a livello software una specie di isteresi, in modo tale che basta una volta che il valore di tensione sia sotto i 2v o sopra i 4v che il led si spenga.
Non voglio usare delay ecc.
Avete un idea?

devi aggiustare un po il tutto l'analogRead va da 0 a1023 devi stabilire a che valore corrisponde il 2 e il 4 volt
dovdrebbe essere 409 per il 2 volt e 818 per il 4 volt

per l'isteresi basta un if tipo
if (analogRead > 407 && analogRead < 411) analogRead = analogRead + isteresi;

Elrospo tieni presente che la conversione in decimale io l'ho fatta già a monte quindi il valore 0-1023 me lo lascio alle spalle.
Esplicita quell'analogRead = analogRead + isteresi

devi decidere tu che tipo di segnale devi leggere, e una cosa che fluttua a casaccio o è una cosa che fluttua in maniera lineare tipo sonda termica,

potresti portare una variabile a 1 (k=1) appena supera la soglia dei 2,00 volt (insieme all'accensione del led)
e poi mettere in sequenza:
verificare la lettura analogica
if (k == 1) lettura analogica = lettura analogica + 0.1) // (0.1 volt o il valore che decidi tu)
verificare la lettura analogica
if (lettura analogica < 1.95 || lettura analogica > 2.05) k=0; // || sta per l'operatore or

in questo modo dovresti dare una " calmata " al led troppo ballerino intorno ai 2 volt,

cosa simile va fatta per la lettura intorno ai 4 volt

Ma in questo modo non avrei un k ballerino?
Si è un sensore di temperatura