Conversione livello serbatoio

Ciao a tutti, spero che questa domanda sia fatta nella sezione giusta..
ho cercato e trovato sul web un codice per Arduino 1, che mi permette attraverso il sensore ad ultrasuoni ermetico A02YYUV a leggere una distanza in millimetri.
Siccome vorrei sfruttare questo codice per avere una lettura del serbatoio carburante della mia barca, volevo chiedervi se è possibile convertire la lettura da mm, in mm/Cm cubici, poiche' conosco il volume del serbatoio rettangolare che e' di 43000 cm/cub.
Se si puo' mi fate qlc esempio.
Grazie

Devi moltiplicare l'altezza per la superficie (ammesso che la superficie sia costante rispetto all'altezza).

ciao Datman, quindi tipo se l'altezza e' 50mm, ed il liquido e' una superficie tipo le misure del serbatoio 65 x 36 larghezza * lunghezza, quindi 50 x 2340 = 117000 < cm/cub?
Giusto

Per cominciare se le misure sono in millimetri i risultati saranno mm^3 non cm^3

Comunque se il sensore è in alto al serbatoio per avere il livello devi togliere la misura dell'altezza del sensore

A quanto già ti hanno detto, aggiungo un paio di mie considerazioni.

Primo, io a suo tempo feci un progettino di un misuratore di livello del serbatoio di una macchina espresso (questo), ma un serbatoio in una barca non è un qualcosa che sta fermo, per cui se rilevi la distanza superiore del liquido, come pensi di gestire i movimenti della benzina che per le onde ed i movimenti della barca darà delle letture ben poco significative? A meno che tu non ritenga poter misurare il livello solo a barca totalmente ferma, su acqua priva di onde, dovresti fare una serie di misurazioni e poi calcolare un qualche valore medio (ma non la vedo molto facile né molto affidabile).

Secondo, personalmente non metterei nulla di elettrico vicino ad un serbatoio di benzina, ma sono io forse eccessivamente prudente...

Concordo.

@tomcat21 ma non puoi usare un classico sensore di livello a galleggiante?
Tipicamente hanno un valore che varia da 0 a 190Ohm.
Lo inserisci in un partitore di tensione ed hai il tuo riferimento del livello in modo sicuramente più affidabile di un ultrasuoni (che secondo me durerebbe davvero poco con i vapori della benzina che saturano il serbatoio).

Grazie a tutti per i consigli, ho già un galleggiante con strumento, pensavo di fare con quel sensore qualcosa di piu' preciso, il galleggiante risente molto del rollio e beccheggio della barca, infatti l'ago del misuratore va su e giu' continuamente.
Volevo usare questo, perchè pensavo che facendo la lettura in uno spazio di soli 26cm fosse molto piu' preciso del galleggiante.
Non dovrebbe essere che il volume d'aria che c'e' tra il top serbatoio/sensore ed il carburante, a differenza delle oscillazioni del liquido rimanga sempre uguale?
Certo non e' che si esce con mare forza 8 :slight_smile:
Cmq l'idea di utilizzare lo stesso galleggiante non e' malvaggia, pero' dovrei capire come fermare quelle fluttuazioni.

Con un sensore sonar non è che leggi il volume, ma la distanza della superficie del liquido rispetto al sensore, quindi il problema dell'oscillazione rimane tale e quale.

Qualcosa che sia indipendente... forse pesando la quantità di liquido con una cella di carico, ma anche in quel caso la lettura oscillerebbe per l'inerzia del serbatoio+benzina.

Credo che l'unica strada percorribile sia la "media" di più letture su un certo arco di tempo ... letture "istantanee" sono comunque influenzate dal movimento oscillatorio del serbatoio :roll_eyes:

Guglielmo

Ma di solito il livello del serbatoio non andrebbe controllato prima di partire? :rofl:

ma figurati!.. ho un serbatoi da 44lt, sempre quasi pieno, ed in piu tengo a bordo una tanica di emergenza da 10lt, a mare non si scherza!
Cmq, visto che con Arduino Uno ci ho fatto gia' un Fuel Gauge x il consumo del carburante (flussometro)
Amperometro servizi
Voltmetro Servizi
Voltmetro batterie.... e qui mi sono detto perche' non mettere anche un bell'indicatore digitale per il serbatoio?
@gpb01, come faccio a fare una media della lettura sul galleggiante?

Scherzavo eh.. :sweat_smile:

Per la media ci sono diverse tecniche, la più semplice è quella aritmetica: fai n misure ravvicinate, le sommi e poi dividi per n.

Poi ci sono medie più "elaborate" come ad esempio la media ponderata o quella a finestra mobile, ma non saprei dire se sono più adeguate al tuo caso oppure no.

Per farlo bene, devi farlo come sugli aerei, con 4 galleggianti ai 4 angoli del serbatoio: li metti in serie e ottieni una somma indipendente dalla posizione del mezzo.

E si Datman, ci mettiamo 4 galleggianti, cosi non ci entra piu benzina :slight_smile:
Va bhe, come dice Cotestatnt, faro' un array sulla lettura del galleggiante, mi sembra la cosa piu' logica

#define PIN A0
int valori[10]; 
int array;
int somma;
float media;

void loop(){
  
  for(int i=0; i<10; i++){
    valori[i] = analogRead(PIN);
    delay(Array); 
  } 
  somma = 0; 
  for(int i=0; i<10; i++)
  somma = somma + valori[i];
  media = somma / 10;

questo e' un codice di esempio preso da questo forum, puo' andare?
(l'unico problema e' , se all'atto dell'accensione la somma e' uguale a zero, o e' fluttuante)

Secondo voi quale sarebbe piu funzionale visibile ed esteticamente bello, quello a barre su LCD o con il segno %

Fai un array di 20 elementi; ogni secondo scrivi un elemento e fai la media di tutti.
Una cosa del genere:

uint32_t t_letture; // Per salvare millis() per la lettura periodica.
uint16_t letture[20]; // Array circolare per il calcolo della media continua.
uint16_t carburante; // Valori parziali e valore finale del livello del carburante.

void loop()
{
if (millis()-t_letture>=1000) // Una volta al secondo:
  {
  static uint8_t n=0; // Indice delle letture del carburante da 0 a 19.
  analogRead(PIN_SENS_CARB); // Prima lettura scartata (probabilmente, facendo una lettura al secondo, non porta miglioramenti).
  letture[n]=analogRead(PIN_SENS_CARB);
  if(++n>19) n=0; // Grazie, Salvorhardin!
  carburante=0;
  for(uint8_t z=0; z<20; z++) {carburante+=letture[z];}
  carburante=carburante/20+.5; // Lo 0,5 aggiunto è per l'approssimazione del valore troncato dalla variabile intera.
  t_letture+=1000; // Aggiorna t_letture per la lettura successiva dopo 1s.
  }
}

Trappola d'aria + pressostato, come fanno le lavatrici?

Ciao, Ale.

Non risentirebbe delle variazioni di temperatura secondo te?

1 Like

Forse meglio
if(++n>19) n=0;

Prima calcolo e dopo confronto
Altrimenti arrivo a 20, non 19

O sbaglio?

1 Like

Avevo il dubbio... È la prima volta che uso quella forma.
Grazie!