[Arduino] Régulation pac
#21
Mapf est la fonction de substitution de map, elle est présente dans le code que j'ai mis plus haut sous le setup() donc tu as déjà le code complet
je n'ai rien rajouté depuis, juste fait des modifs sur l'affichage du LCD.


C'est pas le capteur qui est non linéaire, c'est la pression du gaz en fonction de la température, s'balo x)

   
T'as un problème, t'veux un ban ?  Ohgod
Répondre
#22
Ah, c'est une fonction maison.

Ok, déjà premier problème: la fonction prend que des float et tu passes des entiers pour les trois premiers paramètres; essaie ça mapf((float) Capteur_BP, 102.0, 1023.0, 0.0, 9.8)

Ensuite je te conseille de remplacer ça return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; par ça return (((x - in_min) * ((out_max - out_min) / (in_max - in_min))) + out_min); juste histoire d'être sûr que le compilo fasse pas des optis à la con qui changent la précédence (surtout que les float ne sont pas natifs sur l'arduino donc leur comportement est à prendre avec des pincettes).

Dis moi si ces deux modifs résolvent le pb. Sinon donne-moi des exemples de valeur d'entrée et ce que tu obtiens en retour histoire que je comprenne ce qui ne va pas si y'a toujours le pb.

Ah ok, mais pourquoi tu veux extrapoler la pression à partir de la temp si t'as déjà des capteurs de pression ?

Et théoriquement PV = nRT donc la relation est linéaire, pourquoi est-ce que ce n'est pas le cas ici ?
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
Répondre
#23
En fait la fonction mapf est basé sur la formule de map, le mec avait juste rajouté des float pour que ça prenne en charge les virgules mais
pour le coup ça a un comportement anormal ... Je verrais pour faire des essais demain soir.

Et en guise d'exemple, avec le code cité en spoiler, il m'affichait 1.38bars pour 2bars réel malgré une lecture correcte de la tension, échelle foireuse
vu que quand je m'étais le signal à la masse j'avais bien 0 d'affiché et quand je le mettais au +5V j'avais bien la valeur max, zarb ^^'.


Le capteur de pression me renvoie un signal entre 0.5V et 5V, je dois donc le convertir pour connaitre la pression et la température lue par celui-ci
afin de pouvoir calculer la surchauffe, tout ça, mais comme tu peux le voir sur la courbe orange, la pression réelle n'est pas linéaire en fonction de la temp.

Donc point de vue matériel c'est linéaire, point de vue chimique ça ne l'est pas, du moins côté température.


Pièces jointes
.xlsx   Table-Thermodynamique-R134a.xlsx (Taille : 17.81 Ko / Téléchargements : 2)
T'as un problème, t'veux un ban ?  Ohgod
Répondre
#24
Oui mais ce qui compte c'est la valeur que tu passes en paramètre, pour le moment on s'en fou de savoir si ça correspond à la valeur physique, ce qui compte c'est que la valeur retournée soit cohérente avec celle que tu passes (parce que le pb peut venir d'ailleurs, au hasard le capteur). Donc print la valeur passée et le retour, et ce pour plusieurs cas.

Ah oui, c'est vrai que j'avais oublié qu'on était pas en static et qu'en plus y'a une phase liquide, du coup PV = nRT sert à rien ici.

Pourquoi tu ne mets pas un capteur de température dans ce cas ?
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
Répondre
#25
J'ai pas l'impression que tu lise ce que je marque ... les capteurs de pression sont bon et si je met 0 a la place de 102
pour la valeur in_min j'ai la bonne pression affichée sur l'arduino, c'est comme si 102 me faisait un décalage dans le
mauvais sens et c'est la la question.

Et pas de sonde de temps car solution peu fiable dans ce genre d'application donc il me faut la conversion.
T'as un problème, t'veux un ban ?  Ohgod
Répondre
#26
Ben nul part t'as marqué que le 102 était la source du pb. Et ce que je disais reste valide de toute façon, pour débuguer il me faut ce que tu passes à la fonction et ce qu'elle retourne.

T'as testé avec les modifs que j'ai posté plus haut ?

