[MATH] Cuve cylindrique horizontale [RESOLU]

Bonjour a tous,

En désespoir de cause, je sollicite l'âme charitable qui voudras bien m'aider!

pour mon projet domotique, j'ai besoin de calculer le volume d'eau approximatif restant dans ma cuve de récupération d'eau de pluie.

Pour cette fonction, j'utilisais un script python qui ne fonctionnait pas toujours d'on la source était ici.

Je souhaite intégrer ce calcul a mon arduino pour faciliter le calcul du pourcentage.
Mon problème est que je ne sais pas convertir ceci correctement. voici ce que j'ai fait et qui me retourne toujours 0:

appel de la fonction : volume = volcuve((int(distance)/10),145,3400);

  float volcuve( float h,float d, float vt){

boolean nivhaut;
float sh, sa, sr,alpha , r,v,pi,st;    
    
    // """volcuve(h,d,vt): Calcule le volume restant de liquide d'une cuve cylindrique horizontale de diamètre d et de volume total vt"""
    if (h==0)
    {
        return 0;
    }
    r=d/2;
    if (h==r)
    {
        return vt/2;
    }
    if (h==d)
    {
        return vt;
    }
    if (h>r)
    {
        h=d-h;
        nivhaut= true;
    }
      else
      {
        nivhaut= false;
        st=pi*r*r;
        alpha=acos((r-h)/r);
        sr=(r-h)*sqrt(r*r-(r-h)*2);
        sa=st/pi*alpha;
        sh=sa-sr;
        v=vt*sh/st;
      }
    if (nivhaut)
    {
      v=vt-v;
    }
    return  v;

}

J'ai besoin de travailler sur les pourcentages pour déclencher mes actions mais je ne peut pas établir la relation entre volume restant et pourcentage si je ne parviens pas a calculer le volume restant.
Je ne sais pas ce qui ne vas pas il me semble que j'ai respecté la source dans ma conversion ... Est-ce qu'un Arduineur peut m'aider? Ou si vous savez où trouver cette fonction je vous en serait très reconnaissant.
Merci pour votre aide

Bonjour,
La surface de ton secteur hachurée est :

SurfSecteur = 1 / 2 * r^2 * (2*alpha - sin(2*alpha)) avec alpha en radian

Pour calculer ton volume en pourcentage, il nous faut uniquement le diamètre de la cuve (d) ou le rayon et la hauteur du liquide h.

float volCuve(float h, float d){
  //surfaceSecteur = 1/2*r**2*(2*alpha - sin(2*alpha))
  float r = 0.0;
  float alpha = 0.0;
  float volPourc = 0.0;
  r = d/2; 
  alpha = acos(r - h) / r;
  volPourc = (1/2*pow(r,2)*(2*alpha - sin(2*alpha)))/(3.14159*pow(r,2))*100.0;
//ceinture et bretelles
  if(volPourc <= 0.0)
    volPourc = 0.0;
  else if(volPourc > 100.0)
    volPourc = 100.0;
  return volPourc;
}

Salut;
Je suis nouveau en Arduino;
Je vais essayer de t'aider.*

L' Arduino et une puissante calculatrice => Tu devrais essayer de construire ta propre fonction celle ci me parais compliqué.
Tu as deux données constantes le diamètre du réservoir et sa hauteur total =qui te donne le volume total.

La seul variable et la hauteur d'eau.

