Le forum a migré vers l'adresse suivante:

Forum

Masquer ce message

Simple-Duino Forum Index



[Résolu] Calcul avec virgules
Goto page: 1, 2  >

 
Post new topic   Reply to topic    Simple-Duino Forum Index -> Arduino & Électronique -> Questions
Previous topic :: Next topic  
Author Message
Tachro52
Débutant

Offline

Joined: 30 Nov 2013
Posts: 100
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Sun 22 Dec - 14:30 (2013)    Post subject: [Résolu] Calcul avec virgules Reply with quote

PublicitéSupprimer les publicités ?
Bonjour à tous. 


J'ai regardé sur pas mal de site, et on me dit qu'il faut utiliser les variables de type float ou double pour effectuer des calculs à nombre à virgules.


OK. 


Je fait donc une variable float nommée vir.


Dans le setup, je dit que vir vaut 4,8828125




Lorsque je lis la valeur de vir dans le moniteur série, j'ai 4 ??!


En fait il faudrait que lorsque l'entrée A0 est à 1024, que j'aie une variable à 5000, donc le calcul est de 1024*4,8828125 Wink


Danke schön !

EDIT : La solution était : Il faut utiliser des POINTS et non des VIRGULES lorsque l'on effectue ce genre de calcul Wink


Last edited by Tachro52 on Sun 26 Jan - 12:38 (2014); edited 2 times in total
Back to top
oneill
Débutant

Offline

Joined: 03 Jun 2013
Posts: 60
Masculin
Niveau d'éléctronique: Débutant

PostPosted: Mon 23 Dec - 12:01 (2013)    Post subject: [Résolu] Calcul avec virgules Reply with quote

essai avec ça:

Quote:

float vir = 4.8828125;
Serial.println(vir, 5); //le " ,5" format l'affichage de 5 chiffre après la virgule.





mais pour le calcul sa change rien, sa calcul quand même avec tout les chiffre.
Dit moi si sa ta aider ou pas.
bonne chance
Back to top
Tachro52
Débutant

Offline

Joined: 30 Nov 2013
Posts: 100
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Mon 23 Dec - 23:02 (2013)    Post subject: [Résolu] Calcul avec virgules Reply with quote

Tu crois que le calcul est effectué dans l'art alors que l'affichage est arrondi c'est ça ? Je te tiens au courant demain matin, merci  Okay
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Tue 24 Dec - 10:23 (2013)    Post subject: [Résolu] Calcul avec virgules Reply with quote

Mais j'ai bien relu et il existe la fonction map qui te permet de passer automatiquement de 0-->1024 à 0-->5000


Structure :
Quote:

int val = map(valdebase, 0, 1024, 0, 5000);



____________________________
http://simple-duino.com
Back to top
Tachro52
Débutant

Offline

Joined: 30 Nov 2013
Posts: 100
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Tue 24 Dec - 11:32 (2013)    Post subject: [Résolu] Calcul avec virgules Reply with quote

J'avais déjà vu cette fonction, mais je ne connaissais plus son nom...

Donc du coup c'est niquel.


Mais j'aurais de toute manières besoin de calculer avec des virgules Wink


Désormais, j'ai ma variable à 5000.


Il m'en faut une seconde qui soit égale à -0,002725+13,65 fois la première !


Donc utilisation de float ? 


Merci à vous Wink
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Tue 24 Dec - 11:53 (2013)    Post subject: [Résolu] Calcul avec virgules Reply with quote

ah oui et là c'est avec oneill qu'il faut que tu vois ...
____________________________
http://simple-duino.com
Back to top
Tachro52
Débutant

Offline

Joined: 30 Nov 2013
Posts: 100
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Tue 24 Dec - 12:47 (2013)    Post subject: [Résolu] Calcul avec virgules Reply with quote

oneill ? gnéé
Back to top
oneill
Débutant

Offline

Joined: 03 Jun 2013
Posts: 60
Masculin
Niveau d'éléctronique: Débutant

PostPosted: Tue 24 Dec - 14:20 (2013)    Post subject: [Résolu] Calcul avec virgules Reply with quote

salut donc si je comprend tu a ta première variable et ta deuxième variable. Et tu veux multiplier la deuxième par la première c'est bien ça ? 
Back to top
Tachro52
Débutant

Offline

Joined: 30 Nov 2013
Posts: 100
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Tue 24 Dec - 19:22 (2013)    Post subject: [Résolu] Calcul avec virgules Reply with quote