Ah ok, dommage, il va falloir que tu fasses des maths, y'a pas trop le choix visiblement.
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
Répondre
#27
Si Si ... Pas faute d'avoir indiquer que y'avais un problème avec l'une et pas l'autre Siffle

Citation :Si je met "mapf(Capteur_BP, 102, 1023, 0.0, 9.8)", ça me renvoie une pression complètement bidon par contre si je
met "mapf(Capteur_BP, 0, 1023, 0.0, 9.8)" j'ai la bonne pression.

=> mapf(Capteur_BP, 0, 1023, 0.0, 9.8)

Capteur_BP = Entrée analogique arduino 0 - 1023
102 = Début de lecture de la pression ( 0bars mini )
1023 = Fin de lecture de la pression ( 9.8bars maxi )
0.0 = Pression mini après conversion
9.8 = Pression maxi après conversion

Que ce soit le BP ou le HP, il y aura une tension minimal de 0.5VDC, c'est la tension de "présence" pour que la
carte puisse diagnostiquer un défaut de capteur et le signaler, donc 0.5V = 0bars relatif = Patmo.


Et non j'ai pas encore tester tes exemples, je bosse aussi la journée Siffle

Edit : Résultat identique avec les parenthèses en plus
T'as un problème, t'veux un ban ?  Ohgod
Répondre
#28
Ok, ça j'avais compris, ce que je te demande c'est de fournir les valeurs de Capteur_BP et les retours de la fonction qui vont avec pour les cas qui posent problème, je ne peux pas dire ce qui ne va pas sans ça. C'est comme si tu vas chez le docteur en disant que t'as un pb mais que tu le laisse pas t'ausculter... il va pas pouvoir faire grand chose.

Je m'en doutais un peu pour les parenthèses, c'est par sécurité; ne jamais présumer, toujours vérifier Smile
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
Répondre
#29
Je vois pas ce que tu veux de plus pour le Capteur_BP, c'est une valeur qui va de 102 à 1023 donc 0.5 à 5V ... Comme il est
sur la pac je le simule avec un potar pour faire la variation dont j'ai besoin donc pas ce soucis de ce côté.
T'as un problème, t'veux un ban ?  Ohgod
Répondre
#30
Je ne veux pas la plage, je veux une valeur, et le retour associé, quand le pb est présent.

Par exemple tu envoies 556 et tu te retrouves avec 7.4 alors que tu devrais te retrouver avec 3.7 (valeurs totalement au hasard, juste pour l'exemple), ça c'est ce que je veux.
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
Répondre
#31
Bon ... J'ai l'impression que ça vient de l'arduino chinoise qui se mélange les pinceaux ...

N'obtenant pas de résultat je me suis fait mon propre calcul à ma façon, ça marche bien pour la BP mais pas pour la HP bizarrement
pourtant c'est le même, mais j'ai remarqué que des fois mes valeurs étaient faussées sans raison d'où le doute sur la carte.

Du coup demain je vais passer sur une arduino mega officiel pour voir.


Ah et aussi concernant les capteurs j'ai fait mon lolox, apparemment c'est des capteurs absolus ce qui expliquerait ma prise de tête ... ( +1bars )
du coup ça ce trouve le 0.5V c'est ça, faudrait que je tire au vide avec le compresseur pour confirmer ça ...
T'as un problème, t'veux un ban ?  Ohgod
Répondre
#32
Mouais, j'y crois pas trop, un CPU soit ça marche soit ça marche pas, surtout s'il aussi simple que celui d'un arduino. Et j'ai déjà utilisé des arduino chinois, mise à part le fait que la fréquence du quartz était pas exactement l'originale (du coup ça fausse la durée des timers mais osef pour ce que j'en fais) ils marchent correctement. J'ai aussi des pro mini chinois qui marchent également sans souci et n'ont pas un seul pb.

T'as peur de me donner les valeurs ou quoi ? je comprends pas ce qu'il y a de compliqué dans ce que je demande Spamafote
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
Répondre
#33
Sert à rien que je te file des valeurs si la base de l'hardware n'est pas la bonne c'est tout, tu va pas chercher un problème dans le script
si il vient en fait d'ailleurs. Redface
T'as un problème, t'veux un ban ?  Ohgod
Répondre
#34
Comme tu veux Wink
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
Répondre
#35
Bon le problème est en effet hardware mais aussi logiciel ... J'ai des pertes assez importantes à cause de tous les fils avec
leurs résistances internes et mauvais contact du coup ça fausse les mesures derrières ... ( chute tension, toussa )

