Rilevazione segnale analogico

gpb01:
>christian3280: per evitare un fastidioso "bug" del forum ti prego di leggere e di tenere conto, per il futuro, di quanto scritto QUI. Grazie :slight_smile:

Grazie Guglielmo, la prossima volta ridimensionerò le immagini.

GianlucaB:
No ho capito a cosa servono tutti questi componenti che ci hai infilato.
Comunque come fai a dire non funziona?
Se leggi direttamente la tensione che esce dal pwm ovvio che il led sarà sempre acceso, praticamente stai leggendo la tensione media del pwm.

Ciao Gianluca, ho soltanto messo un diodo in serie all'uscita PWM e una resistenza verso massa (2 componenti). Per quanto riguarda il funzionamento, tralasciando il fatto che questa tensione deve andare in acqua ( pensiamo per assurdo di sostituire l'acqua con un pulsante, ripeto una condizione completamente diversa per provare se e come Arduino può leggere una tensione non continua generata da se stesso), anche se scollego l'ingresso analogico a0, il led si accende sempre. Per questo dico che non funziona, per questo insisto che molto probabilmente il codice è scritto male e non funzionerebbe neanche in una condizione ottimale. Magari, potresti farmi degli accorgimenti riguardo il codice, così andiamo avanti. :wink:
Per adesso voglio seguire l'idea che mi ha suggerito Claudio

Il codice nel messaggio #29 è sbagliato:

int ricevitore = A0;
int soglia = 100;
int led =2;
int emet=6;
void setup()
{
  pinMode(led, OUTPUT); // LED
  pinMode(emet, OUTPUT); // EMETTITORE
}

void loop()
{
  int ricevitore = analogRead(ricevitore);
  analogWrite(6, 127);
  millis();
  if(ricevitore <= soglia)
    {
    digitalWrite(led, HIGH);
    }
  else
    {
    digitalWrite(led, LOW);
    }
  delay(200);
}
  • ERRORE: nella lettura confondi il pin con il valore letto con analogRead;
  • ERRORE: dovrebbe essere analogRead(pin_IN)>=SOGLIA, altrimenti funzionerà al contrario;
  • millis() non fa nulla;
  • le costanti vanno scritte maiuscole, per distinguerle dalle variabili, ed è bene anche distinguere le definizioni dei pin dal resto;
  • fino a 255 è sufficiente una variabile di tipo byte;
  • analogRead può essere usato direttamente, senza scrivere in una variabile il valore letto;
  • impara a evitare l'uso incondizionato del delay();
  • i pin usati in PWM non necessitano di pinMode, perché è integrato nella funzione analogWrite(): così hanno scelto... ;
  • il PWM puoi impostarlo una volta sola nel setup(); dopo, comunque, puoi cambiare il valore;
  • definisci emet=6, ma poi usi direttamente 6.

Il risultato è questo:

byte pin_IN  = A0;
byte pin_LED = 2;
byte pin_OUT = 6;
byte SOGLIA = 100;
unsigned long t_lett=0;

void setup()
{
pinMode(pin_LED, OUTPUT); // LED
analogWrite(pin_OUT, 127);
}

void loop()
{
if(millis-t_lett>199)
  {
  t_lett=millis();
  if(analogRead(pin_IN)>=SOGLIA)
    {
    digitalWrite(pin_LED, HIGH);
    }
  else
    {
    digitalWrite(pin_LED, LOW);
    }
  }
}

Leggi bene tutto e impara, non copiarlo solamente!

Comunque confermo che la lettura andrebbe effettuata con un circuito esterno, usando un transistor o un LM358, perché analogRead leggerà un valore casuale a seconda dello stato alto o basso dell'uscita PWM al momento della lettura.
Inoltre, senza un condensatore in serie, un segnale che fa su e giù tra 0V e 5V se ha un duty cycle del 50% ha una componente continua di 2,5V. Gli ingressi di Arduino Uno, d'altra parte, vogliono tensioni positive tra 0 e 5V...

Forse basta fare una serie di letture ad intervalli regolari, e verificare se almeno una lettura ha superato la soglia.

Esempio ogni 5 secondi eseguo 5 letture di fila una dietro l'altra e verifico se almeno una delle letture ha superato la soglia.
Se almeno una ha superato la soglia accendo il led altrimenti lo spengo.