Ouai.
Je vais t'expliquer le contexte, je pense que ça pourra t'aider.
J'ai deux réservoirs d'air de 5 litres, commandés chacun par deux électrovalve, soit 4 EV au total. Chacun des deux réservoir possède son capteur de pression analogique.
Sur le premier réservoir, les commandes des électrovalves sont manuelles, c'est l'humain qui rempli/vide la capacité. La pression maximum de ce premier réservoir est détendue à 5bars, ce qui correspond à notre variable max de 5000.
Le second réservoir lui, en revanche, je dois le commander automatiquement à partir de ses deux électrovalves.
La pression résidant dans le second réservoir varie selon la préssion dans le premier : la formule qui lie les deux est y=-0,002725x+13,625
Normalement, à 5bars (x=5000) dans le premier réservoir, ça correspond à 0bars dans le second : -0,002725*5000 = -13,625, +13,625 = 0bar
à 4,5 bars dans le premier, on obtient 1,325 bars dans le second. (Il faudrait d'ailleurs transformer ce résultat en millier : 1325)

Le résultat de ce calcul on va l'appeler référence :
Plus la pression baisse dans le premier, plus la pression devrait augmenter dans le second.

Bien entendu il y a une limite, qui est 3,8bars dans le second, et cette limite est ici aussi fixée par un détendeur.

Deux condition seront utilisées :

Code:

if("capteur_réservoir_2" < "référence") 
{  
DigitalWrite(électrovalve alimentation HIGH) 

else if(capteur_réservoir_2" > "référence") 

digitalWrite(électrovalve échappement HIGH) 
}  
else  

digitalWrite(électrovalve alimentation LOW) 
digitalWrite(électrovalve échappement LOW) 
}



Voila, avec une marge d'erreur à ajouter due au temps de réaction de l'air, des électrovalve, au temps de détente de l'air dans un volume etc... je pense que +/- 150 seraient raisonnables.

Si tu le souhaite je peux ouvrir un projet Wink
Back to top
Tachro52
Débutant

Offline

Joined: 30 Nov 2013
Posts: 100
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Sat 28 Dec - 18:40 (2013)    Post subject: [Résolu] Calcul avec virgules Reply with quote

Salut à tous !

Sur le même sujet, problème "similaire"

En effet, le réservoir commandé électroniquement décrémente un compteur :
Plus la préssion sera importante dans le réservoir, plus la décrémentation devra être rapide,

j'ai souhaitais m'occuper de cette partie de décrémentation automatique variable cet après midi, mais je sèche encore sur le même sujet :
les calculs à virgules.

Déjà voici le code que j'ai fait en vain :


Code:

if(cf > 200)
{
  fnct = ((-0,3243*cf)+2032,4);
 
  if((millis()-freq10)>fnct)
  {
    regression = !regression;
    freq10 = millis();
  }
}


else
{
freq10 = millis()
}



Avec :

- CF directement lu sur l'entrée analogique A0, et grâce à notre bon admin, la valeur va de 0 à 5000
- fnct est une variable de type FLOAT (pour accepter les calculs à virgules...)
- freq10 une variable de type unsigned long, pour le temps.
- regression une variable de type boolean, une autre partie du programme se charge de la décrémentation lorsque régression == 1

Mais voila, lorsque je simule la montée en pression (grâce à un potentiomètre), fnct vaut 0, puis 1,0000 puis 2,0000, puis 3,0000 et enfin 4,0000. Et reste bloqué à 4.

Pourtant j'attends par exemple pour une pression de 200, un temps de 1960 ms environ ! pas 1,0000 !

help help help

Merci !
Back to top
oneill
Débutant

Offline

Joined: 03 Jun 2013
Posts: 60
Masculin
Niveau d'éléctronique: Débutant

PostPosted: Tue 31 Dec - 14:46 (2013)    Post subject: [Résolu] Calcul avec virgules Reply with quote

Dsl Tachro52 la peut pas t'aider mais il y aura surement quelqu’un qui peut.
Back to top
Tachro52
Débutant

Offline

Joined: 30 Nov 2013
Posts: 100
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Sat 11 Jan - 22:10 (2014)    Post subject: [Résolu] Calcul avec virgules Reply with quote

UP :

Dans quasi tous les programmes, je mettais une virgule et non un point, cela peut être la source de mon problème ?
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Sun 12 Jan - 10:59 (2014)    Post subject: [Résolu] Calcul avec virgules Reply with quote

En effet, je sais pas si cela a une incidence mais les anglais mettent des points au lieu des virgules, à essayer nan ?
____________________________
http://simple-duino.com
Back to top
Tachro52
Débutant

Offline

Joined: 30 Nov 2013
Posts: 100
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Sun 12 Jan - 12:17 (2014)    Post subject: [Résolu] Calcul avec virgules Reply with quote

Ouaip, le week-end prochain, promis Embarassed
Back to top
Tachro52
Débutant

Offline

Joined: 30 Nov 2013
Posts: 100
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Sat 18 Jan - 22:09 (2014)    Post subject: [Résolu] Calcul avec virgules Reply with quote

Bon, j'avais raison Bravo Bravo


Il faut placer des points et non des virgule.

Un essais avec la fonction f(x) = -0,0025x + 13,65

à 5000 on doit avoir 0
à 4500 on doit avoir environ 1,3 (exprimé en bar dans la vraie vie)

its OK !
Me reste plus qu'à transformer la plage 0 à 3,8 en ° servos !

Code =

Code:
#include <Servo.h>


const int relaistraction = 2;
const int desserage = 4;
const int serrage = 7;
const int marche = 8;
const int neutre = 12;
const int compresseur_marche = 13; // il reste à mettre compresseur sur direct, grand débit, et surcharge.

boolean QT;
boolean DG;
boolean SG;
boolean ZFPBN;
boolean ZFPBM;
boolean ZFPBIS;
boolean CPRAUTO;
boolean CPRDIRECT;
boolean GRANDEBIT;
boolean SURCHARGE;
boolean Z_FPB;

int CPRANALOG;
int GDANALOG;
int SURCHARGEANALOG;
int ISOLEANALOG;

int TEST; // TESTTTT
double calculobtenu; // TESTTTT
int calculfixe; // TESTTTT

void setup()
{
 pinMode(relaistraction, INPUT);
 pinMode(desserage, INPUT);
 pinMode(serrage, INPUT);
 pinMode(marche, INPUT);
 pinMode(neutre, INPUT);
 pinMode(compresseur_marche, INPUT);
 
QT = 0;
DG = 0;
SG = 0;
ZFPBN = 0;
ZFPBM = 0;
ZFPBIS = 0;
CPRAUTO = 0;
CPRDIRECT = 0;
GRANDEBIT = 0;
SURCHARGE = 0;
Z_FPB = 0;
 
calculfixe = 3.8; 
Serial.begin(9600);
 
 
}
 
void loop()
{
  QT = digitalRead(relaistraction);
  DG = digitalRead(desserage);
  SG = digitalRead(serrage);
  ZFPBM = digitalRead(marche);
  ZFPBN = digitalRead(neutre);
  CPRAUTO = digitalRead(compresseur_marche);
  CPRANALOG = analogRead(A0);
  GDANALOG = analogRead(A1);
  SURCHARGEANALOG = analogRead(A2);
  ISOLEANALOG = analogRead(A3);
  TEST = analogRead(A4);
 
 
 
  if(CPRANALOG > 1000)
  {
    CPRDIRECT = 1;
  }
  else
  {
    CPRDIRECT = 0;
  }
 
 if(ISOLEANALOG > 1000)
 {
   ZFPBIS = 1;
 }
 else
 {
   ZFPBIS = 0;
 }
 
 if(SURCHARGEANALOG > 1000)
 {
   SURCHARGE = 1;
 }
 else
 {
   SURCHARGE = 0;
 }
 
 if(GDANALOG > 1000)
 {
   GRANDEBIT = 1;
 }
 else
 {
   GRANDEBIT = 0;
 }
 
 
 TEST = map(TEST, 0, 1023, 0, 5000);
 calculobtenu = ((-0.002725*TEST)+13.65);
 
 if(calculobtenu > 3.8)
 {
   calculobtenu = 3.8;
 }
 
 Serial.print("TEST = ");
 Serial.println(TEST);
 Serial.print("calculobtenu = ");
 Serial.println(calculobtenu);
 
 
}
Back to top
Display posts from previous:   
Post new topic   Reply to topic    Simple-Duino Forum Index -> Arduino & Électronique -> Questions All times are GMT + 1 Hour
Goto page: 1, 2  >
Page 1 of 2

 
Jump to:  

Index | Xooit.com free forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB
Propulsé par Simple-Duino