Du coup j'ai également contrôlé les capteurs de pression, ce sont bien des capteurs électronique car les valeurs ohmique
ne changent pas en fonction de la pression, au final le capteur BP est prévu pour aller en dépression jusqu'à 0.2V mais pas
le capteur HP ( je suppose )  ce qui serait logique et par contre les deux font une lecture en pression absolue. ( 0.2V à -0.95bars relatif )

J'ai essayé d'étalonner les échelles en 3 points à partir du mini, maxi et d'un point mesuré en réel mais c'est pas vraiment conclulant
à croire que ce n'est pas linéaire non plus ... Difficile à vérifier sans les démonter.


Et le code à jour, plus pour moi ça Siffle
Code :
#include <Stepper.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

// Définition des pins utilisés par le Shield LCD
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

#define ONE_WIRE_BUS 6 // Définition de la valeur du BUS OneWire
OneWire oneWire(ONE_WIRE_BUS); // Définition du BUS OneWire
DallasTemperature sensors(&oneWire); // Conversion OneWire > DallasTemperature

// Adressage des sondes DS18B20 ( Evap, surchauffe )
DeviceAddress Sonde_SR = { 0x28, 0xC2, 0x75, 0x82, 0x05, 0x00, 0x00, 0xBB };
DeviceAddress Sonde_SC = { 0x28, 0xFF, 0xEC, 0x99, 0x3C, 0x04, 0x00, 0x9F };

float Surchauffe = 6.5;
float Surchauffe_cal;
int Position_det = 0;
float Temp_BP = 0;
float Temp_HP = 0;
int Pin_Capteur_BP = A4;
int Pin_Capteur_HP = A5;
int Capteur_BP;
float Capteur_BP_Out;
int Capteur_HP;
float Capteur_HP_Out;

// initialize the stepper library on pins 2 through 5:
Stepper myStepper(480, 2, 3, 4, 5);

void setup() {
  //analogReference(EXTERNAL);
 
  // Initialisation écran
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Initialisation");
  delay(500);
 
  // initialize the serial port:
  Serial.begin(9600);

  // Configuration des sondes DS18B20
  sensors.begin();
  sensors.setResolution(Sonde_SR, 10);
  sensors.setResolution(Sonde_SC, 10);

  // Nombre de tour/min détendeur
  myStepper.setSpeed(4);

  // Fermeture détendeur
  lcd.setCursor(0,1);
  lcd.print("Ferm EEV > 0%");
  //myStepper.step(-500); // 480 + 20 ( sécu )

  delay(3000);
 
  // Ouverture détendeur 50%
  lcd.setCursor(0,1);
  lcd.print("Ouv EEV > 50%");
  //myStepper.step(+240);
  Position_det = 240;

  delay(3000);
}