Però credo che comunque il pwm è talmente veloce, che quando c'è conduzione, la lettura analogica rilevi la media del pwm che nel caso di duty al 50% sarà appunto 2,5V.
Quando invece non c'è conduzione, la lettura sarà circa 0V.
Quindi c'è ampio margine per discriminare la presenza del liquido

Datman:
Leggi bene tutto e impara, non copiarlo solamente!

Comunque confermo che la lettura andrebbe effettuata con un circuito esterno, usando un transistor o un LM358, perché analogRead leggerà un valore casuale a seconda dello stato alto o basso dell'uscita PWM al momento della lettura.
Inoltre, senza un condensatore in serie, un segnale che fa su e giù tra 0V e 5V se ha un duty cycle del 50% ha una componente continua di 2,5V. Gli ingressi di Arduino Uno, d'altra parte, vogliono tensioni positive tra 0 e 5V...

Ciao Datman, voglio ringraziarti innanzitutto per i preziosi aiuti che mi stai suggerendo. Alcuni degli errori che hai giustamente notato, avrei potuto evitarli, ma ho scritto talmente tante volte il codice che non ho posto abbastanza attenzione al risultato; ovviamente nella programmazione bisogna essere precisi, senza se, e forse.
Sto leggendo attentamente il codice che hai scritto e la parte software adesso mi è più chiara. Mentre per quanto riguarda l'hardware, ho dei dubbi:

  • Se metto un condensatore tra l'uscita e la massa, questo segnale non verrà "livellato", cambiando la forma del segnale stesso, rendendolo non più "squadrato" ?
  • Se la lettura andrebbe fatta con un circuito esterno, non sarebbe "sprecato" usare Arduino solo per degli eventuali comandi di azionamento relè e/o led? Tantovale credo sia meglio utilizzare l'elettronica con porte logiche e transistor, evitando Arduino. Magari il suggerimento di Gianluca potrebbe funzionare.
    Detto ciò farò diverse prove su una breadboard fisica: voglio innanzitutto provare a far fare il tutto ad Arduino. Se non va,(ed è probabile) proverò tramite un circuito esterno, a generare questa tensione e farla rilevare da Arduino, e infine proverò anche a usare un transistor per la lettura ( non ho idea di come farlo, però ci provo :smiley: )
    Grazie di tutto per ora

in questa discussione ho seguito poco, ma mi è venuto in mente che mesi fa, non ricordavo quando, c'è stata un'altra discussione su un argomento simile, e stavo pensando di consigliare allo OP di chiedere a quell'altro, che magari nel frattempo qualcosa aveva scoperto

invece qualcosa ho scoperto io:
la conferma della dura legge delle tre pagine

prima legge di Nelson (che sono io): se una discussione arriva a tre pagine c'è sotto un problema di fondo

la discussione di qualche mese fa la ho cercata e la ho trovata, anch'essa di tre pagine (e non è una coincidenza)
con esattamente lo stesso problema e quasi esattamente gli stessi suggerimenti
eccola:
https://forum.arduino.cc/index.php?topic=701159.msg4711831#msg4711831

e, scoperta scoperta, anche con esattamente lo stesso OP
che NON ha messo in pratica nessuno dei consigli che ha ricevuto e adesso, dopo 6 mesi è ritornato con le stesse domande

e io posso solo ripetere quello che avevo detto allora:
se lo OP conosce (e questo lui afferma) qualcuno che è riuscito nell'intento, gli basta chiedere a costui

io per me ne ho appena aggiunto un'altro al mio killfile

Ciao Standaroil, tempo fa feci una domanda molto simile in questo forum, per l'appunto chiesi se Arduino fosse in grado di inviare una tensione non continua e di saperla leggere da un suo ingresso nello stesso momento. Specificai il fatto che ero ( e sono) un semplice amatore, mi ha incuriosito Arduino e volevo provare a fare qualcosa di più complesso.
Da li sono partiti diversi suggerimenti, molti dei quali ne ho fatto tesoro. Purtroppo per vivere faccio ben altro, sto lontano da casa mesi, per cui non ho materialmente il tempo e la possibilità di dedicarmi ad Arduino che considero un hobby. Detto ciò ho voluto aprire una nuova discussione, perché non ho ritenuto opportuno riaprire la vecchia.
Penso che un forum sia uno spazio dove sia possibile confrontarsi, chiedere e dare suggerimenti e idee.... Però da quello che hai scritto (soprattutto nel finale) mi fa pensare ai cosiddetti "cattivisti" del web, cui tengono atteggiamenti distruttivi, anziché costruttivi.
Spero di sbagliarmi, perché se questo è l'approccio con cui un utente competente vuole avvicinare un amatore alla bellezza dell'elettronica e informatica, ahimè, siamo messi male.
una buona serata :slight_smile:

