Go Down

Topic: Arc en trigo (Read 379 times) previous topic - next topic

JLuc

YES ! Ça commence à venir, j'ai essayé avec V = 0.4 et V = 0.7 et la courbe change bien de coté.

Ce qui ne va pas en revanche, c'est que le haut de la courbe devrait atteindre 80° et elle atteint péniblement 40° avec V=0.4 et 23° avec V=0.7.

Si vous avez une idée sur la question...

Merci à tous.
@+ JLuc

JLuc

Bon ben cette fois c'est gagné, grâce à vous, merci beaucoup pour votre aide.

Code final qui fonctionne :
Code: [Select]

hChauffe = 80; // Point haut de la courbe de chauffe (loi de chauffe)
bChauffe = 10; // Point bas de la courbe de chauffe (loi de chauffe)
lChauffe = 4;  // Coefficient de linéarité (courbe linéaire ou logarithmique etc...)

float m = bChauffe - 10.0; // Position graphique, l'échelle verticale commence à 10
float d = hChauffe - bChauffe; // Différence entre température mini et maxi de chauffage
float h = ((225.0 / 80.0) * d) / 369.0; // Proportions graphique => 225 = pixels pour Y

float V = lChauffe / 10.0; // lChauffe / 10 (lChauffe Coef courbe => stocké entier)
float x = 0;
float y = 0;

for (i=369; i>=0; i--) { // Balayage de la largeur graphique (369 = pixels pour X)
  x = (1.0/369.0) * i;
  if (lChauffe == 5) {
    value = (h * i) + m; // Courbe linéaire
  } else if(lChauffe < 5) {
    y = (2.0-4.0*V) * pow(x, 2) + (4.0*V-1.0) * x;
    value = mapfloat(y, 0.0, 1.0, 10.0, 80.0);
    value = ((225.0 / 90.0) * value) + m;
  } else {
    y = (2.0-4.0*V) * pow(x, 2) + (4.0-4.0*V) * x;
    value = mapfloat(y, 0.0, 1.0, 10.0, 80.0);
    value = ((225.0 / 90.0) * value) + m;
  }
  TFTlcd.SetWaveformValue(pageID,9,1,value); // Point (plot(y) seulement)
  delay(10);
}
@+ JLuc

lesept

Une petite photo de l'écran pour les deux cas ? Ça fait toujours plaisir de voir des choses qui fonctionnent...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

68tjs

Je fais le coucou mais c'est pour la bonne cause.

Je n'ai pas retrouver dans quel fichier est défini la fonction map mais puisqu'elle traite des entiers ce devrait être :

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

J'ai des connaissances limités mais je pense avoir compris  qu'il n'est pas utile de renommer map.
Si le compilateur trouve sous le même nom de fonction plusieurs versions avec soit des types de variables différents soit un nombre de paramètre différent il saura très bien se débrouiller  et choisir la bonne version

Donc si en plus de la version "officielle" il trouve :

float map(float x, float in_min, float in_max, float out_min, float out_max)
{
 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Il se débrouillera tout seul comme un grand.
Inutile de créer un nouveau nom.

J'ai dit une connerie ?

JLuc

En fait j'ai parlé un peu vite, car avec une valeur V>0.5 ça ne fonctionnait pas, alors j'ai utilisé ça
y = (2-4*V) (1-x)^2 + (4*V-3) (1-x) +1 au lieu de y = (2-4*V) x^2 + (4-4*V) x et maintenant c'est sur, ça marche.
Pour les photos, je posterai demain car là j'ai essayé avec un petit appareil mais c'est très flou, j'essaie demain promis avec un go pro.

68tjs => intéressant, en tout cas à essayer et je pense qu'effectivement le compilateur se débrouille bien puisqu'il opte également pour la bonne librairie lorsque qu'un choix est à faire.
Perso j'utilise couramment dans mes programmes les fonctions utf8ascii au nombre de 3 et qui convertissent en fonction du besoin. Dans les classes de librairies c'est aussi très courant, alors pour map, je pense que ça doit marcher. Ceci dit, ça permet de faire la différence et une fois compilé il n'y a plus d'importance (si tu as programmé en assembleur tu vois de quoi je parle)

Les photos demain promis, merci à vous, je vais enfin pouvoir avancer.
@+ JLuc

kamill

#20
Jul 14, 2019, 06:39 pm Last Edit: Jul 14, 2019, 06:51 pm by kamill
Hello 68tjs,

Le source de map su trouve dans le fichier WMath.cpp qui sous Windows se trouve dans C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\WMath.cpp.

Non tu ne dis pas de conneries, on peut redéfinir map comme tu le suggères.
Le petit inconvénient est que si une partie des arguments est entier et un partie float quelle version le compilateur prendra? Je pense que le compilateur prendra la version float mais je n'en suis pas sur (est-ce normalisé?)
Il y a aussi le cas ou tous les paramètres sont entiers et on veut un calcul flottant. Sans doute qu'en forçant un paramètre en float ça marcherait, mais il faut y penser.

Une autre solution serait d'utiliser les template, comme ça la fonction pourrait prendre n'importe quel type.
Code: [Select]
template <class T>
T map(T x, T in_min, T in_max, T out_min, T out_max)
{
 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

JLuc

Comme promis la batterie est chargée, et voici donc 2 photos qui montrent le menu principal et ensuite le graphe modifiable avec V=0.3


Photos
@+ JLuc

lesept

A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

JLuc

Merci.
Il reste beaucoup à faire, mais l'hiver est encore assez loin...
lesept => Tout particulièrement merci pour ta formule. Je me débrouille en programmation, mais les maths quand on pratique pas souvent c'est loin derrière. Reste à optimiser tout ça et je peux avancer.
@+ JLuc

lesept

En fait j'ai parlé un peu vite, car avec une valeur V>0.5 ça ne fonctionnait pas, alors j'ai utilisé ça
y = (2-4*V) (1-x)^2 + (4*V-3) (1-x) +1 au lieu de y = (2-4*V) x^2 + (4-4*V) x et maintenant c'est sur, ça marche.
J'ai revu les calculs, et trouvé une erreur : au lieu de
Quote
y = (2-4*V) x^2 + (4-4*V) x
il fallait utiliser
Quote
y = (2-4*V) x^2 + (4*V-1) x
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up