void loop() {
  // Récupération des températures
  sensors.requestTemperatures();

  int Tension_Analog = map(A1, 0, 1023, 0, 4920);
 
  // Récupération pression BP
  Capteur_BP = analogRead(Pin_Capteur_BP);

  int Tension_BP = map(Capteur_BP, 0, 1023, 0, 4920);
  float Capteur_BP_Out = (float)map(Tension_BP, 0, 4920, 0, 98) / 10;
  Serial.println("CAPTEUR BP");
  Serial.println(Capteur_BP);
  Serial.println(Tension_BP);
  Serial.println(Capteur_BP_Out);
  Serial.println("-----------");
 
  // Conversion Pression/température BP
  float Temp_BP_Out = (float)map(Tension_BP, 0, 4920, -13, 42.30);

  // Récupération pression HP
  Capteur_HP = analogRead(Pin_Capteur_HP);
 
  int Tension_HP = map(Capteur_HP, 0, 1023, 0, 4920);
  float Capteur_HP_Out = (float)map(Tension_HP, 160, 4920, 0, 343) / 10 - 1;
  Serial.println("CAPTEUR HP");
  Serial.println(Capteur_HP);
  Serial.println(Tension_HP);
  Serial.println(Capteur_HP_Out);
  Serial.println("-----------");
 
  // Conversion Pression/température HP
  float Temp_HP_Out = (float)map(Tension_HP, 0, 4920, 10, 92.75);
 
  delay(250);

  // Attribution des valeurs
  float Sonde_SR = sensors.getTempCByIndex(0);
  float Sonde_SC = sensors.getTempCByIndex(1);

 
  Surchauffe_cal = Temp_BP + Surchauffe;

  // Action si Surchauffe_Réelle supérieur à Surchauffe_Calculée
  if (Sonde_SC > Surchauffe_cal && Position_det < 480)
  {
    myStepper.step(+1); // Ouverture détendeur
    ++Position_det;
  }
 
  // Action si Surchauffe_Réelle inférieur à Surchauffe_Calculée
  else if (Sonde_SC < Surchauffe_cal && Position_det > 10)
  {
    myStepper.step(-1); // Fermeture détendeur
    --Position_det;
  }
  else {
    // Rien
  }

  int bouton = analogRead(A0);
 
  // Affichage LCD alterné
  if (bouton > 900)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Te:");
    lcd.print(Temp_BP_Out);
    lcd.setCursor(8,0);
    lcd.print("Tc:");
    lcd.print(Temp_HP_Out);
    lcd.setCursor(0,1);
    lcd.print("SC:");
    lcd.print(Sonde_SC - Temp_BP_Out);
    lcd.setCursor(8,1);
    lcd.print("SR:");
    lcd.print(Temp_HP_Out - Sonde_SR);
   
  }
  else {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Pe:");
    lcd.print(Capteur_BP_Out);
    lcd.setCursor(8,0);
    lcd.print("Pc:");
    lcd.print(Capteur_HP_Out);
    lcd.setCursor(0,1);
    lcd.print("Pos det:");
    lcd.print(Position_det);
  }
 
  delay(250);
}
T'as un problème, t'veux un ban ?  Ohgod
Répondre
#36
T'as pas les specs de tes capteurs ? parce que ça aiderait pas mal quand même Tongue
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
Répondre
#37
Tu crois que je me ferais chier à essayer de deviner la plage si c'était le cas ? T'as juste la pression et une ref sans résultat de mémoire Siffle

Sur ce genre de bécane ils sont très avares en référence pour quoi que ce soit, c'est déjà un miracle que j'ai retrouvé celle du détendeur
qui m'a été d'une grande aide ...
T'as un problème, t'veux un ban ?  Ohgod
Répondre
#38
T'as une marque et/ou un modèle/ref ?

Bon après l'avantage d'un capteur de pression c'est que c'est pas très dur à caractériser soi-même, faut juste un mano potable et de quoi créer la pression voulue. Rentre les données sur excel et trace la courbe, tu verras tout de suite si c'est linéaire et si ça l'est pas tu pourras sortir l'équation facilement pour compenser en soft Wink
Congratulations !!! You've just created a temporal loophole... Mon site | Mon forum
Répondre
#39
J'verrais demain avec la ref dessus mais de mémoire ça avait rien donné, pas de marque ou autre.


J'aimerai ne pas en arriver là car ça m'impose de récupérer le fluide pour démonter les capteurs ... Redface
T'as un problème, t'veux un ban ?  Ohgod
Répondre
#40
Jamais vu de transducteur de pression avec une réponse non linéaire en clim/réfrigération.

Pour tes chutes de tension et autre, c'est en partie pour ça que je conseillais de partir sur du 4-20 mA au lieu d'une référence de tension : tu t'affranchis de ces pertes en lignes. De plus il est plus commun de trouver du 4-20 mA que du 0-5V ou du 0-10V. De plus ça te permet de détecter en soft si le capteur ou la ligne merde, puisque l'échelle de pression démarre à 4 mA.

Si ce sont des capteurs absolus ( c'est souvent le cas ça serait pas étonnant ) ils devraient tout les deux avoir leur plage qui débutent vers 0 bar absolu, le capteur HP serait juste moins précis en dessous de Patm, c'pas trop un souci.
Répondre