Buongiorno a tutti, questa mattina ho cominciato a fare una prova applicando il codice che mi ha gentilmente corretto Datman. Ho utilizzato Arduino direttamente e collegato i componenti su una breadboard. Sfortunatamente non dispongo di un oscilloscopio, ho fatto un paio di misure utilizzando un multimetro.
Detto ciò vi metto in allegato il circuito che ho disegnato a mano ( perdonatemi se non è molto chiaro).
Il led di segnalazione non si accende, tra il piedino 6 (PWM) e gnd ho 2.4V, quindi questa tensione passa attraverso un diodo 1n4148 e un condensatore posti in serie. Ho anche inserito una resistenza da 100k verso massa. Il tutto va all'ingresso analogico A0. Se misuro verso massa sul piedino A0 ho 2.1Vac. Ciononostante il pinLed non da tensione per accendere il Led. Continuerò a provare come suggeritomi nei post precedenti.
Grazie per eventuali suggerimenti

// Level liquid
int val =0;
int threshold=20;
bool flag=false;


void setup() {
   pinMode(3, OUTPUT);
   pinMode(13,OUTPUT);
   analogWrite(3, 127);
  // Serial.begin(9600);
}

void loop()
{
 flag=false;
 for (int i=0; i <= 10; i++)
  {     
   val = analogRead(A3);  
  // Serial.println(val);        
   delay(5);
     if (val>threshold)
     {
       flag=true;
     }
  }
 
 if(flag)
 {
  digitalWrite(13, HIGH); 
 }
 else
 {
  digitalWrite(13, LOW);
 }
 
delay(1000);
}

Il codice l'ho provato su basetta, mettendo i 2 fili dentro ad un barattolino di acqua.
L'unica cosa che serve è una resistenza da 10K tra l'ingresso A3 e la massa, per tenere il livello basso quando non c'è conduzione.

Il pwm è sul pin D3 e il led sul pin D13, l'ingresso analogico A3

Le 2 righe commentate relative alla seriale servono per leggere a monitor il valore analogico, che nel mio caso era circa 300 con i fili dentro al barattolo, e ovviamente zero con i fili fuori.

Buongiorno a tutti,
questa mattina ho applicato il suggerimento di GianlucaB sulla breadboard, l'ho testato in un bicchiere d'acqua e funziona! :slight_smile: Continuerò a provarlo su dei recipienti più grandi, per verificare che sia effettivamente applicabile in sistemi più grandi. Inoltre lo verificherò presso un laboratorio di elettronica con un oscilloscopio, voglio essere sicuro che la tensione che arriva in acqua è quella adatta, onde evitare elettrolisi.
Per quanto riguarda la parte software, voglio studiarlo meglio e più attentamente, non conosco alcuni termini in questo codice ( eh, ho molto da imparare :grinning:).
Voglio ringraziarvi tutti per l'aiuto che mi avete dato e in particolare a Gianluca che mi ha fatto cominciare la mattina con il buon umore! :wink:

La resistenza da 4,7k in serie al led e troppo alta.

Arco_500:
La resistenza da 4,7k in serie al led e troppo alta.

hai ragione, ho messo alla fine una R da 220 Ohm :slight_smile:

P.s. il led D13 non é casuale, ma é per utilizzare il led presente sulla board, ed evitare di montarne uno su breadboard, per fare prove.
Avrai notato che si accende il led giallo sulla board.

GianlucaB:
P.s. il led D13 non é casuale, ma é per utilizzare il led presente sulla board, ed evitare di montarne uno su breadboard, per fare prove.
Avrai notato che si accende il led giallo sulla board.

si, quella del led integrato è la prima lezione su Arduino :wink: , grazie ;D

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.