Tu crée donc trois constante "int" l'une pour le rayon l'autre pour la hauteur et la suivant pour la hauteur d'eau.
Ajoute la variable "Pi" également.
Puis tu les utilisent pour construire la formule( "Pi*r au carré)*hauteur d'eau => qui te donne le volume d'eau dans le réservoir.
Ensuite tu fait le rapport entre le contenu nominal du réservoir pour établir la relation en %.

Et voila Icar a tout dit même fait!
Merci!

Merci pour vos réponses.

J'ai essayé ceci sur mon arduino mais je reçois "nan" lorsque je fais un Serial.print(alpha)!

Ai-je omis un autre include que math.h?

Est-ce normal avec h=45.67 et d =145 ?

Ce calcul n'est-il pas plus adapté a une cuve cylindrique verticale?
La mienne est horizontale...

Merci

oxedgar:
Ce calcul n'est-il pas plus adapté a une cuve cylindrique verticale?
La mienne est horizontale...

Merci

bonsoir
Appréciant Icare , je sais qu'il n'aura pas là confondu les formules selon les orientations dimensionnelles , surtout si elles ne sont pas nécessaires. :grin:

ton problème est tres surement situé ailleurs :sunglasses:

Bonjour
Vu que l'on a une cuve dont on connaît toutes les dimensions, pourquoi ne pas créer une table qui donnerait en fonction de la hauteur directement le volume contenu ou le % de volume.
Pour une cuve de 1 m de diamètre cent entrées suffisent. Soit une entrée tous les cm de hauteur. les valeurs intermédiaires sont calculées en considérant qu'entre deux entrées consécutives, la variation est linéaire (l'erreur est minime) : sur le dessin, on considère que la surface entre deux hauteurs est un trapèze.
Pour la mesure de hauteur il existe des sondes capacitives (idéales avec de l'eau). Des schémas sont parus dans certaines revues d'électroniques.

A+

Bonjour a tous
C'est un sujet qui m’intéresse. J'ai également une cuve a fioul enterré dans le jardin que j'ai convertie en récupérateur d'eau de pluie.

Pour la mesure de hauteur il existe des sondes capacitives (idéales avec de l'eau). Des schémas sont parus dans certaines revues d'électroniques.

Pourrais-je avoir plus d'info la dessus ?
Merci

a+

Yep!

+1 pour Icare.

L'idéal est de réaliser les calculs dans un tableur et de n'utiliser que les valeurs jugées nécessaires (seuil à 10%, 25%, 50%, etc).

caape:
C'est un sujet qui m’intéresse. J'ai également une cuve a fioul enterré dans le jardin que j'ai convertie en récupérateur d'eau de pluie.

Je ne sais pas s'il existe de tel type de sonde interfaçable avec un arduino. Généralement, on utilise dans l'industrie des sondes capacitives pour détecter la présence d'un corps autre que ferreux (sonde inductive pour les métaux ferreux), comme les plastiques, liquides, etc.

N'as-tu pas un jauge sur ta cuve ?

@+

Zoroastre.

N'as-tu pas un jauge sur ta cuve ?

J'en avais une quand j'ai acheté la maison. Mais pour vider et nettoyer la cuve, le gars a du couper les boulons a la disqueuse (même pas peur) et pour retirer la plaque, il a du plier le tube devenu inutilisable. Je précise que la jauge était déporté d'environ 5 mètres pour être à coté de la chaudière avec un fin tube de cuivre et que l'installation datait d'une 50aine d'année.

Donc je peux oublier le capacitif ?

Bonjour,
Non, je n'ai pas confondu cuve debout ou couché. Pour la surface du segment, il faut revoir le cours de géométrie.
Pour un résultat en %, on n'a rien à faire du volume puisque le volume est proportionnel à la surface du segment.
Test du programme :

h = 0.0 - d = 1000.0
Volume = 0.0 %

h = 250.0 - d = 1000.0
Volume = 19.6 %

h = 500.0 - d = 1000.0
Volume = 50.0 %

h = 750.0 - d = 1000.0
Volume = 80.4 %

h = 1000.0 - d = 1000.0
Volume = 100.0 %

Et le petit programme qui fait cela :

void setup(){
  Serial.begin(115200);
  Serial.print("h = 0.0");
  Serial.println(" - d = 1000.0");
  Serial.print("Volume = ");
  Serial.print(volCuve(0.0, 1000.0),1);
  Serial.println(" %");
  Serial.println();
  Serial.print("h = 250.0");
  Serial.println(" - d = 1000.0");
  Serial.print("Volume = ");
  Serial.print(volCuve(250.0, 1000.0),1);
  Serial.println(" %");
  Serial.println();
  Serial.print("h = 500.0");
  Serial.println(" - d = 1000.0");
  Serial.print("Volume = ");
  Serial.print(volCuve(500.0, 1000.0),1);
  Serial.println(" %");
  Serial.println();
  Serial.print("h = 750.0");
  Serial.println(" - d = 1000.0");
  Serial.print("Volume = ");
  Serial.print(volCuve(750.0, 1000.0),1);
  Serial.println(" %");
  Serial.println();
  Serial.print("h = 1000.0");
  Serial.println(" - d = 1000.0");
  Serial.print("Volume = ");
  Serial.print(volCuve(1000.0, 1000.0),1);
  Serial.println(" %");
  Serial.println();
}
void loop(){
  
}
float volCuve(float h, float d){
  //surfaceSecteur = 1/2*r**2*(2*alpha - sin(2*alpha))
  float r = 0.0;
  float alpha = 0.0;
  float volPourc = 0.0;
  r = d/2; 
  alpha = acos((r - h) / r);
  volPourc = ((pow(r,2)/2 * (2*alpha - sin(2*alpha))) / (3.14159*pow(r,2)))*100.0;
//ceinture et bretelles
  if(volPourc <= 0.0)
    volPourc = 0.0;
  else if(volPourc > 100.0)
    volPourc = 100.0;
  return volPourc;
}

@+

Oui en effet,

J'ai trouvé "l'erreur"! Au fait, après avoir essayé la formule dans visual studio, il s'est avéré qu'il n'était pas possible de donner un résultat déjà à la 1ère opération! C'est quant même dingue qu'il ne parviens pas a faire 1/2.

J'ai effectivement fait quelque chose qui ressemble a ce qu'à fait Icare dans son deuxième code et ça fonctionne maintenant... merci

Pour info , je mesure la distance entre le point le plus haut de ma cuve et le niveau d'eau avec un capteur ultrason. Puis je soustrais le résultat au diamètre (en tenant compte que le capteur est installé plus haut que le diamètre total dans la trappe de visite) de ma cuve pour obtenir la hauteur du liquide. Puis je fais la formule d'Icare.

De ce fait, en ayant le pourcentage, il est aussi facile de déduire approximativement le nombre de litres restants. pour ceux que ça intéresse.

Un grand Merci a Icare, je passe en résolu mais cela n'empêche pas vos commentaires.