Salve a tutti, avrei la necessità di contare una gocciolina d'acqua che cade all'interno di un tubo ci circa 20 mm di diametro, ho guardato su internet e ho visto qualche esempio o con dei diodi laser oppure con le forcelle quelle classiche credo siano delle piccolo fotocellule con un Led da una parte e il ricevitore dall'altra, ma sicuramente sapere meglio di me.
Avendo propio due forcelle ho creato il tubicino e le ho posizionate leggermente sfalsate per far si che la goccia se non passa da in una passa nella seconda, vi allego la foto.
nel programma non ho fatto altro che impostare due variabile e provando sia con digitalRead che con analogRead, utilizzando il monitor seriale per vedere se legge... ecco il problema non legge nulla qualcuno mi può indicare qualche esempio per leggere le gocce d'acqua ? ho anche a disposizione una sorgente laser e il corrispondente ricevitore ma dovrebbe essere la stessa cosa... sbaglio qualcosa dovrei utilliare altri comandi al posto dei Read?
Ciao, so che sei un vecchio utente del forum , ma ... non riesco a trovare il tuo post di presentazione, per cui, cortesemente, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiederei di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO che, in tutti questi anni, è piuttosto cambiato ... Grazie mille anticipatamente.
Guglielmo
Fatto, è un pò che non faccio login sul forum, ma 99 volte su 100 riesco risolvere il problemi facendo una ricerca sempre qui sul forum prima di disturbare casomai con domande doppie.
Senza lo sketch è difficile fare ipotesi.
ma lo sketch è proprio solo da test molto semplice:
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
}
void loop() {
int sensorValue = digitalRead(2);
Serial.println(sensorValue);
}
Chiaramente se chiudo con un bacchettino le fotocellule il programmino funziona, è il passaggio di una goccia d'acqua il problema
Il problema è che tu stampi in continuazione. Prova a stampare solo quando passa la goccia. Poi sei sicuro che con l’acqua il sensore funzioni? Magari per il fatto che L’ acqua è trasparente non rileva.
Allora, hai ragione non ci avevo pensato forse la goccia passa velocissima e il monitor non me la scrive, io andavo a scorrere a vedere se c'era il numero ma non l'ho mai visto.
Comunque domani provo sicuramente e ti faccio sapere.
Nel frattempo ho trovato uno sketch e l'ho provato funziona.....
E' complicato per le mie conoscenze ma vedrò di capirci qualcosa se ho bisogno chiedo sicuro..
/* This sketch uses a digital pin out to drive the LED of an optical limit switch
* and an interrupt pin from the Arduino board that is connected to the photodetector of the same optical limit switch.
*/
int LEDpin = 13; // output, lights the IR LED
volatile int drops = 0; // define drop count variable
//unsigned long previousDrops = 0; // define drop count variable
volatile boolean eventsR = LOW;
volatile boolean eventsF = LOW;
//unsigned int currentTime = 0; // define variable for timestamping
//unsigned int previousTime = 0; // define variable for timestamping
//unsigned int duration = 0; // define variable for timestamping
//volatile unsigned long last_micros;
void setup() {
Serial.begin(9600); // setup serial
pinMode(LEDpin, OUTPUT); // sets the digital pin as output
attachInterrupt(digitalPinToInterrupt(2), eventR, RISING); // IMPORTANT: reattach pin to interrupt for the next event
eventsR = LOW;
eventsF = LOW;
}
void loop() {
//currentTime = millis(); // timestamp this event
if (eventsR == HIGH) // if new drop leading edge
{
detachInterrupt(digitalPinToInterrupt(2));
if (eventsF == HIGH) // if new drop falling edge
{
// detachInterrupt(digitalPinToInterrupt(2)); // IMPORTANT - detach interrupt and reattach it in the main look, to avoid false triggers
// currentTime = millis(); // timestamp this event
//Serial.print("drop count = "); // print cont on the screen
Serial.println(drops); // print count on the screen
// Serial.print(" ; duration = "); // print cont on the screen
// Serial.println(duration); // print count on the screen
//previousDrops = drops;
eventsR = LOW;
eventsF = LOW;
//duration = currentTime-previousTime; // calculate duration
// previousTime = currentTime; // reset previousTime for next duration
delay(20);
//attachInterrupt(digitalPinToInterrupt(2), event, RISING); // IMPORTANT: reattach pin to interrupt for the next event
attachInterrupt(digitalPinToInterrupt(2), eventR, RISING);
}
else
{
delay(20);
attachInterrupt(digitalPinToInterrupt(2), eventF, FALLING);
}
}
}
void eventR() {
//detachInterrupt(digitalPinToInterrupt(2)); // IMPORTANT - detach interrupt and reattach it in the main look, to avoid false triggers
eventsR = HIGH;
}
void eventF() {
//detachInterrupt(digitalPinToInterrupt(2)); // IMPORTANT - detach interrupt and reattach it in the main look, to avoid false triggers
drops += 1; //increment number of drops
eventsF = HIGH;
}
/*
void debounce_event() {
if((long)(micros()-last_micros) >= 7000){
event();
last_micros = micros();
}
}
*/
Se la frequenza delle gocce è importante potresti far cadere le gocce in un cucchiaio di una bilancia che raggiunto un certo peso con un numero di gocce noto si muove verso un trigger a forcella che da un impulso scaricando contemporanea il contenuto del cucchiaio
no no, quello non è importante devo solo contarle e diciamo che cadono a vari secondi di distanza tra loro
oppure far cadere la goccia su una superficie trasparente inclinata a 45 gradi e utilizzare un sensore del genere
l'interrupt è mandatorio
La goccia mi serve integra perché deve entrare in una soluzione in un flacone posto al di sotto, in commercio ci sono dei contagocce per le persone non vedenti ma non conosco in che modo leggono le gocce.
Naturalmente la mia applicazione non ha nulla a che vedere con il settore medico ne con quello alimentare, ho provato a scrivere sul monitor seriale solamente quando si legge la goccia come indicato da @nello791 e funziona anche se mi sembra sia meno sensibile rispetto al codice che avevo postato prima, forse è solo una mia impressione oppure ch'è un motivo logico ma che io non so.
Ora però ho il problema che la lettura di queste forcelle è molto ristretta, cioè basta che la goccia cada spostata di pochissimo e lui non la legge ho misurato con un bacchettino e il "fascio di luce" ha un larghezza di pochi decimi di millimetro, anche se accoppio sfalsati due sensori non basta(potete vedere le foto)mi servirebbe una barriera più larga diciamo 2 o 3 millimetri. Conoscete un sensore che si avvicini a questa misura?
Se hai bisogno di misurare una sezione di x millimetri senza soluzione di continuità, per quanto ne sò l'unico tipo di sensori in grado di farlo sono quelli laser, ma il prezzo cresce di almeno un paio di ordini di grandezza..
Se deve essere una cosa economica, la cosa più semplice probabilemente è fare un array di sensori IR sufficientemente fitto e magari del tipo da 1.8mm o meglio ancora SMD.
@marchino283
Dai un'occhiata a questi prodotti ad esempio.
Il pitch minimo tra un sensore ed il successivo è di 4mm, considerato il cono di emissione dovrebbe coprire tutto.
ho provato i sensori che allego qui sotto, sia accoppiati che uno di fronte all'altro ma non funzionano, non riesco a trovare ora proverò con il laser...
secondo me con quello che ti ho postato io sopra, montato in modo corretto dovresti farcela ugualmente
a no scusa quello non va bene, la goccia non deve toccare nulla
Due domande
Il tubo da circa 20mm di diametro che citi all'inizio è aperto alle due estremità?
Eventualmente si potrebbe ridurre di diametro e chiudere in alto?
E ancora
Hai pensato di "inondare" il tubo di ultrasuoni e sentire le differenze dell'eco con e senza goccia ?
Provo a spiegarmi meglio, in alto ho un flacone con contagocce che ogni tanto fa uscire una gocciolina di acqua o simile, questa gocciolina entra in un flacone di vetro che la bocca ha un diametro di circa 20 mm posto chiaramente sotto, io avevo creato un tubo per alloggiare le forcelle ottiche e leggere la caduta delle gocce, e ne avevo messe due per cercare di coprire l'area maggiore perché il contagocce in alto non è fisso, diciamo che si può posizionare con uno scarto di circa 1 mm.
Avevo pensato di leggere il peso del flacone e leggere la variazione di peso ma credo che la variazione di peso sia troppo piccola per utilizzare i sensori reperibili facilmente parliamo di una variazione che si aggira(se va bene) in 0,05 gr anche meccanicamente deve essere fatto molto bene.
Per gli ultrasuoni non ci avevo pensato proverò.... ma le forcelle leggono bene devo solo trovare una "barriera" Ir che mi copra 2-3 millimetri(per sicurezza) anche non continui diciamo che se controllo ogni 0,5 mm mi andrebbe bene. per il diametro si posso ridurlo anzi il tubo in foto ha il diametro di 1 cm perché le forcelle le ho trovate massimo di quella grandezza. mal che vada ne monterò 4 o 5 di quella grandezza e copro il tutto ma devo procurarmi quelle senza pcb altrimenti il tubo viene alto 10 cm...
Ah sì certo
Esiste il problema dell'altezza
Io avevo pensato a un tubo piuttosto lungo e stretto
Il passaggio della goccia a velocità sufficiente provoca una differenza di pressione tra alto e basso nel tubo
Un pressostato differenziale fa il resto...
Il problema è l'altezza necessaria a questo
Per il pressostato si potrebbe usare un piccolo altoparlante, lo spostamento del cono provoca segnale nella bobina
Pensaci a misurare la eco dehli ultrasuoni con e senza goccia, usando naturalmente un variometro...
Ma come generi la goccia ?